Effizientes Abtasten kürzester


14

Lassen ein Graph, und sei und zwei Eckpunkten sein . Können wir effizient einen kürzesten - - Pfad gleichmäßig und unabhängig von der Menge aller kürzesten Pfade zwischen und zufällig ? Der Einfachheit halber können wir annehmen, dass einfach, ungerichtet und ungewichtet ist.GstGststG

Selbst in vielen eingeschränkten Graphen kann die Anzahl der kürzesten Pfade zwischen und in der Größe von exponentiell sein . Deshalb möchten wir natürlich wie vermeiden Berechnung tatsächlich alle kürzesten - Pfade. Ich weiß nichts über den allgemeinen Fall, aber es scheint mir, dass wir dies für einige spezielle Grafikklassen erreichen können.stGst

Das fühlt sich an, als hätte jemand schon einmal darüber nachgedacht. Gibt es Forschungsergebnisse dazu oder ist dies sogar für allgemeine Grafiken einfach durchzuführen?


Gute Frage, Juho. Was verstehen Sie genau, wenn Sie über eine Antwort nachdenken, indem Sie "einen st-Pfad gleichmäßig nach dem Zufallsprinzip abtasten"? Wenn es ausreicht, dass s und t zufällig aufgenommen werden, ist die Frage trivial, und ich vermute, Sie meinen, dass alle Knoten auf dem kürzesten Weg mit einer Häufigkeit (dh Wahrscheinlichkeit) auftreten, die einer gleichmäßigen Verteilung folgt. Oder gibt es eine andere Definition? Insbesondere bei zweiteiligen Diagrammen scheint Ihre Frage sehr einfach zu sein, nicht wahr?
Carlos Linares López

1
@ CarlosLinaresLópez Betrachten Sie beispielsweise das Diamantdiagramm , und sagen Sie, befindet sich auf der rechten Seite der "vertikalen Kante", und befindet sich auf der linken Seite. Jetzt gibt es 2 kürzeste Wege zwischen und . Der Algorithmus sollte mit gleicher Wahrscheinlichkeit einen dieser beiden Pfade zurückgeben. So und nicht „abgeholt zufällig“, aber sie sind als Input gegeben. Macht das klar? In diesem Sinne bin ich mir nicht sicher, ob das Problem für zweigliedrige Graphen wirklich einfach ist. ststst
Juho

1
@ CarlosLinaresLópez Mit anderen Worten, wir erhalten einen Graphen und zwei Eckpunkte . Sei die Menge aller kürzesten Wege zwischen und . Gib ein Element vons , t V ( G ) S s t SGs,tV(G)SstS gleichmäßig nach dem Zufallsprinzip aus.
Juho

Antworten:


6

Ich bin nicht zu 100% sicher, dass diese Antwort richtig ist, aber hier ist:

Ich denke, Sie können dies in einer DAG mit einer einzigen Quelle und einer einzigen Senke auf gleichmäßig zufällige beliebige Pfade von reduzieren .st

Gegeben ein Diagramm G

  1. Machen Sie einen neuen leeren digraph, .H
  2. Erstens: das BFS Teil Dijkstra kürzesten Weg laufen, ausgehend von mit ihrem kürzesten Abstand-von- alle Knoten markieren s .ss
  3. Sei der minimale Abstand von s - v ; Das wissen wir aus dem BFS-Schritt des Dijkstra-Algorithmus für kürzeste Wege.d(s,v)sv
  4. Führen Sie dann den nächsten Schritt des Dijkstra-Algorithmus für den kürzesten Pfad aus, ermitteln Sie den kürzesten Pfad und speichern Sie ihn in (indem Sie von t nach s zurückgehen ).pts
  5. Starten Sie nun die folgende Schleife; Erklärung in Kommentaren und unten:
    • q0={t}
    • Während q0
      • q1=
      • Für uq0
        • Wir wollen also alle möglichen nächsten Knoten für diesen kürzesten Unterpfad von tu
        • Für alle so dass d ( s , v ) < d ( s , u )edge(u,v)Gd(s,v)<d(s,u)
          • ist ein benachbarter Knoten mit weniger d ( s , ) (es wird 1 weniger sein)vd(s,)1
          • Daher ist ein möglicher Unterpfad auf einem kürzesten Pfad.tuv
          • Setzen Sie vH,di-edge(u,v)H
          • Jetzt müssen wir die Nachbarn von der nächsten Runde überprüfen .v
          • Setzen Sie vq1
      • Setze auf q 1 : q0q1
        • q0q1

