この問題に対する私の最終的なアプローチを共有したかっただけです。これは大学のプロジェクトの一部であったため、実際の使用には完全に適していない可能性があります。Windows Mobile デバイスで実行するには、かなり高速である必要がありました。
最終的に4つのテーブル(SQLite)を使用しました。1 つのテーブルにはバスのリストが保持され、2 つ目のテーブルには駅のリストが保持されます。別のテーブルには、特定の駅に停車するバスと、この駅からどこに行き、所要時間 (分) の組み合わせが保持されます。すべての組み合わせを保存する必要があります。最後の表は簡単な時刻表です。すべての駅について、そこに停車するすべてのバスと時刻がリストされます(比較のために高速化するために、時刻を整数値として保存しました-14:34は1434です)。
双方向の幅優先探索アルゴリズムを使用しました。始発駅、終着駅は隣接駅(直通)を検索します。これらの 2 つの「グラフ」がステーションで重なる場合、ステーション A からステーション X へのパスがあります。たとえば、駅 A から駅 B、C、D、E に行くことができます (特定のバスを使用)。目的地の駅 X からは、N、C、Z に直接行くことができます。これらの 2 つのグラフはステーション C で重なります。したがって、パス A -> C -> X が存在します。この最初の反復でパスが見つからない場合、アルゴリズムは続行され、グラフ (BFS) が再び展開されます。
最初のステップでは時間が考慮されていません。これにより、十分に高速になります。これらのパスを取るために使用する必要があるバスのリストを含む、可能なパスのリストのみを取得します。時間は最後のステップで評価されます。可能なパスのリストを調べて、バスが特定の時間内に移動するかどうかを確認します (停車ごとに時間を増やします)。
250 の駅と 100 以上のバス/鉄道がある小さな都市では、これらのアプローチは最大 3 回の乗り換え (移動中にバスを乗り換える必要がある場合) まで機能します。計算にかかる時間はわずか数秒です。しかし、時間がかかりすぎるクエリを高速化するために、データベース全体をメモリ (辞書) にロードする必要がありました。
ただし、これは大規模なネットワークでは機能しないと思います。しかし、単一の中小規模都市の公共交通機関では機能します。