只是想分享我对这个问题的最后方法。这是大学项目的一部分,因此它可能不完全适合现实世界的使用。它必须相当快才能在Windows Mobile设备上运行。
我结束了使用4个表(SQLite)。一张桌子上保存着公共汽车的列表,另一张保留了一个车站清单。另一张桌子保留组合 - 哪些巴士停在某个特定的车站,以及哪个车站从该车站出发,需要多长时间(分钟)。所有组合都必须存储。最后一张表是一个简单的时间表。对于每一个车站,它都列出了每一站停靠的时间和时间(我将时间存储为整数值 - 14:34为1434,以便比较更快)。
我使用了一个双向宽度优先搜索算法。邻居站(可直接访问)被检索用于起始站和目的地站。如果这两个“图形”在一个电台上重叠,则有从A站到X站的路径。例如,从A站可以到达站点B,C,D,E(通过使用特定的总线)。从目标站X你可以直接到达N,C,Z。这两个图形在C站重叠。因此存在A→C→X的路径。如果在第一次迭代中找不到路径,则该算法继续并再次展开图(BFS)。
第一步没有考虑时间 - 这使得速度足够快。您只会列出可能的路径列表,并列出必须使用这些路径的总线列表。 在最后一步中评估时间,查看可能路径列表并检查公交车是否在特定时间内行驶(增加每次停车时间)。
在一个拥有250个车站和100多辆公共汽车/铁路的小城市里,这些方法最多可以进行3次更改(必须在旅程中更换公交车)。计算只需几秒钟。但我不得不将整个数据库加载到内存(字典)中以加快查询时间,因为查询时间过长。
我不认为这将适用于大型网络。但它适用于单个中小城市的公共交通工具。
[OSRM](http://project-osrm.org/)是一个基于C++的最短路径的开源路由引擎。你可能会觉得它很有用。 – 2015-10-23 13:13:03