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

时间:2012-09-30 21:31:49

标签: java algorithm graph-algorithm shortest-path

我在我的应用程序中使用稍微修改过的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秒),因为它不是“试图”通过其他方式“尝试”到达目标目的地,所以首先逐个计算所有邻居...... / p>

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

我在寻找:

拥有(只是可选的东西)会很棒: - 选择最少的公交车更换或最短的时间 - 选择替代方式(如果旅行时间相似)

感谢您的提示

3 个答案:

答案 0 :(得分:6)

也许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是一个多模式路由系统,只要我能看到,它应该与你的项目非常相似。

答案 1 :(得分:5)

听起来像是在寻找A*。它是Djikstra的变体,它使用启发式来加速搜索。在某些合理的假设下,A *是最快的最优算法。只需确保始终break ties towards the endpoint

还有A *的变体可以在更短的时间内提供接近最佳的路径。例如,请参阅herehere


Bellman-Ford (正如你的问题所示)往往比Djikstra或A *慢 - 它主要用于有负边缘权重时,这里没有

答案 2 :(得分:0)

A* algorithm对此非常有用;它通过使用启发式方法实现了更好的性能。

以下是一个简单的教程:http://www.policyalmanac.org/games/aStarTutorial.htm