Im Wesentlichen sammle ich alle möglichen Knoten , die in dem kürzesten Pfad verwendet werden können, und sie bei der Platzierung .H

Mehr darüber, wie das funktioniert:

Dijkstra Shortest-Path - Algorithmus arbeitet , indem zuerst ein BFS ausgeführt wird , und die Kennzeichnung aller Knoten mit ihren kürzesten Pfaden von s - v . Der nächste Schritt besteht darin, von t - s zurückzukehren und den am wenigsten benachbarten Knoten zu folgen.vGsvts

Die Sache ist, hier können Sie einen der am wenigsten benachbarten Knoten auswählen . Was ich hier mache, ist, bei jedem Schritt alle am wenigsten benachbarten Knoten zu sammeln , was bedeutet, dass ich alle kürzesten Pfade erkläre.

Jetzt überlegst du schnell, aber hey, warum zählt du sie exponentiell auf, aber mein Weg ist es nicht?

Die Antwort lautet: Da ich ein Set verwende, um zu vermeiden, dass dieselben Knoten zweimal hinzugefügt werden, vermeide ich es, dies für jeden möglichen Pfad neu zu berechnen.

Jetzt haben wir eine DAG, die wir in beliebiger Weise von durchlaufen können , und erhalten einen kürzesten umgekehrten Pfad von sts . Das Diagramm sollte t als einzige Quelle und s als einzige Senke haben.stts


Wenn das oben Gesagte zutrifft, können wir meines Erachtens noch einen Schritt weiter gehen und das Problem wie folgt lösen.

Geben Sie jedem Knoten in der DAG ein Knotengewicht. Das Knotengewicht ist die Anzahl der Pfade von diesem Knoten zu . Nennen wir dies w ( v ) .sw(v)

Sie können diese schnell berechnen, siehe Algorithmus, der die Anzahl der einfachen Pfade von s nach t in G ermittelt .

Sobald wir das Knotengewicht haben, können wir einen Pfad einheitlich auswählen, indem wir:

  • Layout der DAG als Ebene-Struktur (zur Visualisierung)
  • Wählen Sie auf jeder Ebene eine beliebige Reihenfolge zwischen den Knoten, z. ein Begriff von "von links nach rechts".
  • Durchlaufen der DAG: Bei jedem Schritt , i [ 1 , | p | ] (woii[1,|p|] in diesem Fall die Länge des kürzesten Pfades bedeutet): ||
    • Sei der aktuelle Knoten (ab t )uit
    • Addiere alle Gewichte der Kinder von und wähle unter Verwendung eines RNG einen Kindknoten v i gleichmäßig zwischen den gewichteten Kindern.uivi
    • Setze und gehe zum nächsten Schrittui+1=vi

Die Ebenenstruktur und der Begriff von links nach rechts waren Teil meines anfänglichen Versuchs, einfach zu generieren und einen Pfad auf diese Weise zu wählen, aber ich habe das nicht herausgefunden Sie können sie ignorieren. r[0,w(t))
Realz Slaw

1
Diese Antwort sieht gut aus! Ich liebe die Ideen! Ich habe versucht, es auf eine etwas andere Art und Weise (in meiner Antwort) niederzuschreiben, um mein Verständnis zu testen. Auf jeden Fall wollte ich nur meine Wertschätzung für diese schöne Antwort teilen!
DW

5

