[解決済み] Dijkstraのアルゴリズムによる負の重み付け
質問
Dijkstraのアルゴリズムが負の重みで動作しない理由を理解しようとしています。上の例を読むと 最短経路 の例を読んで、私は次のシナリオを理解しようとしています。
2
A-------B
\ /
3 \ / -2
\ /
C
ホームページから
<ブロッククオート辺がすべて左から右へ向けられていると仮定すると Aから始めると、Dijkstraのアルゴリズムは、最小のエッジ(A,x)を選択することになります。 d(A,A)+length(edge)、すなわち(A,B)を選択する。次に、d(A,B)=2に設定し、次のように選択する。 d(A,y)+d(y,C) を最小化する別の辺 (y,C) を選択する. であり,d(A,C)=3 とする.しかし、AからBへの最短経路を見つけることはできない。 B、C を経由して、全長 1 の最短経路を見つけることはできません。
以下のDijkstraの実装を使うと、d[B]はなぜ更新されないのか理解できません。
1
(アルゴリズムが頂点Cに到達したとき、それはB上でrelaxを実行し、d[B]がに等しいことを確認します。
2
に等しいことを確認し、したがって、その値を
1
).
Dijkstra(G, w, s) {
Initialize-Single-Source(G, s)
S ← Ø
Q ← V[G]//priority queue by d[v]
while Q ≠ Ø do
u ← Extract-Min(Q)
S ← S U {u}
for each vertex v in Adj[u] do
Relax(u, v)
}
Initialize-Single-Source(G, s) {
for each vertex v V(G)
d[v] ← ∞
π[v] ← NIL
d[s] ← 0
}
Relax(u, v) {
//update only if we found a strictly shortest path
if d[v] > d[u] + w(u,v)
d[v] ← d[u] + w(u,v)
π[v] ← u
Update(Q, v)
}
ありがとうございます。
ミール
どのように解決するのですか?
あなたが提案したアルゴリズムは、確かにこのグラフの最短経路を見つけることができますが、一般的にすべてのグラフを見つけることはできません。例えば、このようなグラフを考えてみましょう。
あなたのアルゴリズムの実行をトレースしてみましょう。
- まず、d( A ) を 0 に、その他の距離を ∞ に設定します。
- 次に、ノードを展開し A を設定し、d( B ) を 1 に、d( C )を0に、そしてd( D ) を 99 に設定します。
- 次に、展開した C を、正味の変更なしに展開します。
- 次に B を展開しますが、これは何の効果もありません。
- 最後に D を展開し、d( B ) を -201 に変更します。
この最後に、しかし、そのd( C への最短経路はまだ0であることに注意してください。 C への最短パスは長さ -200 であるにもかかわらず、0 のままです。これは、あなたのアルゴリズムがすべてのノードへの正しい距離を計算していないことを意味する。さらに、各ノードから開始ノードへの行き方を示すバックポインタを保存していたとしても A から間違った経路で戻ってくることになる。 C から A .
この理由は、Dijkstraのアルゴリズム(とあなたのアルゴリズム)は 貪欲なアルゴリズム は、一度あるノードまでの距離を計算したら、見つかった距離は最適な距離でなければならないと仮定しています。言い換えれば、アルゴリズムは、拡張したノードの距離を取り、その距離が何であるかを変更することを自分自身に許さないのです。負のエッジの場合、あなたのアルゴリズム、およびダイクストラのアルゴリズムは、出発ノードから他のノードへの最適なパスのコストを実際に減少させる負のコストのエッジを見ることによって、"surprise"することができます。
これが役に立つことを願っています。
関連
-
[解決済み】Dijkstraのアルゴリズムが負の重みのエッジに対して機能しないのはなぜですか?
-
[解決済み】Quickselectの時間の複雑さを説明する
-
[解決済み] どのようにすれば、ほとんどすべてのアルゴリズムを修正して、最良の場合の実行時間を持つようにできるか?
-
[解決済み] ベルマンフォードとダイクストラの比較。どのような状況下でベルマンフォードが優れているか?
-
[解決済み] 解いてみてください。T(n) = T(n-1) + n [重複] とする。
-
[解決済み] T = {<M> | Mはwを受け入れるときはいつでも$w^R$を受け入れるTMである}とする。Tが決定不可能であることを示せ
-
[解決済み] ゲーム「2048」の最適なアルゴリズムとは?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Breadth First Search (BFS)が同じことをより速くできるのに、なぜDijkstraのアルゴリズムを使うのですか?
-
[解決済み] リストの並べ換えをすべて生成するアルゴリズム?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Dijkstraのアルゴリズムが負の重みのエッジに対して機能しないのはなぜですか?
-
[解決済み】なぜO(n)はO( nlog(n) )よりも優れているのでしょうか?)
-
[解決済み】3値の中央値戦略
-
[解決済み] 構造的再帰と生成的再帰はどのように違うのですか?
-
[解決済み] このHeld-Karp TSP Pseudocodeの説明をお願いします。
-
[解決済み] 2つのNFAの交点の求め方
-
[解決済み] log(n!)=Θ(n-log(n))でしょうか?
-
[解決済み] 隣接リスト表現の時間複雑性?
-
[解決済み] キャッシュの無効化 - 一般的な解決策はありますか?
-
[解決済み] 再帰と反復