繁体   English   中英

Dijkstra 算法替代方案 - 图中最短路径、公交路线

[英]Dijkstra algorithm alternatives - shortest path in graph, bus routes

我在我的应用程序中使用了稍微修改过的 Dijkstra 算法,但它很慢,我知道必须有更好的方法。 我的输入数据是巴士站,彼此之间有指定的行程时间(约 400 个节点和约 800 条路径,最大结果深度 = 4(最多 4 次巴士改变或什么都没有)。

输入数据(公交路线):

bus_id | location-from | location-to | travel-time | calendar_switch_for_today
XX | A | B | 12 | 1
XX | B | C | 25 | 1
YY | C | D | 5  | 1
ZZ | A | D | 15 | 0

dijkstraResolve(A,D, '2012-10-10') -> (XX,A,B,12),(XX,B,C,25),(YY,C,D,5) 
=> one bus change, 3 bus stops to final destination
* A->D cant be used as calendar switch is OFF

正如您可以想象的那样,在更复杂的图表中,例如主要城市(节点)确实与不同城市有 170 个连接,Dijkstra 速度较慢(~ 超过 5 秒),因为首先一个一个地计算所有邻居,因为它不是“试图”通过其他方式到达目标目的地...

你能推荐我其他适合的算法吗?

我在看:

最好有(只是可选的东西):-选择最少数量的公共汽车更改或最少的时间-选择寻找替代方式的选项(如果旅行时间相似)

谢谢你的提示

也许是 A* 算法? 见: http ://en.wikipedia.org/wiki/A-star_algorithm

也许收缩层次结构? 请参阅: http ://en.wikipedia.org/wiki/Contraction_hierarchies。

收缩层次结构由非常好的、非常快速的开源路由机 (OSRM) 实现:

http://project-osrm.org/

通过 OpenTripPlanner:

http://opentripplanner.com/

A* 由多个路由系统实现。 只需使用 Google 进行搜索。

OpenTripPlanner 是一个多模式路由系统,据我所知,应该与您的项目非常相似。

听起来您正在寻找A* 它是 Djikstra 的变体,它使用启发式算法来加速搜索。 在某些合理的假设下,A* 是最快的最优算法。 只要确保始终与端点断开联系

还有一些 A* 的变体可以在更短的时间内提供接近最优的路径。 例如,请参见此处此处


Bellman-Ford (如您的问题中所建议的那样)往往比 Djikstra 或 A* 慢 - 它主要用于存在负边权重时,而这里没有。

A* 算法很适合这个; 它通过使用启发式方法获得更好的性能。

这是一个简单的教程,可以帮助您入门: 链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM