web-dev-qa-db-ja.com

時間制限のあるグラフでの経路探索(ルーティング、旅行計画など)アルゴリズム

バス/電車/ ...の停留所と各日付の到着/出発時刻などのデータベースがあります。 2つの場所の間で最速(最短/最安/最短のトランジション)の旅行を検索する方法を探しています。将来的には、OpenStreetMapデータを使用して、停車地間や停車地から開始/終了までの歩行を行う任意の場所を設定したいと思いますが、当面は、データベース内の2つの停車地間のパスを見つけたいだけです。

問題は、この主題について多くの情報を見つけることができないように見えることです。たとえば、 このウィキペディアのページ テキストがたくさんあり、有用な情報がまったく含まれていません。

私が見つけたのは [〜#〜] gtfs [〜#〜] 形式で、 Google Transit で使用されています。私の街はパブリックデータフィードを提供していませんが(プライベートデータフィードも提供していません)、GTFSに含まれるすべての重要な情報をすでに持っているので、変換を行うのは簡単です。

OpenTripPlanner のように、 OpenStreetMap を使用して歩行者/車/自転車のルーティングを実行できるGTFSベースのソフトウェアがいくつかあります。

しかし、ルーティングコードは十分に文書化されておらず(少なくとも私が見つけたものから)、すべてを必要としません。

私が探しているのは、使用できるアルゴリズムの概要、それらのパフォーマンス、おそらくいくつかの擬似コードです。

したがって、質問はです。停車地、ルート、到着/出発/移動時間のリストが与えられた場合、停車地Aからの最速パスを簡単に見つけるにはどうすればよいですかBを止めるには?

26
lacop
  1. 問題を グラフ としてモデル化します。各ステーションは頂点になり、各バス/電車はエッジになります。
  2. 関数を作成するw:Edges->R、それは各エッジの時間/お金/ ...を示します。
  3. これで、典型的な最小経路問題が発生しました。これは、 ダイクストラアルゴリズム によって解決できます。このアルゴリズムは、特定のソースからすべての頂点への最小経路を見つけます。

(*)「最小遷移」の場合、重みは実際にはエッジごとに1であるため、 [〜#〜] bfs [〜#〜] を実行してこれを最適化することもできます。または、この post で説明したように、ダイクストラの代わりに 双方向 BFS [社会的距離について説明されていますが、実際には同じアルゴリズムです]。


[〜#〜]編集[〜#〜]
コメントで言及した[タイミングの]グラフの非静的な性質の編集として[価格と遷移​​の数については、これらのグラフは静的であるため、上記で述べたことが引き続き適用されます]。 距離ベクトルルーティングアルゴリズム を使用します。これは、実際には動的グラフで機能することを意味し、 ベルマンフォードアルゴリズム の分散バリエーションです。
アルゴリズムのアイデア:

  • 定期的に、すべての頂点はその「距離ベクトル」を隣接する頂点に送信します[ベクトルは、送信する頂点から他の頂点に移動するのにかかる「コスト」を示します。
  • そのネイバーはルーティングテーブルを更新しようとします[どのエッジを介して各ターゲットに移動するのが最適ですか]
  • あなたの場合、各ノードは隣接ノードに到達するための最速の方法[移動時間+待機時間]を知っており、[頂点/ステーション]は距離ベクトルの各メインディッシュにこの番号を追加して、目的地に到着するまでにかかる時間。バスが出発するとき、移動時間は[このソースから]すべてのノードに再計算され、新しいベクトルはその隣接ノードに送信される必要があります
16
amit