ましょうGは
多くの制限されたグラフでさえ、s
これは、誰かが以前に考慮したに違いないように感じます。これに関する既存の研究はありますか、または実際にこれは一般的なグラフに対しても簡単ですか?
ましょうGは
多くの制限されたグラフでさえ、s
これは、誰かが以前に考慮したに違いないように感じます。これに関する既存の研究はありますか、または実際にこれは一般的なグラフに対しても簡単ですか?
回答:
私はこの答えが正しいと100%確信していませんが、ここに行きます:
単一のソースと単一のシンクを持つDAGで、これをs − tから均一にランダムな任意のパスに減らすことができると思います。
グラフG
基本的に、最短パスで使用できるすべての可能なノードを収集し、それらをHに配置しています。
この仕組みの詳細:
ダイクストラ最短パスアルゴリズムは、最初のBFSを実行して、すべてのノードをマークすることによって機能vの∈ Gからの最短パスでS - V。次のステップは、t - sから戻って、最小隣接ノードをたどることです。
v∈G s−v t−s 事はここにあなたが選ぶことができ、ある任意の少なくとも1つの隣り合うノードのを。私はここで行うことは収集され、すべての最小の隣接ノードIが占め手段の各ステップ、すべての最短パス。
今すぐあなたはすぐに考えますが、なぜ、それらを指数関数的に列挙するのですか?
答えは、同じノードを2回追加することを避けるためにセットを使用するため、可能なパスごとにこれを再計算することを避けるためです。
これで、t - sから任意の方法でトラバースし、s - tから最短逆経路を取得できるDAGができました。グラフには、唯一のソースとしてtがあり、唯一のシンクとしてsがあります。
上記が正しい場合、これをさらに一歩進め、次のように問題を解決できると思います。
DAGの各ノードにノードの重みを付けます。ノードの重みは、そのノードからsへのパスの数になります。これをw (v )と呼びましょう。
これらをすばやく計算できます。Gのsからtまでの単純なパスの数を見つけるアルゴリズムを参照してください。
ノードの重みを取得したら、次の方法でパスを均一に選択できます。
Realz Slawの答えのアイデアに基づいたソリューションを以下に示します。それは基本的に彼のアイデアの再説明であり、より明確または簡単に理解できるかもしれません。計画では、次の2つの手順で進めます。
まず、我々は、グラフ構築するSを、次のプロパティで:から任意のパスSへトンでSはから最短経路であるのにトンでG、およびからのすべての最短経路SにトンでGも中に存在するS。したがって、SにはGの最短パスがすべて含まれます。すべての最短パスが含まれ、それ以上は含まれません。それが起こると、SはDAGになります。
次に、我々は、すべてのパスの中からランダムに一様にサンプリングするのにトンでS。
このアプローチは、すべてのエッジが正の重みを持つ限り、任意の有向グラフGに一般化されるため、これらの用語でアルゴリズムを説明します。ましょうwは(Uは、V )エッジに重みを表し、U → V。(これにより、与えられた問題文が一般化されます。重みのないグラフがある場合、すべてのエッジに重み1があると仮定します。無向グラフがある場合、各無向エッジ(u 、v )を2つの有向エッジu → v およびv →
ステップ1:Sを抽出します。
次に、グラフSを次のように定義します。(1)u → vがGのエッジであり、(2)d (s 、v )= d (s 、u )+ w (u 、v )であるようなすべてのエッジu → vで構成されます。
グラフSには便利なプロパティがいくつかあります。
すべての最短経路SにTでGがでパスとして存在するS:最短経路S = V 0、V 1、V 2、... 、Vのkは = TにおけるGは、その性質有するD (sは、V I + 1を)= d (s 、v i)+ w (v i、v i
内のすべての経路SからSへのtは最短経路であるG。具体的には、内の任意の経路を検討SからSをするTたとえば、S = V 0、V 1、V 2、... 、VをK = T。その長さは、そのエッジの重みの合計、つまり∑ k i = 1 w (v i − 1、v i)によって与えられます。
最後に、Gに重みのないエッジがないことは、S
ステップ2:ランダムパスをサンプリングします。今、私たちは中のエッジの重みを捨てることができますSを、そしてからランダムサンプリングし、パス秒にトンでS。
これを支援するために、Sの各頂点vについてn (v )を計算する事前計算を行います。ここで、n (v )はvからtまでの個別のパスの数をカウントします。この事前計算は、Sの頂点をスキャンすることにより線形時間で実行できます。
N (V )= Σ W ∈ SUCC (V ) N (W )
ここSUCCは(V )の後継示しVを、すなわち、SUCC (V )= { W :Vは→ wが エッジである S }、我々はベースケース有する場合、N (Tの)= 1。
次に、n (⋅ )注釈を使用してランダムパスをサンプリングします。私たちの最初の訪問ノードS。次に、sの後継者の1つをランダムに選択し、後継者wをn (w )で重み付けします。言い換えると:
choosesuccessor(v):
n = 0
for each w in succ(w):
n = n + n(w)
r = a random integer between 0 and n-1
n = 0
for each w in succ(w):
n = n + n(w)
if r < n:
return w
ランダムなパスを選択するために、このプロセスを繰り返します。つまり、v 0 = s、およびv i + 1 = (v i)です。得られたパスは、所望の経路であり、それから、すべての最短経路からランダムに一様にサンプリングされるのに choosesuccessor
t。
これにより、Realz Slawのソリューションをより簡単に理解できます。この問題に対する美しくクリーンなソリューションは、Realz Slawの功績です。
これが処理しない1つのケースは、一部のエッジに重み0または負の重みがある場合です。ただし、その場合、無限に多くの最短パスが存在する可能性があるため、問題は明確に定義されていない可能性があります。