重みのないグラフで最短パスを見つけるためにDFSを使用できないのはなぜですか?


16

「現状のまま」のDFSを使用しても、重み付けされていないグラフでは最短経路が見つからないことを理解しています。

しかし、DFSを微調整して、重みのないグラフで最短パスを見つけることができるのはなぜですか?件名に関するすべてのテキストは、単にそれを実行できないと述べています。私は(自分で試したことがなく)納得していません。

DFSが重み付けされていないグラフで最短パスを見つけることを可能にする変更を知っていますか?そうでない場合、アルゴリズムをそれほど難しくしているのは何ですか?


1
重み付けされていないグラフで最も一般的な経路探索アルゴリズムはA *であり、フィニッシュの近くでタイが壊れるというわずかな変更が加えられています。これにより、最も直接的なルートを最初に試行し、必要な場合にのみ外側にバブルするという点で、DFSと同様のアルゴリズムが提供されます。
BlueRaja-ダニーPflughoeft

1
一部の(適切に選択された)グラフでDFSを使用してみてください。本当に機能しない場合は、問題が発生するはずです。ところで、あなたの質問は、それが重み付きグラフで機能しているかのように見えます。
ラファエル

回答:


12

調整する深さ優先検索の唯一の要素は、子が調査される順序です。通常バージョンは、任意の順序、つまり子が格納されている順序で処理されます。

私が思いつく唯一の実行可能な代替案(最短経路に向けて)は、現在のノードからの距離(小さいものから大きいもの)の順に子を見る貪欲なアプローチです。このルールの反例を簡単に作成できます。

貪欲なルールの反例
[ ソース ]

さて、これは、調査する次の子を選択する戦略が存在しないという証拠ではありません。これにより、DFSが最短パスを見つけます。

stsaaabst

cc1


  1. ルールが決定的である限り。そうでない場合、常に最短経路を見つけることができるとは限りません。

私が間違っている場合は修正しますが、これはDFSが任意のグラフで最短経路を見つけることができることを意味しますが、そうする間に指数関数的な時間がかかりますか?
アンモルシンジャギ

@AnmolSinghJaggiいいえ。DFSはパスを1つしか見つけません。
ラファエル

10

Breadth -first-searchは、重み付けされていないグラフで最短パスを見つけるアルゴリズムです。

DFSから、重み付けされていないグラフ上の最短パスを見つけるアルゴリズムに到達するための簡単な調整があります。基本的に、DFSが使用するスタックをキューに置き換えます。ただし、結果のアルゴリズムはDFSと呼ばれなくなりました。代わりに、幅優先検索を実装します。

上記のパラグラフは正しい直観を与えますが、状況を少し単純化しすぎています。単純なスワップが幅優先検索の実装を提供するコードを書くのは簡単ですが、最初は正しい実装のように見えますが実際にはそうではないコードを書くのも簡単です。関連するcs.SEの質問については、BFSとDFSをご覧くださいここでいくつかの素敵な擬似コードを見つけることができます


2

あなたはできる!!!

深さを調べている間にノードを訪問済みとしてマークし、戻るときにマークを解除します。別のブランチが見つかったときに戻って同じことを繰り返します。

ターゲットノードが見つかったすべての可能な検索のコスト/パスを保存し、そのようなコスト/パスをすべて比較して、最短のものを選択します。

このアプローチの大きな(そしてBIGを意味する)問題は、同じノードに複数回アクセスすることになるため、dfsは最短パスアルゴリズムにとって明らかに悪い選択になることです。


1
st

1
@ user2407394このDFSのバリエーションを実際に一度実装して、適度に大きなグラフに対して正しく実行しましたか?このバリエーションをDFSと呼ぶのをためらうでしょう。深さ優先のパス検索と呼びます。
ジョンL.

私はこの種のアプローチを実装しましたが、動作は非常に遅いです。ニーモナイゼーションを追加してパフォーマンスを改善することを考えています。
マイク

0

BFSには、ルートからすべてのエッジをチェックし、ルートから他のノードまでの距離を可能な限り最小限に抑えるという優れたプロパティがありますが、dfsは単に最初の隣接ノードにジャンプし、深さ方向に移動します。最短パスを取得するためにDFSを変更できますが、最終的には時間の複雑度がより高いアルゴリズムになるか、BFSと同じことを実行することになります


-3

ITは、DFSを使用して最小のエッジ数で2つの頂点間のパスを見つけることができます。レベルのアプローチを適用できます


2
詳細を教えてください。この一文でどのアルゴリズムを記述しようとしているのかわかりません。
デビッドリチャービー

-3

あなたはできる

dfs方式でグラフをトラバースし、チェックするだけです

if(distance[dest] > distance[source]+cost[source_to_destination]){
    distance[dest] = distance[source] + cost[source_to_destination]);
}

完全なソリューションのリンクはこちら


1
受け入れられた答えは、これは不可能だと主張しており、これはあなたの主張と矛盾しています。それでもこのアプローチがうまくいくと思う理由を説明できますか?(または、このアプローチが一般的に機能する理由を説明してください)
離散トカゲ

これは単なる繰り返しではありませんuser2407394の答えを(あなたが何を定義していませんでしただけで、ハード・理解するコードで、任意の代わりに説明のこれらの変数の意味は、それが私には、明らかではありませんか)?
デヴィッドリチャービー

はい、user2407394の回答の実装です。ご不便をおかけして申し訳ありません。コードにコメントを追加しました。今すぐ確認できます。
アンモルミダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.