只是想分享我對這個問題的最後方法。這是大學項目的一部分,因此它可能不完全適合現實世界的使用。它必須相當快才能在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