- Algorithmus von Dinic
-
Der Algorithmus von Dinic ist ein Algorithmus aus der Graphentheorie zur Bestimmung eines maximalen s-t-Flusses in einem Netzwerk. Er wurde von E. A. Dinic (Jefim (Chaim) Dinic) entwickelt und 1970 publiziert. Er ist eine Weiterentwicklung des Edmonds-Karp-Algorithmus, den Dinic unabhängig von Jack Edmonds und Richard M. Karp entwickelte. Der Algorithmus von Dinic unterscheidet sich vom Edmonds-Karp-Algorithmus, indem in jedem Durchgang nicht nur an einem einzelnen kürzesten s-t-Weg augmentiert wird, sondern mitunter an größeren s-t-Flüssen, die sich aus mehreren kürzesten s-t-Wegen zusammensetzen.
Inhaltsverzeichnis
Der Algorithmus
Im Folgenden bezeichnet im Netzwerk (G,u,s,t) G den gerichteten Graphen, die Kapazitätsfunktion (wobei u(e) die Kapazität einer Kante e angibt), s den Knoten, von dem der Fluss startet, und t den Zielknoten des Flusses. V(G) bezeichnet die Knotenmenge des Graphen G und E(G) die Kantenmenge. Zu einem Fluss f bezeichnet Gf den Residualgraphen und den Schichtgraphen, also den Graphen, der sich mit G die Knotenmenge teilt und aus genau den Kanten besteht, die für beliebige Knoten u und v zu einem kürzesten s-v-Weg von Gf gehören. Insbesondere enthält auch alle Kanten, die zu einem kürzesten s-t-Weg in Gf gehören. uf bezeichnet die zum Residualgraph gehörige Residualkapazität. Ein Sperrfluss (auch blockierender Fluss genannt) in ist ein s-t-Fluss, der in jedem s-t-Weg in mindestens eine Kante auslastet. Zu einer Kante bezeichnet die zugehörige Rückkante des Residualgraphen.
Der Algorithmus arbeitet wie folgt:
- Setze f(e): = 0 für jede Kante .
- Bestimme den Schichtgraphen .
- Bestimme einen Sperrfluss g in .
- Falls g der Nullfluss ist, sind wir fertig, ansonsten augmentiere f entlang g (d.h. für jede Kante setze: (mit g(e): = 0, falls )) und springe zu 2.
Am Ende ist f ein maximaler s-t-Fluss, da es im Residualgraphen Gf keinen s-t-Weg mehr gibt.
Sperrfluss finden
Für Schritt 3 des Algorithmus kann ein Sperrfluss g in beispielsweise wie folgt berechnet werden:
- Setze g(e): = 0 für jede Kante .
- Setze .
- START
- P: = [s] (Weg aus nur einem Knoten ohne Kanten)
- v: = s
- springe zu VOR.
- VOR
- Falls in H keine Kante den Knoten v verlässt, springe zu ZURÜCK.
- Anderenfalls
- Wähle eine Kante (v,w) aus H.
- Verlängere P um (v,w).
- v: = w
- Falls , springe zu VOR.
- Falls v = t, springe zu AUGMENTIEREN.
- AUGMENTIEREN
- Augmentiere g längs P um so viel wie möglich (d.h. für setze für jedes ).
- Entferne die Kanten aus H, die dadurch ausgelastet werden.
- Springe zu START.
- ZURÜCK
- Falls v = s, ist g Sperrfluss, also STOP.
- Anderenfalls
- Sei (u,v) letzte Kante auf P.
- Verkürze P um (u,v).
- Entferne v und alle mit ihm inzidenten Kanten aus H.
- v: = u
- Springe zu VOR.
Am Ende dieses Verfahrens ist g Sperrfluss in . Sei m = | E(G) | und n = | V(G) | . Dieses Verfahren benötigt für die Berechnung eines Sperrflusses eine Laufzeit von . Denn jeder Aufruf von AUGMENTIEREN benötigt Laufzeit und jeder dieser Aufrufe nimmt eine Kante aus dem Graphen, also gibt es höchstens m dieser Aufrufe (denn der Schichtgraph hat höchstens m Kanten). Weil der Schichtgraph keine gerichteten Kreise enthält, kann zwischen zwei AUGMENTIEREN-Aufrufen jeder Knoten höchstens einmal durch eine VOR-Operation erreicht werden, also werden insgesamt höchstens solche durchgeführt; eine VOR-Operation kann in konstanter Laufzeit ausgeführt werden. In den ZURÜCK-Operationen wird jedes mal ein Knoten entfernt, also werden sie höchstens n-mal durchgeführt, alle ZURÜCK-Operationen zusammen haben eine Laufzeit von .
Anmerkung
E. A. Dinic arbeitete statt mit dem Schichtgraphen mit einem Teilgraphen, der genau aus den Knoten und Kanten besteht, die auf kürzesten s-t-Wegen liegen. Die Verwendung des Schichtgraphen funktioniert analog, vereinfacht aber die Beschreibung des Algorithmus.
Laufzeit
Sei m = | E(G) | und n = | V(G) | . Der Algorithmus von Dinic benötigt höchstens n − 1 Durchläufe. Der Schichtgraph kann mit Breitensuche in Laufzeit berechnet werden. Ein Sperrfluss in kann mit der oben angegebenen Methode in Laufzeit berechnet werden. Damit ergibt sich eine Gesamtlaufzeit von . Dies ist auch die Laufzeit, die von Dinic 1970 bewiesen wurde. Allerdings arbeitet der Goldberg-Tarjan-Algorithmus schneller.
Mit einer Verbesserung von Alexander Karzanov von 1974 lässt sich für den Algorithmus von Dinic auch eine Laufzeit von erreichen.
Quellen
- 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
- Helmut Alt: Vorlesungsskript Höhere Algorithmik, Wintersemester 2006/2007, Freie Universität Berlin.
Weblinks
- E. A. Dinic: Algorithm for solution of a problem of maximum flow in a network with power estimaton, 1970 – E. A. Dinics Veröffentlichung des Algorithmus
Wikimedia Foundation.