自从我写了一篇关于“仅使用公共交通工具,你可以在多少时间内到达目的地”的学士论文后,我可以分享一些有关您问题的见解。
问题:
首先,忘记传统算法。选择时态感知算法。对于常规道路网络有效的算法,在时间限制图上完全失败。时间感知是一个问题,但还有许多其他问题,作为普通乘客,您永远不会考虑到这些问题。
1. 一些火车保证等待其他火车。
2. 切换火车(从A到B)时,您需要一些最小停机时间。
3. 停机时间取决于车站(大型或小型车站)和站台(从1号站台切换到2号站台比从1号站台切换到20号站台更快)。
4. 火车时刻表因日期而异,您的数据表中有许多条目与所选日期不适用。
解决方案
根据你的昵称,我猜你能够阅读德语。你可以在我的论文文件中阅读我的算法分析和数据库设置。第49页展示了数据库模型,第50页展示了内存模型。同时请查看第55-57页的参考文献(它们大多是英文)。
即使time-aware-dijkstra非常慢,但好的算法是RAPTOR(科学描述和示例可以在这里找到)。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.
}
.
对于我的应用程序,我使用了一个修改过的RAPTOR版本,我将其命名为REAS。它针对获取关于整个网络的数据进行了优化(而不是查找单个路线)。你应该只使用RAPTOR。
有关公共交通算法的主要经验教训之一是,问题比看起来要难得多。
我的应用程序可以在这里查看。它使用瑞士铁路公司(SBB&ZVV)的HAFAS数据,但目前的数据仅限于2014年。计算本身很快,花费大量时间的是生成图形叠加层。
如果您有更多问题,请随时直接与我联系(联系信息可在ttm.ti8m.ch上找到)。