最短パスアルゴリズム及び分析:ダイクストラ法、Floyed、ベルマン・フォード、SPFAアルゴリズム。

最短パスアルゴリズム:最短パスアルゴリズムは、グラフ理論、古典的なアルゴリズムの問題が検討されている;図は、2つのノード(ノードとなるパス)との間の最短経路を見つけることを目的。

:最短経路問題の開始点を決定公知の出発点、最短経路問題を。使用のためのダイクストラ法(単一始点最短経路)

グローバル最短経路問題: Floyed-ウォーシャルアルゴリズムに適した全ての図面への最短パスを見つける;(マルチソース最短パス)

単一始点最短経路:加重有向グラフG = V、Eが与えられると、各エッジは実数です。さらに、バック頂点集合V、指定されたソース、他のすべての頂点への最短経路の長さから算出するソース。これは、右側の各長さと道路という。この問題は、通常、単一始点最短経路問題と呼ばれます。

ダイクストラ法ダイクストラアルゴリズム使用して貪欲現在の選択を解決することは常に問題の最善の解決策であるという考え;、アルゴリズムは単一ソース最短経路問題を解くために使用される、負の重みを扱うことができないだけで、右の図について陽性であることができますが。アルゴリズムはS0開始から、貪欲な戦略を使用して、[I] S0最寄りからの最小のD [i]がある点I、未訪問Vを選択し、iは中間点のようである、私を介してアップデートは、ポイントに到達することができ最短距離は、貪欲に最も近い一点を見つけるために引き続き未訪問、アクセスポイントの全ては、アルゴリズムが終了し完了した後、N貪欲、出力の開始点と終了点との間の最短距離。

  • 初期化D [S0] = 0、それ以外のD [i]を= INF。
  • 後N貪欲、他のポイントへの出発点S0からの最短距離を見つけます。
  • 貪欲:
    • 最小の未訪問のD [k]を特定します。
    • Kは、フラグV [k]を訪問しています。
    • Kは、[V]、V kがDの他のを通して、出発点S0を更新するために、中間点のようである配列は、パストレース、どのノードから[V] = kから最短記録電流を更新することができます。
  • プリムのアルゴリズムと貪欲アルゴリズムの違い:
    • プリム法:マーカーのセットを更新するにはマーク間の距離に設定されていません。
    • ダイクストラ法:ソースの更新がマークされていないとの間の距離に設定されています。
  • ダイクストラのアルゴリズムが使用ヒープ最適化することができます:ヒープの最適化、コアダイクストラ法は、最初の最短距離を見つけ、その後、更新することで、最適化されていないとき、私たちは、サイクルを通じての最小距離を見つけるためにここにいる。我々は、最適化するために、プライオリティキューを使用することができます;はstd ::たPRIORITY_QUEUE容器アダプタを使用することができるC ++、ヒープ優先キューは、一般的に実装するために使用され、ヒープを最適化することが考えられます。

Floyedアルゴリズム: Floyedアルゴリズム、また、複数のソース図形の間の所定の重み付けへの最短パスを見つけるための動的プログラミングアルゴリズムの概念を利用し、補間点法として知られている、マルチソース方式が最短に得ることができ、負を扱うことができますケースの右側が、負ではない環、ダイナミックプログラミングアルゴリズムを使用するというアイデア。

  • セットD [i]は[J] [k]が唯一1,2、.. kの後jへのIを表す場合、これらのノードjへの最短経路I。次の2つの状況があります:
    • 点kの後:D [i]は[J] [K] = D [i]が[K] [K-1] + D [k]は[J] [K-1]。
    • 点kを通過しない:D [i]は[J] [K] = D [i]は[J] [K-1]。
  • 状態遷移式は、D [i]は[J] [K] =分{D [i]は[J] [K-1]、D [i]は[K] [K-1] + D [k]は[J ] [K-1]}
  • 境界条件:D [i]は[J] [0] [I] [J]、W =(W [i] [j]はエッジ、エッジ重みijの重みが正の無限大の不在を表す表します)
  • kがインクリメントされているため、D [i]は[J]が状態D [i]は[J] [K-1]に保存され、一次元、二次元アレイによって減少させることができます。
    • 状態遷移式:D [i]は[J] =分{D [i]が[K] + D [k]は[J]、D [i]は[J]}。
    • 境界条件:D [i]は[J] = W [i]は[J]。
    • 列挙kは、kはiからjまでの最短距離の中点を用いて更新されます。

