Nie*_*and 3 database algorithm graph path-finding
我目前正在尝试实施我自己的公共交通路径查找器,以便通过电车/公共汽车等找到具有给定时间表的连接.所有数据都是由我生成的(只需在谷歌地图中添加停止坐标).多亏了它,我可以自由选择存储数据和处理数据的方式.整个运输网络由加权图表示.所以问题就出现了:如何将公共交通数据存储在标准SQL数据库中,以便通过某些选择的算法轻松处理?如何轻松地将其转换为时间扩展图形,以便简单的Dijkstra算法就足够了?
自从我写了一篇关于"只用公共交通工具可以在X分钟内获得多远"的学士论文,我可以分享一些关于你的问题的见解.
首先,忘记传统算法.去追求时间的人.什么适用于常规道路网络,完全失败的时间限制图.时间意识是一个问题,但还有更多你永远不会想到的常客
从你的绰号来看,我认为你能读懂德语.您可以在我的论文文档中阅读我对算法和数据库设置的分析. 第49页显示了数据库模型,第50页显示了内存模型.另请参阅第55-57页的参考资料(它们大多是英文版).
即使是时间感知的dijkstra也很慢.一个好的算法是RAPTOR(可以在这里找到带有示例的科学描述).RAPTOR利用时间表模式而不是受其阻碍.
RAPTOR的工作原理: 时间表主要包括车站(位置),乘坐(一列火车),站点(乘坐,时间,地点).猛禽的伎俩是将所有游乐设施组织成路线.路线可能只包含具有相同停靠顺序并且不会相互超越的游乐设施.通过这种方式,您可以乘坐与您的时间相匹配的路线,并省略检查同一路线上的所有其他乘坐路线(因为它们保证稍后到达).路线的数量相当小(我的数据中的因数为1000),而不是游乐设施的数量.此外,RAPTOR算法在"列车跳跃周期"中运行,这使得它能够准确地检查一个站点(dijkstra不能)并遵循
它是这样的:
reachableStations = (startStation,timeX)
for i=0; i < maxHops; i++ {
if( reachableStations contains targetStation)
finished!
usableRoutes = collect all routes leaving from reachableStations
reachableStations = follow all usableRoutes to the end
and collect stations for the next cycle.
keep station-time combos for each find.
}
Run Code Online (Sandbox Code Playgroud)
.
对于我的应用程序,我使用了RAPTOR的修改版本,我将其命名为REAS.它针对获取有关整个网络的数据进行了优化(而不是查找单个路径).你应该坚持使用RAPTOR.关于公共交通算法的关键学习之一是问题比看起来要困难得多.
我的应用程序可以在这里看到.它使用瑞士铁路公司(SBB和ZVV)的HAFAS数据,但目前数据仅来自2014年.计算本身很快,需要花费大量时间才能生成图形叠加.
如果您有更多问题,请随时与我联系(联系信息可在ttm.ti8m.ch上找到)