web-dev-qa-db-ja.com

ダイクストラのアルゴリズムが負の重みエッジに対して機能しないのはなぜですか?

単一ソースの最短パスに対するダイクストラのアルゴリズムがエッジが非負でなければならないと仮定する理由を誰かに教えてもらえますか。

負のウェイトサイクルではなく、エッジのみについて話しています。

107
Madu

ダイクストラのアルゴリズムでは、頂点が「閉じた」とマークされると(および開いたセットから)-アルゴリズムが最短パスを見つけたことを思い出してください 、このノードを再び開発する必要はありません-このパスに開発されたパスが最短であると想定します。

しかし、負の重みでは-それは真実ではないかもしれません。例えば:

       A
      / \
     /   \
    /     \
   5       2
  /         \
  B--(-10)-->C

V={A,B,C} ; E = {(A,C,2), (A,B,5), (B,C,-10)}

AのDijkstraは最初にCを開発し、後でA->B->Cを見つけられません


編集少し深い説明:

これは重要であることに注意してください。各緩和ステップで、アルゴリズムは「閉じた」ノードへの「コスト」が実際に最小であり、したがって次に選択されるノードも最小であると想定します。

その考えは次のとおりです。コストが最小になるように頂点を開いている場合-正の数を任意の頂点に追加することにより-最小値は変更されません。
正数の制約なし-上記の仮定は当てはまりません。

「閉じた」各頂点は最小限であることが「わかっている」ため、「振り返る」ことなくリラクゼーションステップを安全に実行できます。 「振り返る」必要がある場合- Bellman-Ford は、そのような再帰的な(DP)ソリューションを提供します。

153
amit

Dijkstraのアルゴリズムは、パスが「より重くなる」ことのみを想定しているため、AからBへのパスが重み3で、AからCへのパスが重み3である場合、エッジを追加する方法はありません。 3未満の重みでAからCを経由してBに到達します。

この仮定により、負の重みを考慮する必要があるアルゴリズムよりもアルゴリズムが高速になります。

18
zmbq

ダイクストラのアルゴリズムの正確性:

アルゴリズムの任意のステップで2セットの頂点があります。セットAは、最短パスを計算した頂点で構成されます。セットBは、残りの頂点で構成されます。

帰納仮説:各ステップで、以前のすべての繰り返しが正しいと仮定します。

誘導ステップ:頂点Vを集合Aに追加し、距離をdist [V]に設定すると、この距離が最適であることを証明する必要があります。これが最適でない場合、頂点Vへのより短い長さの他のパスが必要です。

この他のパスが頂点Xを通過するとします。

Dist [V] <= dist [X]であるため、グラフのエッジ長が負でない限り、Vへの他のパスは少なくともdist [V]の長さになります。

したがって、ダイクストラのアルゴリズムが機能するためには、エッジの重みは負でない必要があります。

5
Nikunj Banka

Aがソースノードであると仮定して、次のグラフでダイクストラのアルゴリズムを試して、何が起こっているのかを確認してください。

Graph

4
tb-

ダイクストラのアルゴリズムでは、頂点が「閉じた」としてマークされると(そして開いたセットから)、-それから発生するすべてのノードがより大きな距離につながると仮定しますそれへの最短経路であり、このノードを再度開発する必要はありませんが、負の重みの場合はこれは当てはまりません。

1
vineet