Design-and-analysis-of-algorithms-shortest-paths

提供:Dev Guides
移動先:案内検索

DAA-最短経路

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

ダイクストラのアルゴリズムは、有向グラフ_G =(V、E)の単一ソース最短パス問題を解決します。ここで、すべてのエッジは非負です(つまり、各エッジ_(u、v)≥0 u、v)ЄE)。

次のアルゴリズムでは、最小のキーを持つノードを抽出する1つの関数 Extract-Min() を使用します。

Algorithm: Dijkstra’s-Algorithm (G, w, s)
for each vertex v Є G.V
   v.d := ∞
   v.∏ := NIL
s.d := 0
S := Ф
Q := G.V
while Q ≠ Ф
   u := Extract-Min (Q)
   S := S U {u}
   for each vertex v Є G.adj[u]
      if v.d > u.d + w(u, v)
         v.d := u.d + w(u, v)
         v.∏ := u

分析

このアルゴリズムの複雑さは、Extract-Min関数の実装に完全に依存しています。 最小検索関数が線形検索を使用して実装されている場合、このアルゴリズムの複雑さは O(V ^ 2 ^ + E) です。

このアルゴリズムでは、 _ Extract-Min()' 関数が最小のキーで _Q' からノードを返すmin-heapを使用すると、このアルゴリズムの複雑さをさらに減らすことができます。

頂点 19 をそれぞれ開始頂点と宛先頂点として考えてみましょう。 最初は、開始頂点を除くすべての頂点に∞のマークが付けられ、開始頂点に 0 のマークが付けられます。

Vertex Initial Step1 V1 Step2 V3 Step3 V2 Step4 V4 Step5 V5 Step6 V7 Step7 V8 Step8 V6
1 0 0 0 0 0 0 0 0 0
2 5 4 4 4 4 4 4 4
3 2 2 2 2 2 2 2 2
4 7 7 7 7 7 7
5 11 9 9 9 9 9
6 17 17 16 16
7 11 11 11 11 11 11 11
8 16 13 13 13
9 20

したがって、頂点 1 からの頂点 9 の最小距離は 20 です。 そしてその道は

1→3→7→8→6→9

このパスは、先行情報に基づいて決定されます。

パス

ベルマンフォードアルゴリズム

このアルゴリズムは、エッジの重みが負になる可能性のある有向グラフ G =(V、E) の単一ソース最短パス問題を解決します。 さらに、負の加重サイクルが存在しない場合、このアルゴリズムを適用して最短経路を見つけることができます。

Algorithm: Bellman-Ford-Algorithm (G, w, s)
for each vertex v Є G.V
   v.d := ∞
   v.∏ := NIL
s.d := 0
for i = 1 to |G.V| - 1
   for each edge (u, v) Є G.E
      if v.d > u.d + w(u, v)
         v.d := u.d +w(u, v)
         v.∏ := u
for each edge (u, v) Є G.E
   if v.d > u.d + w(u, v)
      return FALSE
return TRUE

分析

最初の for ループは初期化に使用され、 _ O(V)' 回実行されます。 次の for ループが実行されます| * ' V-1 '' | _O(E) *回かかるエッジを通過します。

したがって、Bellman-Fordアルゴリズムは O(V、E) 時間で実行されます。

次の例は、Bellman-Fordアルゴリズムが段階的に機能する方法を示しています。 このグラフにはネガティブエッジがありますが、ネガティブサイクルはないため、この手法を使用して問題を解決できます。

初期化時には、ソースを除くすべての頂点に∞のマークが付けられ、ソースには 0 のマークが付けられます。

グラフ

最初のステップでは、ソースから到達可能なすべての頂点が最小コストで更新されます。 したがって、頂点 a および h が更新されます。

更新済み

次のステップでは、頂点 a、b、f および e が更新されます。

次のパス

同じロジックに従って、このステップで頂点 b、f、c および g が更新されます。

頂点

ここでは、頂点 c および d が更新されます。

頂点の更新

したがって、頂点 s と頂点 d の間の最小距離は 20 です。

先行情報に基づいて、パスはs→h→e→g→c→d