我在我的应用程序中使用稍微修改过的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>
你能推荐一些其他适合的算法吗?
我在寻找:
http://jboost.sourceforge.net/examples.html(我没看到 直截了当的例子......)
拥有(只是可选的东西)会很棒: - 选择最少的公交车更换或最短的时间 - 选择替代方式(如果旅行时间相似)
感谢您的提示
答案 0 :(得分:6)
也许A *算法?请参阅:http://en.wikipedia.org/wiki/A-star_algorithm
也许收缩等级?请参阅:http://en.wikipedia.org/wiki/Contraction_hierarchies。
收缩层次结构由非常好的,非常快的开源路由机(OSRM)实现:
和OpenTripPlanner:
A *由许多路由系统实现。只需使用Google进行搜索。
OpenTripPlanner是一个多模式路由系统,只要我能看到,它应该与你的项目非常相似。
答案 1 :(得分:5)
听起来像是在寻找A*。它是Djikstra的变体,它使用启发式来加速搜索。在某些合理的假设下,A *是最快的最优算法。只需确保始终break ties towards the endpoint。
还有A *的变体可以在更短的时间内提供接近最佳的路径。例如,请参阅here和here。
Bellman-Ford (正如你的问题所示)往往比Djikstra或A *慢 - 它主要用于有负边缘权重时,这里没有
答案 2 :(得分:0)
A* algorithm对此非常有用;它通过使用启发式方法实现了更好的性能。
以下是一个简单的教程:http://www.policyalmanac.org/games/aStarTutorial.htm