最短


14

ましょうGはGグラフであり、およびlet Ss及びTはtの2つの頂点であるGGstのすべての最短パスのセットからランダムに均一かつ独立して最短ss - ttパスを効率的にサンプリングできますか?簡単にするために、Gは単純で、方向付けられておらず、重み付けされていないと仮定できます。stG

多くの制限されたグラフでさえ、sstの最短経路の数tGのサイズで指数関数的Gです。したがって、実際にはすべての最短ss - ttパスを実際に計算することは避けたいと思います。一般的なケースについては知りませんが、いくつかの特別なグラフクラスでこれを達成できるようです。

これは、誰かが以前に考慮したに違いないように感じます。これに関する既存の研究はありますか、または実際にこれは一般的なグラフに対しても簡単ですか?


良い質問、ジュホ。答えを考えながら、「stパスをランダムに均一にサンプリングする」ことによって、あなたは正確に何を理解しますか?sとtをランダムに選択するだけで十分な場合、質問は簡単なので、最短経路のすべてのノードが均一な分布に従う頻度(つまり、確率)で表示されることを意味すると思います。または、他の定義はありますか?特に、二部グラフの場合、あなたの質問はとても簡単だと思いませんか?
カルロスリナレスロペス

1
CarlosLinaresLópez@言う考えてみましょうダイヤモンドグラフを、と言うのは、s「垂直エッジ」の右側にあり、そしてtはt左側にあります。現在、sstの間には2つの最短経路がありtます。アルゴリズムは、これら2つのパスのいずれかを等しい確率で返す必要があります。したがって、ssttは「ランダムに選択」されませんが、入力として与えられます。それはそれを明確にしますか?この意味で、2部グラフで問題が本当に簡単かどうかはわかりません。
ジュホ

1
@CarlosLinaresLópezは、換言すれば、我々はグラフ与えられG、及び2つの頂点S T V G 。してみましょうSは間のすべての最短経路の集合STSの要素を一様にランダムに出力します。Gs,tV(G)SstS
ジュホ

回答:


6

私はこの答えが正しいと100%確信していませんが、ここに行きます:

単一のソースと単一のシンクを持つDAGで、これをs tから均一にランダムな任意のパスに減らすことができると思います。st

グラフGG

  1. 新しい空の有向グラフHを作成します。H
  2. まず:から始まる、ダイクストラの最短パスのBFSの一部を実行する彼らの最短距離-from-を持つすべてのノードマークし、ss
  3. ましょうD S vはからの最小距離であるS - V。これは、ダイクストラの最短経路アルゴリズムのBFSステップからわかります。d(s,v)sv
  4. 次に、ダイクストラの最短経路アルゴリズムの次のステップを実行して、最短経路を取得し、それをpに格納します(tからsに逆戻りします)。pts
  5. 次のループを開始します。コメントの拡張、および以下:
    • q 0 = { t }q0={t}
    • しばらくのq 0q0
      • q 1 = q1=
      • 以下のためのu Q 0uq0
        • したがって、t - uからこの最短サブパスのすべての可能な次のノードを見つけたいtu
        • すべてのためのエッジU V GようにD S V < D S U edge(u,v)Gd(s,v)<d(s,u)
          • v d s が少ない隣接ノードです( 1が少なくなります)vd(s,)1
          • したがって、t - u - vは最短パスで可能なサブパスです。tuv
          • 置くV H ジエッジU V HvH,di-edge(u,v)H
          • 次に、次のターンでvの下位ノードをチェックする必要があります。v
          • 置くv q 1vq1
      • 集合Q 0Q 1q0q1
        • q 0q 1q0q1

基本的に、最短パスで使用できるすべての可能なノードを収集し、それらをHに配置しています。H

この仕組みの詳細:

ダイクストラ最短パスアルゴリズムは、最初のBFSを実行して、すべてのノードをマークすることによって機能vのGからの最短パスでS - V。次のステップは、t - sから戻って、最小隣接ノードをたどることです。vGsvts

事はここにあなたが選ぶことができ、ある任意の少なくとも1つの隣り合うノードのを。私はここで行うことは収集され、すべての最小の隣接ノードIが占め手段の各ステップ、すべての最短パス。

今すぐあなたはすぐに考えますが、なぜ、それらを指数関数的に列挙するのですか?

答えは、同じノードを2回追加することを避けるためにセットを使用するため、可能なパスごとにこれを再計算することを避けるためです。

これで、t - sから任意の方法でトラバースし、s - tから最短逆経路を取得できるDAGができました。グラフには、唯一のソースとしてtがあり、唯一のシンクとしてsがあります。tsstts


上記が正しい場合、これをさらに一歩進め、次のように問題を解決できると思います。

DAGの各ノードにノードの重みを付けます。ノードの重みは、そのノードからsパスの数になります。これをw v と呼びましょう。sw(v)

これらをすばやく計算できます。Gのsからtまでの単純なパスの数を見つけるアルゴリズムを参照してください。