ベルマン-フォード法:ベルマンフォードアルゴリズムは、単一始点最短経路アルゴリズムであり、ダイクストラアルゴリズムは、それが相対的に負の重みは条件について処理してもよいです:いいえ負環;シンプルが、時間複雑度が高い;があるかどうかを決定するために使用することができます負のループは、各ノードの開始点までの最短経路を更新し、各反復は、反復のn-1倍の場合(N-1は、エッジ6点の間に存在する)、再度、経路更新の反復がある場合、負のリングがあります。

アルゴリズム的思考:最短棒グラフのいずれかが、どちらも負のサイクルが含まれている、それは含まれませんn-1のエッジまでを含む、右のループです。最短のルート付きツリーを構成する最短経路、最短がある場合、ソース点sから開始して、ノードは、到達することができます。したがって、レベルの距離sのルートに応じて、層によって層が最短各点(緩和動作)に到達生成するためのプロセスは、最短経路ツリー作成処理であり、補助D [N]の配列およびV [N]を必要とすべてのD [n]の値のn番目の周期がループのうち、更新されない場合、サイクルN-1回と記録トラックのトレースまでの最短距離、エッジの視点から考察は、各エッジは、各反復を横切ります、n番目のパスの更新がある場合、負のリングの存在を示し、ベルマンフォードアルゴリズムは、最長パスを解決するために決定するために使用されてもよいn及び環、長いような選択された最大更新再帰関係のように、

アルゴリズムの実装プロセス:

  • 初期:DIST [U] = INF; DIST [S] = 0; sは、出発点です。
  • 再帰:各エッジについて(U、V)緩和操作; DIST [V] =分(DIST [V]、DIST [U] + [U] [V] W);(N-1緩和時間として動作) 
  • 最終的に、再循環時間、負の環が存在するか否かを判定する。

SPFAアルゴリズム: SPFA(最短パスの高速化アルゴリズム)、ベルマンフォードアルゴリズムは、上述した、アルゴリズムの時間複雑度が比較的高く、ベルマンフォードアルゴリズムは、各再帰必要がすべての側面をスキャンする再帰N回必要であるが、各弛みキューに入れていないキューのため、使用、更新から各時点;操作緩み側のすべてを必要としないが、ほんの短い緩和ポイントに接続されている最新の側面を見つける必要があり、各キューから取り出しましたこのようなリターンポイントとして頂点は、キューにない場合、それがエンキューされた頂点は、そのすべての隣接ノード緩和、緩和の成功は、そのような操作は、キューが空になるまでまで、繰り返される。回数は、Aノードエンキューする場合以上のn回、負のサイクルの存在を示す、計数のためにCNT [n]の配列を使用することができます。

アルゴリズムの実装プロセス:

  • 初期化:DIS [S] = 0; DIS [I] = INF;新しいキューエンキューソースノードS、S数字がエンキューされているを作成します。
  • uは、uはフラグをデキューされて最初のチームからのポイントを削除し、uは緩和操作をVエッジ点に接続され、かつ、キュー内のたるみが、その後、キューに入れvをvがあれば成功しません。
  • キューが空になるまで繰り返します。

時間の複雑さの解析:

  • Floyedアルゴリズム:マルチソース最短処理負荷側を求め、O(N3)の時間複雑。
  • ダイクストラ法:最短の単一のソースを求めて、負のエッジを処理できない、O(N 2)の時間計算;
  • ベルマンフォードアルゴリズム:単一ソース最短の処理負荷右側を求め、時間複雑性はO(NM)です。
  • SPFAアルゴリズム:最短の単一のソースを求めて、ベルマン-フォード最適化アルゴリズムのバージョンが負右側を扱うことができ、時間複雑性はO(KM)〜O(NMである ); kは小さい定数です。

達成するためのコードを参照してください: https://github.com/yaowenxu/codes/tree/master/最短経路アルゴリズム

最新の状態に保た、ソースを明記してくださいは、詳細については、cnblogs.com/xuyaowen注意してください。 

参考文献:

最短経路問題 4つの最も最短経路アルゴリズム ダイクストラ法 フロイドのアルゴリズム  プリムとダイクストラ法の違い ベルマン・フォードアルゴリズム SPFAアルゴリズム 

おすすめ

転載: www.cnblogs.com/xuyaowen/p/shortest-path-algos.html