Hier ist eine Lösung, die auf den Ideen in der Antwort von Realz Slaw basiert. Es ist im Grunde eine Neuausstellung seiner Ideen, die klarer oder leichter zu befolgen sein könnte. Der Plan ist, dass wir in zwei Schritten vorgehen:

  1. Zunächst erstellen wir einen Graphen mit der folgenden Eigenschaft: Jeder Weg von s nach t in S ist ein kürzester Weg von s nach t in G , und jeder kürzeste Weg von s nach t in G ist auch in S vorhanden . Somit enthält S genau die kürzesten Wege in G : alle kürzesten Wege und nichts weiter. Wie es passiert, wird S eine DAG sein.SstSstGstGSSGS

  2. Als nächstes werden wir alle Pfade von bis t in S gleichmäßig zufällig abtasten .stS

Dieser Ansatz verallgemeinert sich auf einen willkürlich gerichteten Graphen , solange alle Kanten ein positives Gewicht haben. Deshalb erkläre ich meinen Algorithmus in diesen Begriffen. Sei w ( u , v ) das Gewicht an der Kante u v . (Dies verallgemeinert die Problemaussage, die Sie gegeben haben. Wenn Sie ein ungewichtetes Diagramm haben, nehmen Sie einfach an, dass jede Kante das Gewicht 1 hat. Wenn Sie ein ungerichtetes Diagramm haben, behandeln Sie jede ungerichtete Kante ( u , v ) als die zwei gerichteten Kanten u v und v uGw(u,v)uv(u,v)uvvu .)


Schritt 1: Extrakt . S Führen Sie einen Single-Source-Shortest-Path-Algorithmus (z. B. Dijkstra-Algorithmus) auf , beginnend mit Quelle s . Für jeden Eckpunkt v in G bezeichne d ( s , v ) den Abstand von s zu v .GsvGd(s,v)sv

Now define the graph S as follows. It consists of every edge uv such that (1) uv is an edge in G, and (2) d(s,v)=d(s,u)+w(u,v).

The graph S has some convenient properties:

  • Every shortest path from s to t in G exists as a path in S: a shortest path s=v0,v1,v2,,vk=t in G has the property that d(s,vi+1)=d(s,vi)+w(vi,vi+1), so the edge vivi+1 is present in S.

  • Every path in S from s to t is a shortest path in G. In particular, consider any path in S from s to t, say s=v0,v1,v2,,vk=t. Its length is given by the sum of the weights of its edges, namely i=1kw(vi1,vi), but by the definition of S, this sum is i=1k(d(s,vi)d(s,vi1), which telescopes to d(s,t)d(s,s)=d(s,t). Therefore, this path is a shortest path from s to t in G.

  • Finally, the absence of zero-weight edges in G implies that S is a dag.

Step 2: sample a random path. Now we can throw away the weights on the edges in S, and sample a random path from s to t in S.

To help with this, we will do a precomputation to compute n(v) for each vertex v in S, where n(v) counts the number of distinct paths from v to t. This precomputation can be done in linear time by scanning the vertices of S in topologically sorted order, using the following recurrence relation:

n(v)=wsucc(v)n(w)

where succ(v) denotes the successors of v, i.e., succ(v)={w:vw is an edge in S}, and where we have the base case n(t)=1.

Next, we use the n() annotation to sample a random path. We first visit node s. Then, we randomly choose one of the successors of s, with successor w weighted by n(w). In other words:

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

To choose a random path, we repeatedly iterate this process: i.e., v0=s, and vi+1= choosesuccessor(vi). The resulting path is the desired path, and it will be sampled uniformly at random from all shortest paths from s to t.

Hopefully this helps you understand Realz Slaw's solution more easily. All credit to Realz Slaw for the beautiful and clean solution to this problem!


The one case this doesn't handle is the case where some edges have weight 0 or negative weight. However, the problem is potentially not well-defined in that case, as you can have infinitely many shortest paths.


Glad you took the time to fully get my answer; I wasn't sure it is correct. Now I am vindicated :D.
Realz Slaw
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.