ノードの重みを取得したら、次の方法でパスを均一に選択できます。

  • DAGをレベル構造としてレイアウトする(視覚化のため)
  • 各レベルで、ノード間の任意の順序を選択します。「左から右」の概念。
  • DAGをダウン横断:各ステップで私は私は[ 1 | p | ](ここで、||は、size-of、この場合は最短パスの長さを意味します): ii[1,|p|]||
    • してみましょうuの私は、現在のノードである(で始まるトンuit
    • u iの子のすべての重みを合計し、RNGを使用して、重み付き子の間で一様に1つの子ノードv iを選択します。uivi
    • u i + 1 = v iに設定し、次のステップに進みますui+1=vi

レベル構造、および左から右への概念は、単に生成への私の最初の試みの一部であったRを[ 0 W T 、およびパスにその方法を選択するが、私はそう、数字出ているしませんでしたそれらは安全に無視できます。r[0,w(t))
リアルツスロー

1
この答えは素晴らしいですね!アイデアが大好きです!私の理解のテストとして、少し違う方法で(答えで)書き出そうとしました。いずれにせよ、この素敵な答えに対する感謝の気持ちを伝えたかっただけです!
DW

5

Realz Slawの答えのアイデアに基づいたソリューションを以下に示します。それは基本的に彼のアイデアの再説明であり、より明確または簡単に理解できるかもしれません。計画では、次の2つの手順で進めます。

  1. まず、我々は、グラフ構築するSを、次のプロパティで:から任意のパスSトンSはから最短経路であるトンG、およびからのすべての最短経路SトンGも中に存在するS。したがって、SにGの最短パスがすべて含まれます。すべての最短パスが含まれ、それ以上は含まれません。それが起こると、SはDAGになります。SstSstGstGSSGS

  2. 次に、我々は、すべてのパスの中からランダムに一様にサンプリングするトンSstS

このアプローチは、すべてのエッジが正の重みを持つ限り、任意の有向グラフGに一般化されるため、これらの用語でアルゴリズムを説明します。ましょうwはUはV エッジに重みを表し、U V。(これにより、与えられた問題文が一般化されます。重みのないグラフがある場合、すべてのエッジに重み1があると仮定します。無向グラフがある場合、各無向エッジu v を2つの有向エッジu v およびv Gw(u,v)uv(u,v)uv u。)vu


ステップ1:Sを抽出します。Sソースsから開始して、Gで 単一ソースの最短パスアルゴリズム(たとえば、ダイクストラのアルゴリズム)を実行します。各頂点のためのVにおけるG、聞かせてD S vはからの距離を表し、SGsvGd(s,v)s Vv

次に、グラフSを次のように定義します。(1)u vGのエッジであり、(2)d s v = d s u + w u v )であるようなすべてのエッジu vで構成されます。SuvuvGd(s,v)=d(s,u)+w(u,v)

グラフSには便利なプロパティがいくつかあります。S

  • すべての最短経路STGがでパスとして存在するS:最短経路S = V 0V 1V 2... Vのkは = TにおけるGは、その性質有するD sはV I + 1を= d s v i+ w v iv istGSs=v0,v1,v2,,vk=tG+ 1、したがって、エッジ v i v i + 1Sに存在します。d(s,vi+1)=d(s,vi)+w(vi,vi+1)vivi+1S

  • 内のすべての経路SからSへのtは最短経路であるG。具体的には、内の任意の経路を検討SからSをするTたとえば、S = V 0V 1V 2... VをK = T。その長さは、そのエッジの重みの合計、つまりk i = 1 w v i 1v iによって与えられます。SstGSsts=v0,v1,v2,,vk=tki=1w(vi1,vi)ただし、Sの定義によりにおけるGS、この合計はk i = 1d s v id s v i 1)でd s t d s s = d s t したがって、このパスはs からtへの最短パスです。ki=1(d(s,vi)d(s,vi1)d(s,t)d(s,s)=d(s,t)stG

  • 最後に、Gに重みのないエッジがないことは、SGSは、がダグであるます。

ステップ2:ランダムパスをサンプリングします。今、私たちは中のエッジの重みを捨てることができますSを、そしてからランダムサンプリングし、パストンSSstS

これを支援するために、Sの各頂点vについてn v を計算する事前計算を行います。ここで、n v vからtまでの個別のパスの数をカウントします。この事前計算は、Sの頂点をスキャンすることにより線形時間で実行できます。n(v)vS、次の再帰関係を使用して、トポロジカルにソートされた順序。

N V = Σ W SUCC V N W

ここSUCCはV の後継示しVを、すなわち、SUCC V = { W Vはwが エッジである  S }、我々はベースケース有する場合、N Tの= 1

次に、n 注釈を使用してランダムパスをサンプリングします。私たちの最初の訪問ノードS。次に、sの後継者の1つをランダムに選択し、後継者wn 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または負の重みがある場合です。ただし、その場合、無限に多くの最短パスが存在する可能性があるため、問題は明確に定義されていない可能性があります。


あなたが私の答えを完全に得るのに時間を割いてくれてうれしいです。私はそれが正しいと確信していませんでした。今、私は立証されています:D。
リアルツスロー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.