[英]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 秒),因为首先一个一个地计算所有邻居,因为它不是“试图”通过其他方式到达目标目的地...
你能推荐我其他适合的算法吗?
我在看:
http://jboost.sourceforge.net/examples.html (我没看到
这里简单的例子......)
最好有(只是可选的东西):-选择最少数量的公共汽车更改或最少的时间-选择寻找替代方式的选项(如果旅行时间相似)
谢谢你的提示
听起来您正在寻找A* 。 它是 Djikstra 的变体,它使用启发式算法来加速搜索。 在某些合理的假设下,A* 是最快的最优算法。 只要确保始终与端点断开联系。
还有一些 A* 的变体可以在更短的时间内提供接近最优的路径。 例如,请参见此处和此处。
Bellman-Ford (如您的问题中所建议的那样)往往比 Djikstra 或 A* 慢 - 它主要用于存在负边权重时,而这里没有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.