タグ付けされた質問 「shortest-path」

グラフ内のノード間の最短経路を見つけるアルゴリズムの問​​題に関する質問。

2
すべての重みが正になるように定数を追加するだけでは、負の重みを持つ最短経路を見つけられないのはなぜですか?
私は現在、アルゴリズムの概要を読んでいて、すべてのパスが正であることを確認することに依存するジョンソンのアルゴリズムを採用しました。 アルゴは、すべてのエッジに対して正であり、最短経路関係の正確さを維持する新しい重み関数(w ')を見つけることに依存しています。 これは、w(s)、h(d)の値を計算して、wの元の値に追加します。 私の質問は、グラフの最小のwを見つけてすべてのエッジに追加しないのはなぜですか?これは両方の条件を満たすため、計算量が少なくて済みます。

3
範囲から描画されるエッジの重みに対するダイクストラのアルゴリズムを変更する
範囲からエッジの重みが描画された有向グラフがあるとします。ここで、は定数です。ダイクストラのアルゴリズムを使用して最短経路を見つけようとしている場合、アルゴリズム/データ構造を変更して、時間の複雑さを改善するにはどうすればよいですか?[1,…,K][1,…,K][1,\dots, K]KKKO(|V|+|E|)O(|V|+|E|)O(|V|+|E|)


1
ペアワイズ問題を繰り返し解くよりも速くすべてのペア間のk最短経路を見つけることができますか?
グラフ内のすべてのペア間の最短パス(は10未満)を生成したいと思います。グラフは(実際には地下鉄の地図です):kkkkkk 正に重み付け 無向 疎 約100ノード 私の現在の計画は、各ペアに最短パスルーティングを適用することです。私は現在、より効率的な代替手段を探しています(おそらく動的プログラミングを使用)。kkk

1
2つのノード間のk最短経路を見つける
重み付き有向グラフ、および重み関数d (u 、v )が与えられると、通常はダイクストラのアルゴリズムを使用して最短経路を取得できます。私が興味を持っているのは、2 n d-最短経路、3 r d-最短経路などを取得する方法です。G = V、EG=V、EG=V,Ed(u 、v )d(あなた、v)d(u,v)2n 日2んd2^{nd}3r d3rd3^{rd} 質問: 重み付きグラフの2つのノード間のi番目に最短のパスを取得する効率的なアルゴリズムはありますか? 重み付きグラフの2つのノード間のk最短経路を取得するための効率的なアルゴリズムはありますか? 2番目の質問への回答は、最初の質問への回答への呼び出しよりも効率的に実行できるのではないでしょうか。kkk

3
有向グラフの一意のパス
私は、有向グラフが頂点に対して一意であるかどうかを判別するクラスのアルゴリズムを設計しています。これにより、任意のu ≠ vに対して、vからuまでのパスが最大で1つ存在します。BFS(幅優先検索)を使用してvから別の頂点uへの最短パスを見つけ、次にBFSを再度実行して、vからuへの代替パスが見つかるかどうかを確認することから始めました。しかし、これは時間がかかりすぎると思います。より短い実行時間でソリューションを見つける方法についてのヒントはありますか?vvvu ≠ vあなた≠vu \ne vvvvあなたあなたu

3
サイクルキャンセルアルゴリズムの負のサイクルを見つける
最小コストのフロー問題の最適なソリューションを見つけるために、サイクルキャンセリングアルゴリズムを実装しています。残余ネットワークで負のコストサイクルを見つけて削除することにより、各ラウンドの総コストが削減されます。負のサイクルを見つけるために、私はベルマンフォードアルゴリズムを使用しています。 私の問題は、Bellman-fordはソースから到達可能なサイクルのみを検出しますが、到達不可能なサイクルも検出する必要があります。 例:次のネットワークでは、すでに最大フローを適用しています。エッジ(A,B)(A,B)(A, B)は非常に高価になります。残余ネットワークでは、容量負のコストサイクルがあります111。これを削除すると、エッジとを使用した安価なソリューションが得られますが、ソースからは到達できません。(C 、T )S(A 、C)(あ、C)(A, C)(C、T)(C、T)(C, T)SSS ラベル:フロー/容量、コスト もちろん、各ノードをソースとしてベルマンフォードを繰り返し実行することもできますが、それは良い解決策のようには思えません。私が読んだすべての論文がこのステップをスキップしているように見えるので、私は少し混乱しています。 ベルマンフォードを使用して、すべての負のサイクル(到達可能かどうか)を見つける方法を教えていただけますか?そしてそれが不可能な場合、他にどのアルゴリズムを提案しますか?

1
複数のパスの重みが同じである場合、エッジの数が最も少ないソリューションを優先するダイクストラ
したがって、ダイクストラが最小のエッジ数で解を見つけるように、任意のグラフを変更できます。GGG すべてのエッジの重みに数値を掛け、重みにを加算して、ソリューションの追加の各エッジにペナルティを課します。aaa111 w′(u,v)=a∗w(u,v)+1w′(u,v)=a∗w(u,v)+1w'(u,v)=a*w(u,v)+1 これは、すべての値では動作しません。が機能するには、少なくともで必要があります。場合は、この最小数ではありません、それは最短パスを選択しない場合があります。この最小値を見つけるにはどうすればよいですか?aaaaaaxxxaaaxxx Ps。これはレクリエーションで行われました、私はずっと前に宿題を終えました。

2
A *グラフ検索時間の複雑さ
時間の複雑さとA *に関する混乱。 A * Wikiによると 、時間の複雑さは解の深さで指数関数的です(最短経路): A *の時間の複雑さはヒューリスティックに依存します。無制限の探索空間の最悪の場合、展開されたノードの数は、解の深さ(最短経路)dで指数関数になります。O (bd)O(bd)O(b^d)、 どこ bbb 分岐因数(州ごとの平均の後継者数)です。 この受け入れられた回答へのコメントは、グラフのサイズの観点から複雑さを与える方が理にかなっていることを指摘しているため、O ((| V| + | E| )⋅LOG| V| )O((|V|+|E|)⋅log|V|)O((|V| + |E|) \cdot log |V|) 明らかに、ヒューリスティックがすべてのノードに0の値を割り当てる場合、A *はダイクストラのアルゴリズムになり、均一コストのヒューリスティックは本質的にヒューリスティックを無効にします。 ヒューリスティックを O (1 )O(1)O(1) (そして一貫性のある)、最悪のケースは本質的にA *を複雑度のあるダイクストラのアルゴリズムに劣化させていることは理にかなっています O (| E| + | V| ログ| V| )O(|E|+|V|log⁡|V|)O(|E|+|V|\log|V|) 最小優先度のキューの実装(フィボナッチヒープ)。 私が間違っている? 私がこれまで見てきた本などは、ソリューションの深さに関して複雑さを与えます

1
から
定義。グラフと2つの頂点sおよびtが与えられた場合、k -shortest-paths問題は、G のsとtの間のk最短単純パスを見つけることです。G = (V、E)G=(V,E)G=(V,E)ssstttkkkkkkssstttGGG これらのパスの長さは必ずしも同じである必要はなく、頂点とtは必ずk接続されていることに注意してください。この問題に対して線形時間(nおよびmの観点から)アルゴリズムがあるかどうか疑問に思っていました。ssstttkkkんnnメートルmm 「円のランキングループレスパスアルゴリズムの新しい実装」など、私は文献でいくつかの論文を見てきましたが、時間の複雑さは本当に高いです。また、Epsteinによる他の論文「K最短パスを見つける」では、実行時間O (n + m + k )の単純なパスではないk最短パスを見つけるアルゴリズムを示しています。O (Kn (m + n l o gn ))O(Kn(m+nlogn))O(Kn(m+nlogn))kkkO (n + m + k )O(n+m+k)O(n+m+k) -simple-shortest-paths問題の線形時間アルゴリズムはありますか?kkk

3
アルゴリズム:ゲーム内のダンジョンを通る最短経路を見つける
バックグラウンド 最近PCゲーム「ダーケストダンジョン」をプレイしていた。ゲームでは、下の図に示すように、部屋がつながったダンジョンを探索する必要があります。 ルールは次のとおりです。 固定の部屋(入り口)から始めます。開始する場所を選択することはできません。 目標は、すべての部屋を少なくとも1回訪問することです 隣接する部屋間の距離は、すべての部屋で同じです。 部屋や散歩道は何度でも訪れることができます 質問 少なくとも一度はすべての部屋を訪れる入り口からの最短経路は何ですか? サブ質問: この問題を解決するために使用できるアルゴリズムは何ですか? 私のような人が自由に(そしてかなり簡単に)使用できる実装はありますか? 私が試したこと 私はこれまたはこれのような他の質問を答えを見つけることなく見つけました。(基本的な)TSPに精通しており、簡単なTSPをコーディングして解決できます。ハミルトニアンパスは複数回の訪問を許可しないため、私の問題を解決しませんでした。中国の郵便配達の問題は、私はすべてのエッジを訪問する必要はありませんので、また、その基本的な形で、ここでは適用されません。 更新 コメントで述べたように、私はコンピュータサイエンティストではなく、数学的なステートメントを証明することにも興味がありません(おそらく、この質問を後でスタックオーバーフローに投稿します)。また、私はプログラマーではないため、自分でソリューションをコーディングできる可能性は非常に低くなっています。しかし、私はその性質の問題を扱う最初の人ではないと思います。 @Shreeshおよび@Dibによると、次の手順を適用できます。 すべての部屋でペアワイズ距離行列を作成し、すべての部屋の間にエッジを追加します。 標準ソルバー(例:concorde)を使用してTSPを解く 入り口から始めて、解決策に従ってすべての部屋を訪れます。隣接していない部屋の場合は、それらの部屋の間の最短距離に置き換えます。 この手順は問題の答えを提供しますか?

2
特定のノードを通過する最短経路
私は自分の問題の効率的な解決策を見つけようとしています。G100個のノード(各ノードに番号が付けられています)を含む正の重み付きグラフがあり、それが非循環グラフであると仮定しましょう。したがって、2、2、2、1などのエッジは存在できません。ノードのリストを取得しましたG。グラフから10としましょう。これらの各ノードも配列にあるとしましょう。そのリストから、ノード1から100までの、それらのノードの少なくとも特定の(5つとしましょう)を通過する最短パスの総重みを見つける方法を探しています。 簡略化するために、0 ... 5の6つのノードを持つグラフを考えます。ノード1と4は、通過するように指定できるポイントとしてマークされています。既存のパスが0-1-2-5、0-3-4-5、および1-4であるとしましょう。ここで、3から4を除くすべてのエッジが5として重み付けされているとします。3から4は1として重み付けされます。最短パスアルゴリズムを実行すると、基本的にパス0-3-4-5が検出されます。指定されたポイントの最小量を指定して、量2を試してください。その後、アルゴリズムは15として重み付けされた0-1-4-5で実行されます。 私はこのように書きました shortestPath(destinationNode, minAmount) if(destinationNode == srcNode && minAmount < 1) return 0 else if(destinationNode == srcNode && minAmount > 1) return INFINITY int destNo = destinationNode get number int cost = INFINITY for (int i = 0; i < destNo; i++) if (d[i][destNo] != null) int …

1
いくつかのノード間の有向グラフで指定された長さ未満のすべてのパス
有向グラフまたは無向グラフ内のいくつかのノード間のすべての可能なパス、または指定された長さのすべての可能なパスをカウントすることは、古典的な問題です。可能性のサイクルにより、すべての意味に注意を払う必要があります。 この質問は少し異なる、または少なくとも私は思います。 INPUT: してG有向グラフ。Gは、サイクルと自己接続ノードを持つことができます。してみましょうA(G)はの隣接行列もG(中1とG I、J Iからjに行くリンクとそうでない場合は0があります場合)。Gのノードの2つのサブセットであるTとBを定義します。 結果:Tの 1つのノードからBの 1 つのノードに向かう、最大で k のすべてのパスのリスト。パスは、ソースノードからターゲットノードに厳密にk + 1ステップ未満で進む限り、同じエッジを複数回含むことができます。 質問:このタスクで最適なアルゴリズムを知りたいのですが。隣接行列のn乗がシンボリックに計算された場合(1の代わりに各エントリに異なる変数を使用)、このすべてのパス(およびエントリに1を使用して数値で計算された場合、パスのカウントに減少します)。しかし、これがタスクを実行する最も速い方法であるかどうかは本当にわかりません(おそらくそうではありません)。 警告:私はカウントの問題や最短のパスを求めているのではありません。パスの長さは、使用されるエッジの数として定義されています(繰り返しをカウントしています)。私はRを使用していますが、他の言語で考えたい場合は、質問がすでに提起され、解決されていたら本当に申し訳ありません。親切に助けてくれてありがとう! 追加情報:行列べき級数アプローチ(A ^ 3は3つの長いパスをすべて提供します...)とdfs / bfsを試しました。後者の2つは、ソースとターゲットのセットで作業していることを考慮に入れておらず、したがって多くの冗長な作業を行うため、最適性には程遠いと思います...

4
ノードxとyの間のグラフに単純なパスが1つだけあるかどうかを確認します `
単純な無向グラフを与えたとしましょう GGG有するノードと双方向のエッジを。与えられたとについて、グラフの間に単純なパスが1つしかないかどうかを確認します。NNNMMMxバツxyyy 私が考えていたのは、グラフ内のすべてのサイクルを見つけて、から bfsを実行する必要があるということです。パスがあるサイクルの頂点を通過しない場合、パスは1つだけで、それ以外の場合はそこにあります。以上です。xバツxyyy これを確認する他の方法はありますか?

1
セット頂点からセットへの最短経路を見つける方法
私がグラフ、頂点のサブセット、および頂点の2番目のセット持っている場合、 2セット?つまり、すべての -パスの中で最短のパスを探しています。すべてのエッジの重みが正であると仮定することもできます。G=(V,E)G=(V,E)G=(V,E)S⊂VS⊂VS \subset VS′⊂(V∖S)S′⊂(V∖S)S' \subset (V\setminus S)SSSS′S′S' これが私がこれまでこの問題に取り組んだ方法です: 前の操作でフロイドワーシャルアルゴリズムを適用して計算されたグラフの距離行列情報がすでにあります。(d)(d)(d)GGG 次に、各頂点についてすべての頂点を反復処理し、行列最小値を持つペアを見つけます。SSSS′S′S'(s1,s2)(s1,s2)(s_1,s_2)ddd 次にダイクストラのアルゴリズムを使用してと間の最短経路を計算し、頂点セットと接続します。s1s1s_1s2s2s_2SSSS′S′S' これと同じ結果を達成するためのより効率的な方法はありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.