無向グラフ上の最短経路?


19

だから私はこの(多少基本的な)質問はここに属していると思った:

サイズが100のノードのグラフが10x10のパターンで配列されているとします(チェス盤を考えてください)。グラフは無向であり、重み付けされていません。グラフを移動するには、3つのスペースを前方に移動し、1つのスペースを右または左に移動します(チェスナイトがボード上を移動するのと同様)。

開始ノードが固定されている場合、ボード上の他のノードへの最短パスをどのように見つけますか?

実行可能な移動であるノード間にのみエッジがあると想像しました。したがって、この情報が与えられたら、開始ノードから終了ノードまでの最短パスを見つけたいと思います。

私の最初の考えは、各エッジは重み1で重み付けされるということでした。しかし、グラフは無向であるため、ジクストラは理想的なフィットではありません。したがって、私は深さ優先検索の変更された形式を使用してそれを行うことにしました。

しかし、検索を使用して最短経路を取得する方法を視覚化することはできませんでした。

私が試したもう1つのことは、開始ノードをルートとしてツリー形式でグラフを配置し、次に希望の終了ノードを与えた最も浅い(最も低い行番号)結果を選択することでした...これはうまくいきましたが、非常に効率的ではなかったため、大きなグラフでは機能しません。

誰かが私にこの方向性を正しい方向に向けるようなアイデアを持っていますか?

どうもありがとうございました。

(グラフの視覚化を試みましたが、評判が悪いためできませんでした)

回答:


19

グラフ内のエッジが特定の位置間の有効な移動のみを表す場合、ダイクストラを使用するとうまく機能します。ただし、グラフに重みが付けられていないため、過剰になります。単純な幅優先検索で最適な答えが得られます。


ああ、私もBFSのことを考えていませんでした!トンありがとう!
gfppaste

どのようにやり過ぎですか?実装は他の何よりも少し難しいかもしれません。

BFSの方が効率的であることも付け加えておきます。BFSにはがありますがO(|E|)、ダイクストラにはがありO(|E| + |V|log(|V|)ます。
ダグ・ラムジー

@ user742 BFSは、ジクストラよりも高速です。DjikstraがあるO(mn)BFSがある一方でO(V + E)
CodyBugstein

13

ニコラスはすでに完璧な答えを提供してくれました。ただし、深さ優先検索を使用しようとする元の試みに対処しましょう。

まず、Dijkstra(Nicholas Mancusoが指摘しているように重み付けされていないノードで正常に動作します)または幅優先検索のいずれかが、メモリを指数関数的に浪費します。ただし、その利点は、最適なソリューションを見つけることが保証されている間、ノードを再展開しないことです。残念ながら、それらの制限は非常に重要であり、合理的に拡大することを期待すべきではありません。

dmaバツkdmaバツ+×kdmaバツ=k=1 ソリューションの深さで線形のメモリを使用しながら、最適なソリューションを見つけることが保証されます。

まあ、あなたはノードを再拡張することはかなり悪い考えだと思っているかもしれません。どういたしまして!これはメモリの線形消費を保証するものであり、全体の実行時間を支配する反復は最後のものに過ぎないため、このアルゴリズムがオーバーヘッドで発生することが証明できます。bb1b

乾杯、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.