|
|
Lexikon auf Ihrer Homepage |
|
Lexikon als Lesezeichen hinzufügen |
Der Algorithmus von Ford und Fulkerson (nach seinen Erfindern Lester Randolph Ford junior und Delbert Ray Fulkerson[1]) dient der Berechnung eines maximalen s-t-Flusses in einem Netzwerk. Er sucht sukzessiv nach flussvergrößernden Pfaden im Residualgraphen (Restnetz), vergrößert den Fluss entlang dieser Pfade und hält an, falls kein solcher Pfad mehr existiert. Wenn die Kapazitäten der Kanten irrationale Zahlen sind, kann es sein, dass der Algorithmus nicht konvergiert. Außerdem kann der Algorithmus, bei ungeschickter Verteilung der Kapazitäten, eine schlechte Laufzeit haben. Er dient als Grundlage für den besseren Edmonds-Karp-Algorithmus.
Inhaltsverzeichnis |
Gegeben sei ein Netzwerk <math>N = (G,u,s,t)</math>, bestehend aus einem endlichen, gerichteten Graphen <math>G=(V(G), E(G))</math> mit einer Quelle <math> s\in V(G)</math>, einer Senke <math>t\in V(G)</math> und einer Kapazitätsfunktion <math>u:E(G)\to\mathbb{R}_{\geq 0}</math>, die jeder Kante <math>e</math> eine nichtnegative reelle Zahl <math>u(e)</math> als Kapazität zuordnet.
Der Algorithmus verändert in jedem Durchlauf einen s-t-Fluss im Netzwerk <math>N</math>, also eine Abbildung <math>f:E(G)\to\mathbb{R}_{\geq 0}</math> mit den Eigenschaften
Hierbei bezeichnet <math>\delta^+(x)</math> die Menge der aus <math>x</math> hinausführenden Kanten und <math>\delta^-(x)</math> die Menge der in <math>x</math> hineinführenden Kanten.
Der Algorithmus sucht in jedem Schritt einen Weg von <math>s</math> nach <math>t</math> im Residualgraphen. Der Residualgraph <math>G_f</math> teilt sich mit <math>G</math> dieselbe Knotenmenge und enthält die Kanten von <math>G</math>, die von <math>f</math> nicht ausgelastet sind, ergänzt um sogenannte Rückkanten: Für jede Kante <math>e=(v, w)\in E(G)</math> mit <math>f(e)>0</math> enthält <math>E(G_f)</math> jeweils zusätzlich eine Rückkante <math>\overleftarrow{e}=(w,v)</math>. Formal gilt also: <math>G_f = (V(G), \{e\in E(G) \mid f(e)0 \ \and \ \overleftarrow{e}=(w,v)\})</math> Dazu werden Residualkapazitäten <math>u_f</math> definiert, die jeder Kante <math>e\in E(G)</math> zuordnen, um wie viel der Fluss <math>f</math> auf <math>e</math> noch erhöht werden kann, und jeder Rückkante <math>\overleftarrow{e}\in E(G_f)\setminus E(G)</math> zuordnen, um wie viel der Fluss auf der zugehörigen Hinkante <math>e\in E(G)</math> verringert werden kann. Also formal:
<math>u_f(e) = \begin{cases} u(e) - f(e) & \text{wenn } e\in E(G) \\ f(g) & \text{wenn } e=\overleftarrow{g} \text{ die R}\mathrm{\ddot u}\text{ckkante der Kante } g \text{ ist.} \end{cases} </math>
Zur Initialisierung kann man den Nullfluss, der jeder Kante <math>e</math> den Wert 0 zuordnet, verwenden. Der Algorithmus beschreibt sich wie folgt:
Sind alle Kapazitäten rational, berechnet der Algorithmus nach endlich vielen Schritten einen maximalen s-t-Fluss.
| Gegeben sei ein Netzwerk mit vier Knoten <math>q,u,v,s</math> und den Kapazitäten 1, 2, 3, 4, 6 wie in der Grafik. Gesucht ist ein maximaler q-s-Fluss.
Initialisiere den Fluss mit <math>f_0((q,u))=f_0((q,v))=f_0((u,v))=f_0((u,s))=f_0((v,s))=0</math>. |
|
| 1. (a) Wähle irgendeinen Pfad von <math>q</math> nach <math>s</math>. Dieser Pfad (in der Grafik blau) hat die Kapazität 3, da dies die minimale Kantenkapazität der Kanten auf dem Pfad ist.
Vergrößere den Fluss entlang des Pfades um 3, dies ergibt <math>f_1((q,u))=f_1((u,v))=f_1((v,s))=3</math>, es bleibt <math>f_1((q,v))=f_1((u,s))=0</math>. |
|
| 1. (b) Bilde das Residualnetzwerk <math>N_{f_0}</math>. Hier verringern sich die Kapazitäten der Kanten <math>(q,u)</math> und <math>(v,s)</math>, die Kante <math>(u,v)</math> fällt weg, dafür kommen drei Rückkanten <math>(u,q)</math>, <math>(v,u)</math> und <math>(s,v)</math> hinzu, die rot dargestellt sind. Auf diesen ergeben sich die Residualkapazitäten <math>u_{f_1}((u,q))=u_{f_1}((v,u))=u_{f_1}((s,v))=3</math>. | |
| 2. (a) Wähle irgendeinen Pfad von <math>q</math> nach <math>s</math> im Residualnetzwerk. Der in der Grafik blau gezeichnete Weg hat die minimale Kapazität 1.
Vergrößere den Fluss entlang des Pfades um eins, dies ergibt <math>f_2((q,u))=f_2((v,s))=3</math>, <math>f_2((u,v))=2</math> und <math>f_2((q,v))=f_2((u,s))=1</math>. |
|
| 2. (b) Bilde das Residualnetzwerk <math>N_{f_2}</math>, worin der Fluss <math>f_2</math> zu sehen ist. Die Kapazität der Kante (q,v) verringert sich um eins und eine neue Rückkante (v,q) wird gebildet. Die Kapazität der Kante (u,v) erhöht sich um eins, so dass die Hinkante (u,v) wieder entsteht. Die Kapazität der Kante (u,s) wird um eins verringert, wodurch die Hinkante (u,s) entfernt wird. Es ergeben sich die Residualkapazitäten <math> u_f((v,q))=u_f((s,u))=1,\ u_f((v,u))=2,\ u_f((u,q))=u_f((s,v))=3</math> | |
| 3. (a) Wähle irgendeinen Pfad von <math>q</math> nach <math>s</math> im Residualnetzwerk.
Der hier Gewählte (blau markiert) hat die Kapazität 1, also ist <math>f_3((q,u))=f_3((v,s))=4</math>, <math>f_3((u,v))=3</math>, und <math>f_3((q,v))=f_3((u,s))=1</math>. |
|
| 3. (b) Bilde das Residualnetzwerk <math>N_{f_3}</math>; darin findet man den Fluss <math>f_3</math> durch Umkehrung der roten Kanten. | |
| 4. (a) Wähle irgendeinen Pfad im Residualnetzwerk <math>N_{f_3}</math> von <math>q</math> nach <math>s</math>: In dieser Situation gibt es nur noch einen Pfad, nämlich <math>(q,v,s)</math>. Dieser hat die minimale Kapazität eins.
Es ergibt sich <math>f_4((q,u))=4,\quad f_4((q,v))=2,\quad f_4((u,v))=3,\quad f_4((u,s))=1,\quad f_4((v,s))=5</math>. |
|
| 4. (b) Bilde das Residualnetzwerk <math>N_{f_4}</math>. In <math>q</math> kommen nur noch Kanten an, es gibt also keinen Weg mehr von <math>q </math> nach <math>s</math>. Damit ist <math>f_4</math> ein maximaler Fluss durch das eingangs gegebene Netzwerk. |
Der Algorithmus stoppt hier, da im verbliebenen Residualnetzwerk kein Pfad von <math>q</math> nach <math>s</math> mehr existiert. Den erreichten Fluss <math>f_4</math> sieht man, indem man zu jeder roten Kante ihre Zahl als Größe des Flusses auf der umgedrehten Kante nimmt. Die verbleibenden schwarzen Kanten geben die unbenutzten Residualkapazitäten an.
Ford und Fulkerson konnten beweisen, dass ein s-t-Fluss <math>f</math> in einem Netzwerk <math>N</math> genau dann maximal ist, wenn es keinen augmentierenden Pfad gibt, d.h., wenn das Restnetzwerk <math>N_f</math> keinen Pfad von <math>s</math> nach <math>t</math> besitzt. Daher gilt:
Dabei muss der maximale s-t-Fluss nicht eindeutig bestimmt sein.
Bei der Durchführung des Algorithmus vergrößert sich der betrachtete Fluss mit jedem Schritt. Daraus folgt eine wichtige Tatsache für ganzzahlige Netzwerke:
Sind alle Kapazitäten rationale Zahlen, so erhält man durch Multiplikation mit dem Hauptnenner ein ganzzahliges Netzwerk, und kann so die folgende Aussage beweisen:
Falls irrationale Zahlen als Kapazitäten vorkommen, gilt das nicht mehr: Ford und Fulkerson konstruierten ein Beispiel eines Netzwerkes mit 10 Knoten und 48 Kanten, bei dem ihr Algorithmus bei geeigneter Auswahl der augmentierenden Pfade nicht zum Stehen kommt und auch nicht gegen einen maximalen Fluss konvergiert[2]. Im Jahr 1995 fand Uri Zwick ein Beispiel mit 6 Knoten und 8 Kanten und einem derartigen Verhalten[3].
Einerseits benötigt jeder Schleifendurchlauf des Algorithmus lediglich <math> \mathcal{O}(|V(G)|+|E(G)|) </math> Zeit (siehe Landau-Notation), aber andererseits hängt die benötigte Anzahl der Schleifendurchläufe von der Größe der Kapazitäten ab. Es ist möglich, die flussvergrößernden Pfade sehr ungünstig zu wählen.
Wählt man in jedem Schritt immer einen kürzesten augmentierenden Pfad zur Vergrößerung des Flusses, so erhält man den Algorithmus von Edmonds und Karp, der stets in Laufzeit <math> \mathcal{O}(|V(G)| \cdot |E(G)|^2) </math> einen maximalen s-t-Fluss konstruiert. Eine weitere Verbesserung mit Hilfe zusätzlicher Techniken bringt der Algorithmus von Dinic mit einer (worst-case)-Komplexität von <math> \mathcal{O}(|V(G)|^2 \cdot |E(G)|) </math>.