Goldberg-Tarjan-Algorithmus

Der Goldberg-Tarjan-Algorithmus, auch Push-Relabel-Algorithmus genannt, ist ein Algorithmus aus der Graphentheorie zur Berechnung eines maximalen Flusses in einem Netzwerk. Er wurde von Andrew Goldberg und Robert Endre Tarjan entwickelt und 1988 publiziert.[1]

Der Algorithmus

Im Folgenden bezeichnet im Netzwerk ( G , u , s , t ) {\displaystyle (G,u,s,t)} G {\displaystyle G} den gerichteten Graphen, u : E ( G ) R + {\displaystyle u\colon E(G)\rightarrow \mathbb {R} _{+}} die Kapazitätsfunktion (wobei u ( e ) {\displaystyle u(e)} die Kapazität einer Kante e {\displaystyle e} angibt), s {\displaystyle s} den Knoten, von dem der Fluss startet, und t {\displaystyle t} den Zielknoten des Flusses. V ( G ) {\displaystyle V(G)} bezeichnet die Knotenmenge des Graphen G {\displaystyle G} , E ( G ) {\displaystyle E(G)} die Kantenmenge und δ + ( v ) {\displaystyle \delta ^{+}(v)} die Menge der Kanten, die den Knoten v {\displaystyle v} verlassen.

Der Algorithmus berechnet einen maximalen s-t-Fluss, indem er einen s-t-Präfluss f {\displaystyle f} so lange modifiziert, bis er ein s-t-Fluss ist. Tritt dies ein, ist der erhaltene s-t-Fluss auch maximal. Der Algorithmus arbeitet des Weiteren mit einer Distanzmarkierung, d. h. mit einer Funktion ψ : V ( G ) N 0 {\displaystyle \psi \colon V(G)\rightarrow \mathbb {N} _{0}} mit ψ ( s ) = | V ( G ) | {\displaystyle \psi (s)=|V(G)|} , ψ ( t ) = 0 {\displaystyle \psi (t)=0} und für alle Kanten e = ( v , w ) G f :   ψ ( v ) ψ ( w ) + 1 {\displaystyle e=(v,w)\in G_{f}:\ \psi (v)\leq \psi (w)+1} . Eine Kante ( v , w ) E ( G f ) {\displaystyle (v,w)\in E(G_{f})} des Residualgraphen G f {\displaystyle G_{f}} heißt erlaubt, wenn sie ψ ( v ) = ψ ( w ) + 1 {\displaystyle \psi (v)=\psi (w)+1} erfüllt.

Der Algorithmus arbeitet wie folgt:

  1. Setze für alle Kanten e δ + ( s ) {\displaystyle e\in \delta ^{+}(s)} : f ( e ) := u ( e ) {\displaystyle f(e):=u(e)} , und für alle anderen Kanten e {\displaystyle e} : f ( e ) := 0 {\displaystyle f(e):=0} .
  2. Setze ψ ( s ) := | V ( G ) | {\displaystyle \psi (s):=|V(G)|} und für alle anderen Knoten v {\displaystyle v} : ψ ( v ) := 0 {\displaystyle \psi (v):=0} .
  3. Solange es einen aktiven Knoten v V ( G ) {\displaystyle v\in V(G)} gibt (d. h. einen Knoten v V ( G ) { s , t } {\displaystyle v\in V(G)\setminus \{s,t\}} , auf dem mehr Fluss ankommt als abfließt), wähle so einen Knoten v {\displaystyle v} und führe aus:
    Wenn im Residualgraphen G f {\displaystyle G_{f}} keine erlaubte Kante den Knoten v {\displaystyle v} verlässt, setze ψ ( v ) := min { ψ ( w ) + 1 e E ( G f ) : e = ( v , w ) } {\displaystyle \psi (v):=\min\{\psi (w)+1\mid \exists e\in E(G_{f}):e=(v,w)\}}
    Ansonsten augmentiere f {\displaystyle f} entlang einer erlaubten Kante e {\displaystyle e} , die v {\displaystyle v} verlässt (d. h.: Falls e E ( G ) {\displaystyle e\in E(G)} ist, setze f ( e ) := f ( e ) + min { u f ( e ) , ex ( v ) } {\displaystyle f(e):=f(e)+\min\{u_{f}(e),\operatorname {ex} (v)\}} ; andernfalls ist e E ( G f ) E ( G ) {\displaystyle e\in E(G_{f})\setminus E(G)} , und somit e = g {\displaystyle e={\overleftarrow {g}}} Rückkante einer Kante g E ( G ) {\displaystyle g\in E(G)} , dann setze f ( g ) := f ( g ) min { u f ( e ) , ex ( v ) } {\displaystyle f(g):=f(g)-\min\{u_{f}(e),\operatorname {ex} (v)\}} . Hierbei bezeichnen u f {\displaystyle u_{f}} die Residualkapazitäten und ex ( v ) {\displaystyle \operatorname {ex} (v)} den Überschuss am Knoten v {\displaystyle v} , also die Differenz des an v {\displaystyle v} ankommenden und des abfließenden Flusses.).

