プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

グラフを通る最短経路を計算するダイクストラのアルゴリズム


定義

ダイクストラのアルゴリズムは、ソースノードと呼ばれる特定のノードから連結グラフ内の他のすべてのノードへの最短経路を見つけます。ソースノードをルートとする最短パスツリーを生成します。ルーティングコストを最小限に抑えることを目的として、最適なルートを生成するためにコンピュータネットワークで広く使用されています。

ダイクストラのアルゴリズム

入力-ネットワークを表すグラフ。およびソースノード、s

出力-ルートノードとしてsを使用した最短パスツリーspt[]。

初期化-

  • 距離の配列dist[] サイズの|V | (ノードの数)、ここで dist [s] = 0 およびdist[u] =∞(無限)。ここで、uはsを除くグラフ内のノードを表します。

  • 配列、 Q 、グラフ内のすべてのノードを含みます。アルゴリズムが完了すると、 Q 空になります。

  • 空のセット、 S 、訪問先ノードが追加されます。アルゴリズムが完了すると、 S グラフ内のすべてのノードが含まれます。

  • Qの間繰り返します 空ではない-

    • Qから削除します 、ノード、uの dist [u]が最小 これはSにはありません。最初の実行では、 dist [s] 削除されます。

    • uをSに追加し、uを訪問済みとしてマークします。

    • uに隣接するノードvごとに、dist[v]を-

      として更新します。
      • If( dist [u] +エッジの重みu-v 次に

        • 更新dist[v] =dist[u]+エッジの重みu-v

  • 配列dist[] sから他のすべてのノードへの最短経路が含まれています。

アルゴリズムの動作は、例を使用して最もよく理解できます。次のように重み付きエッジで接続された、AからGまでのノードがマークされた次のグラフについて考えてみます-

グラフを通る最短経路を計算するダイクストラのアルゴリズム

初期化は次のようになります-

  • dist [7] ={0、∞、∞、∞、∞、∞、∞}

  • Q ={A、B、C、D、E、F、G}

  • S𝑆=∅

パス1 −ノード Aを選択します Qから dist []が最も低いため 0の値 Aの隣接ノードはBとCです。アルゴリズムに従ってBとCに対応するdist[]値を更新します。したがって、データ構造の値は次のようになります-

  • dist [7] ={0,5,6、∞、∞、∞、∞}

  • Q ={B、C、D、E、F、G}

  • S ={A}

このパスの後の距離と最短経路を次のグラフに示します。緑のノードは、S-

にすでに追加されているノードを示します

グラフを通る最短経路を計算するダイクストラのアルゴリズム

パス2 −ノード Bを選択します Qから dist []が最も低いため 5の値 Sに入れます。 Bの隣接ノードはC、D およびE C、Dに対応するdist[]値を更新します アルゴリズムによるとE。したがって、データ構造の値は次のようになります-

  • dist [7] ={0,5,6,12,13、∞、∞}

  • Q ={C、D、E、F、G}

  • S ={A、B}

このパスの後の距離と最短経路は-

です。

グラフを通る最短経路を計算するダイクストラのアルゴリズム

パス3 −ノード Cを選択します Qから 最小のdist[]値が6であり、Sに配置されているためです。Cの隣接ノードはDとFです。DとFに対応するdist []値を更新します。したがって、データ構造の値は-

  • dist [7] ={0,5,6,8,13,10、∞}

  • Q ={D、E、F、G}

  • S ={A、B、C}

このパスの後の距離と最短経路は-

です。

グラフを通る最短経路を計算するダイクストラのアルゴリズム

パス4 −ノード Dを選択します Qから 距離[が最も低いため ] 値を8にして、Sに入れます。Dの隣接ノードはE、F、Gです。 dist []を更新します。 E、Fに対応する値 およびG 。したがって、データ構造の値は次のようになります-

  • dist [7] ={0,5,6,8,10,10,18}

  • Q ={E、F、G}

  • S ={A、B、C、D}

このパスの後の距離と最短経路は-

です。

グラフを通る最短経路を計算するダイクストラのアルゴリズム

パス5 −ノードEまたはノード Fのいずれかを選択できます Qから どちらもdist[]が最も低いため 10の値 E など、いずれか1つを選択します 、 Sに入れます 。 Dの隣接ノード Gです 。 dist []を更新します Gに対応する値。したがって、データ構造の値は-

になります。
  • dist [7] ={0,5,6,8,10,10,13}

  • Q ={F、G}

  • S ={A、B、C、D、E}

このパスの後の距離と最短経路は-

です。

グラフを通る最短経路を計算するダイクストラのアルゴリズム

パス6 −ノード Fを選択します Qから dist []が最も低いため 10の値 Sに入れます 。 Fの隣接ノード Gです 。 dist [] Gに対応する値は、 Fを介した値よりも小さくなります 。だからそれは同じままです。データ構造の値は-

になります
  • dist [7] ={0,5,6,8,10,10,13}

  • Q ={G}

  • S ={A、B、C、D、E、F}

このパスの後の距離と最短経路は-

です。

グラフを通る最短経路を計算するダイクストラのアルゴリズム

パス7 Qにはノードが1つだけあります 。 Qから削除します Sに入れます。dist[]配列を変更する必要はありません。さて、 Q 空になります、 S すべてのノードが含まれているため、アルゴリズムは終了です。どのルートのパスにも含まれていないすべてのエッジまたはルートを削除します。したがって、ソースノードAから他のすべてのノードへの最短パスツリーは次のようになります-

グラフを通る最短経路を計算するダイクストラのアルゴリズム


  1. データ構造における円のk-最短経路アルゴリズム

    単一の最短経路を与える代わりに、Yenのk-最短経路アルゴリズムは kを与えます 2番目に短いパスと3番目に短いパスを取得できるようにするための最短パス。 場所Aから場所Bに移動する必要があり、場所Aと場所Bの間に複数のルートが利用可能であるというシナリオを考えてみましょう。ただし、最短パスを見つけて、その観点からあまり考慮されていないすべてのパスを無視する必要があります。目的地に到達するための時間計算量。 例を挙げて理解しましょう- 与えられた例をBのピークを持つ橋と考えてください。誰かがAからCに橋を渡りたい場合、誰も橋を渡るためにピークに行くことはありません。したがって、Aか

  2. 0-1 CプログラムのBFS(バイナリウェイトグラフの最短経路)?

    いくつかのノードと接続されたエッジを持つグラフがあるとします。各エッジには2進の重みがあります。したがって、重みは0または1になります。ソース頂点が指定されます。ソースから他の頂点への最短経路を見つける必要があります。グラフが以下のようになっていると仮定します- 通常のBFSアルゴリズムでは、すべてのエッジの重みは同じです。ここでは、いくつかは0で、いくつかは1です。各ステップで、最適な距離条件を確認します。ここでは、両端キューを使用してノードを格納します。そこで、エッジの重みを確認します。 0の場合は前に押し、そうでない場合は後ろに押します。より良いアイデアを得るためにアルゴリズムを