Eine Modifikation des Flusses f {\displaystyle f} in Schritt 3 wird auch „Push“ genannt, eine Modifikation der Distanzmarkierung ψ {\displaystyle \psi } „Relabel“. Daher rührt der Name Push-Relabel-Algorithmus.

Am Ende ist f {\displaystyle f} ein maximaler s-t-Fluss. Denn zu jedem Zeitpunkt ist der Knoten s {\displaystyle s} die einzige Quelle und der Algorithmus hält erst an, wenn der Knoten t {\displaystyle t} die einzige Senke ist. Da ψ {\displaystyle \psi } stets eine Distanzmarkierung bleibt und damit die oben beschriebenen Eigenschaften erfüllt, ist gewährleistet, dass im Residualgraphen G f {\displaystyle G_{f}} der Knoten t {\displaystyle t} niemals von der Quelle s {\displaystyle s} aus erreichbar ist. Damit ist sichergestellt, dass der vom Algorithmus berechnete s-t-Fluss tatsächlich ein maximaler s-t-Fluss ist.

Laufzeit

So allgemein wie oben angegeben hat der Algorithmus eine Laufzeit von O ( | V ( G ) | 2   | E ( G ) | ) {\displaystyle {\mathcal {O}}(|V(G)|^{2}\ |E(G)|)} .

Wählt man in Schritt 3 des Algorithmus immer einen aktiven Knoten v {\displaystyle v} , für den unter allen aktiven Knoten die Distanzmarkierung ψ {\displaystyle \psi } maximalen Wert hat (also ein v {\displaystyle v} mit ψ ( v ) = max { ψ ( x ) x  ist aktiver Knoten } {\displaystyle \psi (v)=\max\{\psi (x)\mid x{\text{ ist aktiver Knoten}}\}} ), lässt sich eine Laufzeit von O ( | V ( G ) | 2 | E ( G ) | ) {\displaystyle {\mathcal {O}}(|V(G)|^{2}{\sqrt {|E(G)|}})} beweisen. Bei der Implementierung erfordert dies jedoch, dass für jeden Wert i {\displaystyle i} von 0 {\displaystyle 0} bis 2 | V ( G ) | 2 {\displaystyle 2{\mathopen {|}}V(G){\mathclose {|}}-2} jeweils eine Liste aller aktiven Knoten v {\displaystyle v} mit ψ ( v ) = i {\displaystyle \psi (v)=i} geführt wird (also für jeden Wert, den ψ {\displaystyle \psi } theoretisch annehmen kann), zusätzlich muss das jeweils aktuelle Maximum von ψ {\displaystyle \psi } auf der Menge der aktiven Knoten nachgehalten werden. Dies ist erforderlich, damit in jedem Durchlauf der Schleife ein aktiver Knoten v {\displaystyle v} mit maximalen ψ ( v ) {\displaystyle \psi (v)} ohne Laufzeitverlust gewählt werden kann.

Mit ausgeklügelteren Implementierungen lassen sich auch Laufzeiten von

O ( | V ( G ) |   | E ( G ) |   log 2 + | E ( G ) | | V ( G ) | log ( | V ( G ) | ) ( | V ( G ) | ) ) {\displaystyle {\mathcal {O}}(|V(G)|\ |E(G)|\ \log _{2+{\frac {|E(G)|}{|V(G)|\log(|V(G)|)}}}(|V(G)|))}

und

O ( min { | E ( G ) | , | V ( G ) | 2 3 }   | E ( G ) |   log ( | V ( G ) | 2 | E ( G ) | )   log ( u max ) ) {\displaystyle {\mathcal {O}}(\min\{{\sqrt {|E(G)|}},{\sqrt[{3}]{|V(G)|^{2}}}\}\ |E(G)|\ \log \left({\frac {|V(G)|^{2}}{|E(G)|}}\right)\ \log(u_{\max }))}

erreichen[2]. Hierbei bezeichnet u max {\displaystyle u_{\max }} den maximalen Wert der Kapazitätsfunktion u {\displaystyle u} .

Quellen

  • Dieter Jungnickel: Graphs, Networks and Algorithms, Springer (1998) ISBN 978-3-540-72779-8
  • Bernhard Korte, Jens Vygen: Kombinatorische Optimierung: Theorie und Algorithmen. Aus dem Englischen von Rabe von Randow. Springer-Verlag, Berlin Heidelberg 2008, ISBN 978-3-540-76918-7
  • Alexander Schrijver: Combinatorial Optimization: Polyhedra and Efficiency, Springer-Verlag, 2003, ISBN 3-540-44389-4

Einzelnachweise

  1. Andrew Goldberg, Robert Tarjan: A new approach to the maximum flow problem. In: Journal of the ACM. Band 35, 1988, S. 921–940. 
  2. Bernhard Korte, Jens Vygen: Combinatorial Optimization. 3. Auflage. 2006, S. 168.