Jan-Philipp Kappmeier Berechnung maximaler Flüsse unter Vermeidung von Residualnetzwerken Diplomarbeit im Studiengang Informatik 21.01.2009 21.07.2009 INTERNE BERICHTE INTERNAL REPORTS COGA Fakultät II Technische Universität Berlin Lehrstuhl XI Fakultät für Informatik Technische Universität Dortmund Gutachter: Prof. Dr. Martin Skutella Prof. Dr. Petra Mutzel GERMANY · D-44221 DORTMUND Ich danke meiner Freundin Manuela Becker für das Korrekturlesen der Arbeit, sowie für jegliche Unterstützung. Dirk Koesling, Ann-Christine Pozun und Lars Riedel danke ich für das Korrekturlesen meiner Diplomarbeit, Daniel Plümpe und Melanie Schmidt danke ich für zahlreiche Anmerkungen, interessante Diskussionen und ebenfalls fürs Korrekturlesen. Prof. Dr. Martin Skutella danke ich für die Vergabe des spannenden Themas und der Betreuung der Arbeit, sowie Prof. Dr. Petra Mutzel für die Zweitkorrektur. Ich danke der Arbeitsgrupe COGA für interessante Kaeepausen im Café Nerdlich und das Ziehen von Zufallszahlen. Meinen Eltern danke ich dafür, dass sie mir das Studium ermöglicht haben. Inhaltsverzeichnis 1 Einleitung 1 2 Grundlagen 5 2.1 Lineare Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Graphen und Netzwerke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.3 Das Max-Flow-Min-Cut-Theorem . . . . . . . . . . . . . . . . . . . . . . . . 13 2.4 Das abstrakte Graphmodell 16 3 Maximale Flüsse 3.1 3.2 4 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Flussaugmentierende Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.1.1 Das Ford-und-Fulkerson-Prinzip . . . . . . . . . . . . . . . . . . . . . 21 3.1.2 Algorithmus von Edmonds und Karp . . . . . . . . . . . . . . . . . . 24 Das Abstrakte-Fluss-Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.2.1 Vorüberlegungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.2.2 Pfade nden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.2.3 Pfad zusammensetzen . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.2.4 Der Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Der AbstractMaxFlow-Algorithmus 41 4.1 Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.1.1 Übertragung auf kantenbasierte Netzwerke . . . . . . . . . . . . . . . 41 4.1.2 Optimierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.2 Analyse 4.3 Empirische Ergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zusammenfassung und Ausblick 66 77 Notationsverzeichnis 78 Literaturverzeichnis 84 Sachverzeichnis 85 i 1 Einleitung Das in dieser Arbeit behandelte Problem, einen maximalen Fluss zu berechnen, hat eine lange Tradition. Bereits 1781 gab Monge eine mathematische Formulierung für Transport- probleme an [29]. Dabei geht es darum, Objekte von Orten, an denen sie angeboten werden, zu Orten, an denen sie nachgefragt werden, zu verschicken. Es kann dabei mehrere mögliche Optimierungsziele geben. Auÿer dem Ziel, möglichst viel zu verschicken, kann das Ziel sein, die Waren möglichst günstig oder schnell zu verschicken. Graphen spielen in vielen Anwendungen eine wichtige Rolle und können auch eingesetzt werden, um Transportprobleme zu modellieren. Die auch heute noch wichtige Problemstellung, den Transport über ein Schienennetz zu optimieren [31], lässt sich ebenfalls als Graphenproblem darstellen. Für eine eziente Organisation des Güterverkehrs ist es zweifellos wichtig, den Fluss zwischen verschiedenen Punkten im Netzwerk zu maximieren. Harris und Ross [17] betrachteten, wie man ein solches Schienennetz möglichst leicht durchtrennen kann, so dass zwei Städte nicht mehr miteinander in Verbindung stehen. Durch diese Überlegungen angestoÿen entdeckten Ford und Fulkerson 1956 [10] ihr berühmtes Resultat: das Max-Flow-Min-Cut-Theorem, das besagt, dass in einem Netzwerk der Wert eines maximalen Flusses dem eines minimalen Schnittes entspricht. Es wurde unabhängig von Elias, Feinstein und Shannon [8] gefunden. Gleichzeitig haben Dantzig und Fulkerson [5] einen auf dem Dualitätssatz für lineare Programme [30, Korollar 7.1g] basierenden Beweis gefunden. Flüsse haben auÿer der ursprünglichen Fragestellung vielfältige Anwendungen. Beim Problem der maximalen Paarung sollen jeweils zwei Elemente zweier disjuntker Mengen zu einem Paar zusammengefasst werden. Jedes dieser Elemente hat dabei gewisse Einschränkungen, mit welchen Elementen der anderen Menge es ein Paar bilden kann. Dieses Problem lässt sich als bipartiter Graph modellieren und eine passende (maximale) Paarung 1 kann durch die Berechung eines maximalen Flusses bestimmt werden [34, Kapitel 4.4]. Ein weiteres Problem, das sich mit maximalen Flüssen lösen lässt, ist das Problem. Job-Zuteilungs- Dabei gibt es Aufgaben mit verschiedenen Bearbeitungszeiten und Angestellte, von denen bekannt ist, wer welche Aufgabe übernehmen kann. Das Ziel ist, für jeden Arbeiter festzulegen, wie lange er an welcher Aufgabe arbeitet, so dass alle Aufgaben in kürzester Zeit fertiggestellt sind. Ein populäres Problem ist das 1 Meisterschaftsproblem, bei dem für Dieses Problem wird auch Heiratsproblem genannt. Die Mengen entsprechen den Männern und Frauen. Das Ziel ist, möglichst viele Ehen mit Partnern, die sich auch mögen, zu schlieÿen. 1 1 Einleitung Abbildung 1.1: Das von Harris und Ross betrachtete Problem: wie lässt sich (militärisch) das Schienennetz der Sowjetunion möglichst ezient trennen, so dass der Osten und Westen nicht mehr miteinander in Verbindung stehen. Das Schienennetz ist abstrakt als Graph mit geschätzten Kapazitäten dargestellt. eine Liga herausgefunden werden soll, ob ein bestimmter Verein noch Meister werden kann. Mit einer (0 : 1 : 2)-Punkteaufteilung, die bis 1995 auch in der deutschen Fuÿballbundes- liga angewandt worden ist, kann dieses Problem durch die Berechnung eines maximalen Flusses gelöst werden[34, Kapitel 4.4]. Im Bereich der Netzwerküsse deckt die Forschung eine Vielzahl von Anwendungen ab, für die Flüsse mit verschiedenen Eigenschaften benötigt werden. Wenn das Verschicken von Gütern über bestimmte Kanten unterschiedliche Kosten verursacht, ist die Berechnung kostenminimaler Flüsse interessant. Mehrgüterüsse decken Szenarien ab, bei denen verschiedene Güter nur von bestimmten Startpunkten zu bestimmten Endpunkten verschickt werden können. Eine besonders aktuelle Forschungsrichtung beschäftigt sich mit dynamischen Flüssen, die bereits 1962 von Ford und Fulkerson in ihrem Buch über Flüsse [11, Kapitel 3.9] erwähnt worden sind. In diesem Modell wird für das Durchlaufen einer Kante eine gewisse Zeit benötigt. Dieses Modell ist zweifellos realistischer als das Standardmodell, aber auch deutlich schwieriger handzuhaben. Eine wichtige Anwendung ist die Modellierung von Evakuierungsszenarien, in denen Zeit eine wichtige Rolle spielt. Eine Einführung in dynamische Flüsse ndet sich in [32]. Angesichts dieser Vielzahl verschiedener Flussprobleme ist die Forschung an der grundlegenden Fragestellung, einen maximalen Fluss zu bestimmen, interessant. Nicht nur, um das Problem schneller zu lösen, sondern auch, um grundlegende Einsichten in die Natur und Struktur von Netzwerküssen zu gewinnen (wie zum Beispiel das Max-Flow-Min-CutTheorem). 2 Der erste Beweis des Max-Flow-Min-Cut-Theorems ist nicht konstruktiv und liefert keinen Algorithmus zur Berechnung von maximalen Flüssen (oder eines minimalen Schnittes). Als lineares Problem kann man einen maximalen Fluss (und Lösungen für alle Arten von Transportproblemen) mit dem Simplex-Algorithmus [4] berechnen. Mit dem NetzwerkSimplex-Algorithmus gibt es eine auf Flussprobleme spezialisierte Variante des Algorithmus [1, Kapitel 11]. Ford und Fulkerson veröentlichten 1957 [9] einen Algorithmus zum Berechnen maximaler Flüsse in gerichteten Netzwerken, der das nach ihnen benannte begründete. Sie benutzten zum Berechnen Rückwärtskante Ford-Fulkerson-Prinzip Residualnetzwerke, in denen zu jeder Kante eine existiert. In solchen Netzwerken kann ein maximaler Fluss durch schritt- weises Hinzufügen von augmentierenden Pfaden berechnet werden. Während die erste Ver- sion noch pseudopolynomielle Laufzeit hatte, wurden 1970 von Dinic [6] und 1972 von Edmonds und Karp [7] verbesserte Varianten angegeben, die echt polynomielle Laufzeiten haben. Auch später wurden weitere Verbesserungen angegeben, bis schlieÿlich mit [13] das Push-Relabel-Verfahren aufkam, welches deutlich schnellere Berechnungen maximaler Flüsse erlaubt. Der Algorithmus von Ford und Fulkerson sowie der Algorithmus von Edmonds und Karp werden in Abschnitt 3.1 beschrieben. Homan verallgemeinerte 1974 das Max-Flow-Min-Cut-Theorem [20] zu einer Variante für eine deutlich allgemeinere Klasse von Graphen. Es gibt für viele Situationen ähnliche Theoreme, die bei passender Modellierung alle von diesem Satz abgedeckt werden können. Der Beweis hat mit dem ursprünglichen Beweis von Ford und Fulkerson gemein, dass er nicht konstruktiv ist. McCormick [27] fand einen Algorithmus, der in diesem Modell einen maximalen Fluss in polynomialer Zeit berechnet, falls ein Orakel mit konstanter Laufzeit benutzt wird. Im Gegensatz zu allen vorher erwähnten Algorithmen (abgesehen von linearen Programmen) nutzt dieser Algorithmus kein Residualnetzwerk. Diesen Algorithmus beschreiben wir in Abschnitt 3.2. Der Algorithmus von McCormick arbeitet mit Pfaden und nicht auf Kanten. Da er einen Fluss schrittweise entlang von Pfaden ändert, arbeitet er aber nach Art des Ford-FulkersonPrinzips. Es ist das Ziel dieser Arbeit, einen pfadbasierten Algorithmus zu entwickeln, der das Verhalten imitiert, aber ohne Residualnetzwerk auskommt. Ein solcher Algorithmus wird in Abschnitt 4.1 vorgestellt. Kapitel 4.2 enthält eine Analyse des Algorithmus anhand einiger Beispiele und liefert einige Möglichkeiten, wie die erste Variante verbessert werden kann. Ein empirischer Vergleich der entwickelten Varianten mit herkömmlichen ussaugmentierenden Verfahren wird in Abschnitt 4.3 durchgeführt. Dazu benutzen wir verschiedene Instanzen, wie zum Beispiel die RMFGEN-Instanzen, die Goldfarb und Grigoriadis beim Vergleich des Algorithmus von Dinic mit dem Netzwerk-Simplex-Algorithmus [14] nutzten. Dieser und weitere Generatoren wurden auch im Rahmen der ersten DIMACS-Challenge vorgestellt [21]. 3 2 Grundlagen 2.1 Lineare Programmierung Für die Behandlung des abstrakten Flussalgorithmus, der Flüsse in einer pfadbasierten Darstellung verwendet, benötigen wir einige Grundlagen aus der linearen Programmierung, die wir zunächst kurz angeben wollen. Es soll hier jedoch nicht in die Tiefe gegangen, sondern nur die im Verlauf der Arbeit benötigten Fakten angegeben werdens. Weiterführende Informationen nden sich zum Beispiel in [30]. 2.1.1 Denition (Lineares Programm). und c ∈ Rn . Ein lineares Programm Variablen n X (P ) m, n ∈ N, A = (a)ij ∈ Rm×n , b ∈ Rm Seien besteht aus linearen Ungleichungen m über n aij xj = ai1 x1 + ai2 x2 + · · · ain xn ≤ bi j=1 für i ∈ {1, 2, . . . , m}. heiÿt Ein nichtnegativer Vektor zulässige Lösung. x c2 x02 + · · · + cn x0n ist eine x ∈ Rn≥0 , optimale Lösung, für alle zulässigen Lösungen x0 falls der die Unleichungen erfüllt, c1 x1 + c2 x2 + · · · cn xn ≥ c1 x01 + gilt. Wir schreiben das lineare Programm auch als (P ) maximiere cT x s.t. Ax ≤ b x ≥ 0 Durch Multiplikation der Nebenbedinungen 0 eine Form A x ≥ b0 gebracht werden. Dabei ist Ax ≤ b A0 mit = −A (−1) 0 und b kann das Problem in = −b. Wir können also beide Ungleichungen nutzen. Zu einem linearen Programm gibt es ein sogenanntes duales Programm: 2.1.2 Denition (Duales Programm). Sei ein lineares Programm gegeben, das cT x duale Programm (D) ist ebenfalls ein lineares Programm und besteht aus den linearen Ungleichungen unter der Bedingung Ax ≤ b m X maximiert. Das zugehörige aij yi = a1j y1 + a2j y2 + · · · amj ym ≥ cj i=1 5 2 Grundlagen für j ∈ {1, 2, . . . , n}. heiÿt Ein nichtnegativer Vektor y ∈ Rm ≥0 , der die Ungleichungen erfüllt zulässige duale Lösung. y ist eine optimale duale Lösung, falls b1 y1 +b2 y2 +· · · bm ym ≤ 0 für alle zulässigen dualen Lösungen b1 y10 +b2 y20 +· · ·+bm ym y0 gilt. Wir schreiben das duale Programm auch als (D) minimiere bT y s.t. AT y ≥ c y ≥ 0 Das duale Programm ist selbst wieder ein lineares Programm (mit umgedrehten Ungleichungen). Das duale Programm eines dualen Programmes ist wieder das ursprüngliche Programm. Eine optimale Lösung eines linearen Programms kann mit dem Simplex-Algorithmus berechnet werden. Er ist praktisch ezient, hat jedoch im schlechtesten Fall eine exponentielle Laufzeit. 1979 hat Ha£ijan [16] mit der Ellipsoidmethode einen polynomiellen Algorithmus angegeben, der aber praktisch zu inezient ist. 1984 veröentlichte Karmakar [22] mit der Innere-Punkte-Methode einen weiteren polynomiellen Algorithmus zum Lösen linearer Programme, der durch weitere Verbesserungen, wie zum Beispiel [28], konkurrenzfähig zum Simplex-Verfahren ist. Der Dualitätssatz für lineare Programme liefert eine wichtige Eigenschaft von linearen und den zugehörigen dualen Programmen: Der Wert einer optimalen Lösung für beide Programme stimmt überein, falls eine Lösung existiert [30, Korollar 7.1g]. Unabhängig vom Wert kann anhand des komplementären Schlupfes festgestellt werden, ob eine optimale Lösung gefunden worden ist. 2.1.3 Satz (Komplementärer Schlupf). Seien x eine zulässige Lösung für ein lineares Programm (P ) maximiere cT x s.t. Ax ≤ b x ≥ 0 und y eine zulässige Lösung für das zugehörige duale Programm (D) minimiere bT y s.t. AT y ≥ c y ≥ 0 gegeben. Dann sind x und y optimale Lösungen, falls für alle i ∈ {1, 2, . . . , m} yi · (Ai x − bi ) = 0 (2.1) (cj − y T ATj ) · xj = 0 (2.2) und für alle j ∈ {1, 2, . . . , n} gilt. 6 2.2 Graphen und Netzwerke Beweis. Ein Beweis ndet sich zum Beispiel in [24, Korollar 3.23]. 2.2 Graphen und Netzwerke Wir beginnen mit der Netzwerküssen zugrundeliegenden Struktur, den Graphen und speziell den Netzwerken. Auf diesen Strukturen aufbauend denieren wir dann einen 2.2.1 Denition (Graph). Seien V = {1, 2, . . . , n} eine endliche Menge und E ⊆ V × V . Knoten, die Elemente aus E ist G := (V, E) ein gerichteter Graph. Die Elemente aus Falls E V heiÿen heiÿen gerichtete Kanten. Dann keine Menge ist, sondern eine Multimenge mit Elementen aus Elemente aus E Multigraph. gerichtete Mehrfachkanten, 2.2.2 Denition. henden Kanten Sei von v G = (V, E) Fluss. in diesem Fall heiÿt ein Graph und v ∈ V. V ×V, G = (V, E) heiÿen die gerichteter Dann ist die Menge der einge- deniert als v − := {e ∈ E | e = (w, v) ∧ w ∈ V }, analog ist die Menge der ausgehenden Kanten von v deniert als v + := {e ∈ E | e = (v, w) ∧ w ∈ V }. Netzwerke sind spezielle Graphen, die besonders ausgezeichnete Knoten enthalten: 2.2.3 Denition (Netzwerk). Funktion c : E → R≥0 Sei G = (V, E) weise jeder Kante aus Quelle s ∈ V und Senke t ∈ V (V, E, s, t, c) ein Netzwerk. Die ein gerichteter Graph (Multigraph). Die G eine nichtnegative Kapazität c(e) seien zwei ausgezeichnete Knoten. Dann ist zu. N := Sofern nicht anders gesagt, beschränken wir uns im Folgenden auf einfache Graphen ohne Multikanten. Sowohl die folgende Denition von Flüssen als auch die betrachteten Algorithmen lassen sich ohne Weiteres direkt auf Multigraphen erweitern. Andersherum lassen sich Mehrfachkanten zu einer Kante zusammenfassen, die als Kapazität die Summe der Einzelkapazitäten erhält. Dies gilt aber nicht für alle Flussprobleme. 2.2.4 Denition (Kantenuss). E → R≥0 , Ein Fluss auf einem Netzwerk N ist eine Funktion φ: die folgende Bedingungen erfüllt: ∀ e ∈ E : φ(e) ≤ c(e) (2.3) 7 2 Grundlagen ∀ v ∈ V \ {s, t} : X X φ(e) = e∈v − φ(e) (2.4) e∈v + Einhaltung der Kapazitäten, Bedingung (2.4) fordert Flusserhaltung an den Knoten und heiÿt auch Kirchho'sche Regel. Für einen Knoten v ∈ V und einen Fluss φ denieren wir den eingehenden Fluss als Bedingung (2.3) fordert die vin (φ) := X φ(e) e∈v − und den ausgehenden Fluss als vout (φ) := X φ(e). e∈v + Wenn φ(e) = c(e) saturiert. Der Wert ist, das heiÿt, die Kapazität von eines Flusses e wird ausgeschöpft, so heiÿt e φ ist deniert als der aus der Senke herausieÿende Fluss abzüg- lich des wieder zurückieÿenden Flusses: val(φ) := sout (φ) − sin (φ) = X φ(e) − e∈s+ Der Fluss φ ≡ 0, X der auf jeder Kante den Wert Null hat, heiÿt 2.2.5 Bemerkung. φ(e). e∈s− Nulluss. Aufgrund der Flusserhaltung (2.4) an allen Knoten auÿer der Quelle und Senke kommt Fluss, der nicht wieder zur Quelle zurückieÿt an der Senke an. Der Wert eines Flusses entspricht also auch dem in die Senke hereinieÿenden Flusses. Das heiÿt es ist val(φ) = tin (φ) − tout (φ). 2.2.6 Denition (Maximaler Fluss). heiÿt Sei N = (V, E, s, t, c) maximal, falls für jeden anderen Fluss ψ Das Problem des maximalen Flusses gilt, dass ein Netzwerk. Ein Fluss val(ψ) ≤ val(φ) φ ist. ist die Suche nach einem solchen maximalen Fluss in einem beliebigen Netzwerk. Folgendes lineares Programm ndet einen maximalen Fluss (vgl. [5] und [24, Kapitel 8.1]): max P φe − P e∈v + φe e∈ s− e∈s+ s.t. P φe − P φe = 0 ∀ v ∈ V \ {s, t} φe ≤ c(e) ∀e ∈ E φe ≥ 0 ∀e ∈ E e∈v − Da der Nulluss immer eine gültige Lösung ist und der maximal erreichbare Wert durch die Summe aller Kapazitäten nach oben beschränkt ist, gibt es immer eine optimale Lösung. Eine Berechnung ist mit den in Abschnitt 2.1 erwähnten Algorithmen möglich, es gibt jedoch deutlich bessere kombinatorische Algorithmen. 8 2.2 Graphen und Netzwerke 2.2.7 Denition (Pfad und Kreis). Seien G = (V, E) ein gerichteter Graph und P := Weg falls für alle i ∈ {1, 2, . . . , n− 1} das (vi , vi+1 ) eine Kante in E ist. Falls e = (vi , vi+1 ) für ein i ist, sagen wir e liegt auf (v1 , v2 , . . . , vn ) ⊆ V n P und schreiben v1 heiÿt eine Sequenz von Knoten. P ist ein e ∈ P. Startknoten und vn Endknoten von P. Falls die Sequenz keine doppelten Knoten enthält, das heiÿt für alle Pfad von v1 einem Graphen nennen wir x-y -Pfad. gilt i 6= j ⇒ vi 6= vj , e = (vi , vi+1 ) Sei Kanten von (vj , vj+1 ) ist P ein nach eine Kante in einem Pfad links von e und für vn . P. Einen Pfad von Dann liegen für j ∈ {i + 1, . . . , n − 1} i, j ∈ {1, 2, . . . , n} x∈V nach y∈V j ∈ {1, . . . , i − 1} die Kanten (vj , vj+1 ) in die rechts e. Ein Pfad, dessen Startknoten und Endknoten gleich sind, heiÿt i, j ∈ {1, 2, . . . , n − 1} gilt i 6= j ⇒ vi 6= vj und es ist Kreis. Das heiÿt für v1 = vn . Ein Pfad ist ein Weg, der keine zwei Knoten (und damit auch Kanten) doppelt enthält. Wege sind als Knotensequenzen deniert. Da jedoch immer eine Kante zwischen zwei aufeinanderfolgenden Knoten des Weges im Graph vorhanden sein muss, kann ein Weg auch mit den Kanten, die auf ihm liegen, identiziert werden. Von dieser Möglichkeit werden wir im Folgenden Gebrauch machen. Wir wollen nun einen Begri zum Ändern eines Flusses einführen und zeigen, unter welchen Umständen der Fluss gültig bleibt. Ein Fluss kann entlang von Pfaden und Kreisen problemlos verändert werden und wir werden sehen, dass er sogar nur aus Pfaden aufgebaut werden kann. 2.2.8 Denition (Augmentierung). tigen Fluss Für φ δ∈R und M ⊆E eine Teilmenge der Kanten. sei eine neue Funktion φ0 (e) := Wenn φ0 positives heiÿt M φ0 : E → R deniert als ( φ(e) + δ e∈M φ(e) ein gültiger Fluss ist, sagen wir δ>0 auch N = (V, E, s, t, c) ein Netzwerk mit einem gül- Sei φ sonst wird entlang sagen wir auch, der Fluss wurde um augmentierender Pfad. Wenn ein Fluss entlang eines s-t-Pfades δ M um δ zu φ0 geändert. Für augmentiert. Falls M ein Pfad ist, augmentiert wird, gilt die Kirchho 'sche Regel (2.4) weiterhin. Es kann jedoch passieren, dass die Kapazitäten überschritten werden; falls der Fluss verringert wird, muss darauf geachtet werden, dass er nichtnegativ bleibt. 2.2.9 Lemma (Augmentierende Pfade und Kreise). Sei N = (V, E, s, t, c) ein Netzwerk, φ ein gültiger Fluss auf N und M ein s-t-Pfad oder ein Kreis. Sei δ ∈ R so gewählt, dass ∀ e ∈ M : δ ∈ [−φ(e), c(e) − φ(e)] gilt. 9 2 Grundlagen Dann kann φ entlang M um δ geändert werden und bleibt dabei gültig. Falls M ein Kreis ist ändert sich der Wert des Flusses nicht. Ansonsten ändert sich der Wert um δ . Beweis. Für jede Kante Für positives δ ist e∈M werden die Kapazitäten nach der Änderung eingehalten: φ(e) + δ ≤ φ(e) + c(e) − φ(e) = c(e); falls δ negativ ist, gilt φ(e) + δ ≥ φ(e) + (−φ(e)) = 0. Es bleibt zu zeigen, dass die Kirchho 'sche Regel gilt. Sei und g := (v, w) eine ausgehende Kante eines Knotens f := (u, v) v ∈ M. Da v eine eingehende auf einem Pfad oder Kreis liegt, gibt es genau eine eingehende und eine ausgehende Kante von v in M. Dies gilt, weil Kreise sich nach Denition nicht schneiden dürfen. Für den nach Denition 2.2.8 entstehenden Fluss φ0 gilt dann Def vin (φ0 ) = X φ0 (e) e∈v − X = φ0 (e) + φ0 (f ) e∈v − \{f } Def X = φ(e) + φ(f ) + δ e∈v − \{f } = X φ(e) + δ e∈v − Def = vin (φ) + δ für den in v ieÿenden Fluss und Def X vout (φ0 ) = φ0 (e) e∈v + X = φ0 (e) + φ0 (f ) e∈v + \{f } Def X = φ(e) + φ(f ) + δ e∈v + \{f } X = φ(e) + δ e∈v + Def = vout (φ) + δ für den aus v ausieÿenden Fluss. Sei v∈ / {s, t} falls M ein s-t-Pfad ist. Dann gilt vin (φ0 ) = vout (φ0 ) ⇔ vin (φ) + δ = vout (φ) + δ ⇔ vin (φ) = vout (φ) und die Flusserhaltung (2.4) ist erfüllt. Eine Änderung des Flusses entlang Kreisen ändert den Flusswert nicht, da die Rechnung für Kreise auch an der Quelle und der Senke gültig ist. Das Ändern des Flusses entlang 10 2.2 Graphen und Netzwerke eines s-t-Pfades ändert jedoch auch den Flusswert, denn in diesem Fall hat ausgehende Kante, aber keine eingehende Kante auf δ höheren Wert: M. s genau eine Der neue Fluss hat also einen um val(φ0 ) Def = sout (φ0 ) = sout (φ) + δ = val(φ) + δ Wir wollen nun zeigen, dass ein Fluss allein durch Fluss auf Pfaden und Kreisen bestimmt ist, dass man sogar die Kreise auslassen kann. Eine solche Darstellung eines Flusses heiÿt Dekomposition. 2.2.10 Denition (Fluss-Dekomposition). nem Fluss φ. N = (V, E, s, t, c) ein Netzwerk mit ei- Es sei P := {P ⊆ P(E) | P die Menge aller s-t-Pfade ist ein die Menge aller Kreise in (xP )P ∈P∪C s-t-Pfad in N} und C := {C ⊆ P(E) | C Eine Folge Sei ist ein Kreis in N} N. ist eine Fluss-Dekomposition, falls xP ≥ 0 ist und X ∀e ∈ E : xP = φ(e) (2.5) P ∈P∪C:e∈P gilt. Falls zusätzlich xP = 0 für alle Kreise P ∈C gilt, heiÿt (xP ) Pfad-Dekomposition. Das folgende Fluss-Dekompositions-Theorem ndet sich zum Beispiel in [11]. Der folgende Beweis orientiert sich an [24, Theorem 8.8]. 2.2.11 Satz (Fluss-Dekomposition). Sei N ein Netzwerk mit Fluss φ, P die Menge aller s-t-Pfade und C die Menge aller Kreise in N . Dann existiert eine Fluss-Dekomposition (xP )P ∈P∪C und die Anzahl der positiven Pfade P mit xP > 0 ist maximal C ≤ |E|, falls es C Kanten mit positivem Fluss gibt. Beweis. = (V, E, s, t, c) Wir beweisen die Aussage mittels Induktion über die Anzahl der Kanten C mit echt positivem Fluss. Sei C = 0, das heiÿt es gibt keine ussführende Kante. Dann ist die Menge der Pfade und Kreise die Fluss führen leer und es gilt Sei nun {t, v0 }. C > 0 Falls w0 und in E0 i := 0. Es sei xP = 0 e0 := (v0 , w0 ) für jeden Pfad P ∈ P ∪ C. eine Kante mit φ(e) > 0 und E0 := liegt, brechen wir ab. Andernfalls gibt es wegen (2.4) eine Kante 11 2 Grundlagen ei+1 := (wi , wi+1 ) mit φ(ei+1 ) > 0. Wir denieren dann Ei+1 := Ei ∪ {wi }, setzen i := i + 1 und fahren mit dem Test wi ∈ Ei fort. Da die Mengen werden, bricht das Verfahren nach spätestens Wir führen nun das gleiche Verfahren von j := 0 und e00 := (v0 , w0 ). Falls vj ∈ Ej0 e0j+1 := (vj+1 , vj ) mit fahren fort bis für ein nach spätestens Falls j |E| Schritten ab. v0 ausgehend durch. Es sei i immer gröÿer E00 := {s, w0 }, liegt brechen wir ab. Andernfalls gibt es eine Kante 0 := Ej0 ∪ {vj } Ej+1 Es sei nun und j := j + 1. Wir 0 der Knoten vj in Ej enthalten ist; auch dieses Verfahren bricht Schritten ab. gefunden. Sei gemäÿ Lemma 2.2.9 um gilt für wachsendes vj = s und wi = t gelten, wurde ein s-t-Pfad gefunden, andernfalls wurde ein Kreis Ei ∪ Ej0 in |E| φ(e0j+1 ) > 0. Ei φ(e) = δ , P der so gefundene Pfad oder Kreis. Dann können wir den Fluss δ := − min{φ(e) | e ∈ P } ändern. Für mindestens eine Kante die Anzahl der Kanten mit echt positivem Fluss verringert sich um e c > 0. Nach Induktionsvoraussetzung gibt es eine Fluss-Dekomposition des entstandenen Flusses φ0 mit höchstens C −c positiven Pfaden. Zusammen mit damit auch eine Fluss-Dekomposition von φ P mit höchstens und dem Wert C xP := δ gibt es ussführenden Pfaden oder Kreisen. 2.2.12 Korollar (Pfaddekomposition). Sei ein Netzwerk mit Fluss φ, P die Menge aller s-t-Pfade und C die Menge aller Kreise in N . Dann existiert eine Pfad-Dekomposition (xP )P ∈P , das heiÿt xP = 0 für P ∈ C. Beweis. N = (V, E, s, t, c) (xP 0 )P 0 ∈P∪C . Sei C Nach Satz 2.2.11 existiert eine Fluss-Dekomposition mit Flusswert xC > 0. Deniere dann mindestens Fluss in Höhe von xC auf e δ := −xC . ist 0 < δ ≤ φ(e), da ieÿt. C Wird der Fluss entlang eines Kreises seinen Wert und anschlieÿend gilt e ∈ C Für alle ein Kreis um xC = 0. δ verändert, behält er nach Lemma 2.2.9 Dieses Verfahren kann nacheinander für alle Kreise mit echt positivem Flusswert durchgeführt werden. 2.2.13 Lemma. Es sei N = (V, E, s, t, c) ein Netzwer und P die Menge der s-t-Pfade in N. Jedem Pfad P sei ein Fluss xP zugewiesen und es gelte X ∀e ∈ E : xP ≤ c(e). P ∈P:e∈P Dann kann aus diesen Pfaden ein Fluss mit Wert Beweis. P xP P ∈P in N konstruiert werden. P ∈ P. Sei φ der aktuelle P gilt φ(e) + Xp ≤ XP 0 + Wir augmentieren den Fluss nacheinander für jeden Pfad Fluss, zu Beginn ist φ≡0 der Nulluss. Nach Voraussetzung P 0 6=P XP = Da P ≤ c(e). Nach Lemma 2.2.9 kann der Fluss damit um xP P ∈P:e∈P P nur s-t-Pfade augmentiert werden, ist val(φ) = φ(e). Für augmentiert werden. jeden hinzugefügten e∈s+ Pfad wurde aber der Fluss auf einer von ist insgesamt val(φ) = P e∈s+ 12 φ(e) = P P ∈P s xP . ausgehenden Kante genau um xP erhöht, also 2.3 Das Max-Flow-Min-Cut-Theorem 2.3 Das Max-Flow-Min-Cut-Theorem 2.3.1 Denition (Schnitt). heiÿt N = (V, E, s, t, c) Sei trennende Menge, falls in E \ E 0 S ⊆E Eine trennende Menge s-t-Pfad kein Schnitt, heiÿt falls ein Netzwerk. Eine Menge E0 ⊆ E mehr enthalten ist. S keine echte Teilmenge enthält, die trennend ist. Der Wert eines Schnittes falls val(S) ≤ val(S 0 ) S val(S) := ist deniert als für alle Schnitte S0 P e∈S c(e). Der Schnitt heiÿt minimal, ist. Ein Schnitt mit minimalem Wert beschreibt eine Engstelle im Netzwerk, die damit auch den maximalen Fluss beschränkt. 2.3.2 Lemma. Sei N = (V, E, s, t, c) ein Netzwerk, S ein Schnitt und φ ein Fluss. Dann ist der Wert des Flusses durch val(S) nach oben beschränkt. Beweis. Es ist Ein Schnitt S teilt die Knotenmenge des Netzwerks in zwei disjunkte Teilmengen. Vs := {v ∈ V | ∃ s-v -Pfad Vt := V \Vs in E \ S} die Menge der von die Menge der Knoten, von denen inzidente Knoten beide in St s erreichbaren Knoten und t erreichbar ist. In S liegt keine Kante, deren liegen, da nach Entfernen dieser Kante S trennend bliebe. S ist aber minimal. Wir nehmen an, dass keine der Kanten in s− Fluss führt. Dies kann nach Lemma 2.2.9 immer erreicht werden, indem der Fluss auf Kreisen auf 0 gesetzt wird. Dann gilt val(φ) = X φ(e) e∈s+ = X φ(e) − X φ(e) e∈s− e∈s+ An allen Knoten auÿer der Senke gilt Flusserhaltung, auÿerdem ist Summe also auf alle Knoten in Vs X X v∈Vs Wir können die erweitern. = t∈ / Vs . e∈v + φ(e) − X φ(e) e∈v − 13 2 Grundlagen Flusswerte für Kanten e = (v, w) gezählt und in der Summe über mit w− v, w ∈ Vs werden einmal in der Summe über abgezogen. Wenn wir sie entfernen, ändert sich der Wert der Summe nicht. Es bleiben dabei nur Kanten übrig, bei denen entweder Vs in v+ v oder w liegen, aber nicht beide Knoten. X = X φ(e) − X = val(S) − φ(e) e=(v,w):v ∈V / s ,w∈Vs e=(v,w):v∈Vs ,w∈V / s φ(e) (2.6) e=(v,w):v ∈V / s ,w∈Vs ≤ val(S) Wir wollen nun das Max-Flow-Min-Cut-Theorem φ tigen. Wir werden im Folgenden nur Flüsse beweisen, wozu wir ein Lemma benö- betrachten, die nur aus Pfaden bestehen. Dies ist möglich, da es nach Satz 2.2.12 zu jedem Fluss eine Pfad-Dekomposition gibt, in der nur auf s-t-Pfaden Fluss ieÿt. Sei P := {P1 , . . . , Pp } die Menge der verschiedenen Pfade im Netzwerk. Damit können wir einen Fluss als Punkt wir der j -ten x ∈ s -t Rp darstellen, indem Koordinate den Wert des entsprechenden Pfades in der Pfad-Dekomposition zuweisen. 2.3.3 Bemerkung. Da φ1 und φ2 Seien φ1 und φ2 zwei Flüsse. Dann ist nichtnegativ sind, ist auch φ φ := αφ1 + (1 − α)φ2 nichtnegativ. Die Kapazitäten werden wegen φ(e) = αφ1 (e) + (1 − α)φ2 (e) ≤ αc(e) + (1 − α)c(e) = c(e) An jedem Knoten X e∈v − φ(e) = X v ∈ V \ {s, t} αφ1 (e) + (1 − α)φ2 (e) = α X für jede Kante X φ1 (e) + (1 − α) e∈v − φ1 (e) + (1 − α) e∈v + e eingehalten. gilt wegen e∈v − =α ein Fluss. X φ2 (e) = e∈v + die Kirchho 'sche Regel. Auÿerdem gilt X φ2 (e) e∈v − X αφ1 (e) + (1 − α)φ2 (e) = e∈v + val(φ) = val da der Wert eine lineare Funktion ist. Falls φ1 und X φ(e) e∈v + 1 2 (φ1 + φ2 ) = 12 (val(φ1 ) + val(φ2 )), φ2 den gleichen Wert haben, gilt val(φ) = val(φ1 ) = val(φ2 ). Damit sind sowohl die Menge aller Flüsse im Rp als auch die Menge der maximalen Flüsse konvex. Wir können also Durchschnitte von Flüssen bilden und Durchschnitte maximaler Flüsse bleiben maximal. Mit Induktion kann das Gezeigte auf Summen von n Flüssen erweitert werden. Da die Menge aller Flüsse durch die Kapazitäten beschränkt ist, nimmt die lineare Wertfunktion ein Maximum auf dieser Menge an. Wir beweisen zunächst eine Hilfsaussage und anschlieÿend das Max-Flow-Min-Cut-Theorem. Das hier gewählte Vorgehen entspricht dem Beweis aus [10] eingeschränkt auf gerichtete Graphen. 14 2.3 Das Max-Flow-Min-Cut-Theorem 2.3.4 Lemma. Die Mengen ist saturiert in jedem maximalen Fluss} und L∗ := {e = (v, w) ∈ S ∗ | ∃ maximaler Fluss φ, Pfad P = (s = v0 , v1 , . . . , vn = v) : ∀ i ∈ {1, 2, . . . , n} : φ((vi−1 , vi )) < c((vi−1 , vi ))} sind trennend. Beweis. S ∗ := {e ∈ E | e Wir zeigen zunächst durch einen Widerspruch, dass gebe in einem Netzwerk mit maximalem Fluss einen Pfad so dass keine der Kanten von P S∗ trennende Menge ist. Es P := (s = v0 , v1 , . . . , vn = t), ∗ in S liegt. Nach Denition von S∗ gibt es für jede Kante ei := (vi−1 , vi ) ∈ P einen maximalen Fluss xi , der ei nicht saturiert. n 1 P xi . x ist maximal und saturiert keine Kante ei . Dann Es sei x := n kann der Fluss i=1 auf P erhöht werden, was ein Widerspruch ist. Wir zeigen nun, dass L∗ trennend ist. Sei P ein beliebiger Pfad, der keine Kante aus enthält. Wie gezeigt liegt mindestens eine Kante von Kanten. Für jede links von der ei ek auf P liegende Kante S. ek ∈ P P in ei gibt es einen maximalen Fluss Sei L∗ die linkeste dieser xi , nicht saturiert. x := 1 k−1 k−1 P xi der Durchschnitt dieser Flüsse. Die Kanten i=1 ∗ saturiert, aber et ist saturiert und liegt damit in L . Sei e1 bis ek−1 sind nicht 2.3.5 Satz (Max-Flow-Min-Cut [10]). Sei N = (V, E, s, t, c) ein Netzwerk, φ ein Fluss und S ein Schnitt. Dann ist φ genau dann ein maximaler Fluss und S ein minimaler Schnitt, falls val(φ) = val(S) gilt. Beweis. Wir zeigen zunächst, dass kein positiver Pfad mehr als eine Kante aus der Men- ∗ ge L aus Lemma 2.3.4 enthalten kann. Sei Dekomposition) und liegen beide in L∗ . ein maximaler Fluss (als Pfad- Sei ei links von ej x1P > 0. ∗ Da ej in L liegt, gibt es einen maximalen Fluss x2 und einen Pfad linkeste saturierte Kante ist (dies impliziert ei ∈ / P 0 ). Es sei δ := min{ek 0 das Minimum der freien Kapazitäten der Kanten auf P . Wert von P ei , ej ∈ P x1 ∈ Rp 1 2 x1P xP ≥ > 0 verringert und auf der ei Sei Fluss der als Mittel von x1 der Wert des Flusses auf xP 0 um min{xP , δ} und P. x2 P 0, auf dem und der | ek ∈ P 0} ej >0 entstehende maximale Fluss. Es ist Wenn der Fluss auf xP um min{xP , δ} erhöht wird, entsteht ein Fluss mit gleichem Wert, nicht mehr saturiert. Dies ist ein Widerspruch zu T P sei x := 21 (x1 + x2 ) Sei auf ei ∈ L∗ . eine beliebige trennende Menge. Es ist nach Lemma 2.3.2 val(T ) ≥ val(φ) für jeden φ. Wenn die Kapazitäten der Kanten aus jeder s-t-Pfad auch val(φ) ≤ val(L∗ ) L∗ summiert werden, wird, wie gerade gezeigt, genau einmal getroen. Da nach Lemma 2.3.4 für jeden Fluss L∗ trennende Menge ist, gilt φ. ∗ Insgesamt folgt, dass L ein minimaler Schnitt ist und ein maximaler Fluss den selben Wert hat. 15 2 Grundlagen L∗ Aus dem Beweis des Lemmas folgt, dass Pfad zusammensetzt. Die Menge L∗ sich aus den linkesten Kanten in heiÿt daher auch S∗ für jeden linkester Schnitt [15]. Analog kann rechtesten Schnitt denieren. ∗ man über die Menge der rechtesten Kanten aus S einen In [11, Kapitel 1.5] erklären Ford und Fulkerson, dass die beiden Schnitte genau dann 2 übereinstimmen, wenn der minimale Schnitt eindeutig ist . 2.4 Das abstrakte Graphmodell Ein deutlich abstrakteres Modell als das Standardgraphmodell nach 2.2.1 führt Homan in [20] ein. Das Modell der abstrakten Graphen ist pfadbasiert, wobei es jedoch in der Lage ist, die unterschiedlichsten Arten von Flüssen in einem Modell darzustellen. 2.4.1 Denition (Abstrakter Graph). Teilmenge der Elemente P ⊆E heiÿt Sei E eine endliche Menge von Elementen. Eine Pfad, P ⊆ P(E) sei die Menge der Pfade und es sei ∅ ∈ P. Auf jedem Pfad Elemente e, f ∈ P beziehungsweise f Falls zwei Pfade P sei eine lineare Ordnung gelte entweder rechts P Q oder seiner Elemente deniert. Für zwei f <P e. Im Fall e <P f e liegt links von f e. von und e <P f <P ein Element e∈P ∩Q gemeinsam haben, sei die menge (P, e, Q) deniert als Kreuzungs- (P, e, Q) := {f ∈ E | f ∈ P ∧ f <P e} ∪ {e} ∪ {f ∈ E | f ∈ Q ∧ e <Q f }. Die Funktion P, Q und r : P → N0 bestimme für jeden Pfad eine nichtnegative Zahl, so dass für e max{r(R) | R ∈ (P, e, Q)} + max{r(S) | S ∈ (Q, e, P )} ≥ r(P ) + r(Q) gilt, dabei ist Dann heiÿt (2.7) r(∅) := 0. G := (E, P) abstrakter Graph. Die Denition ist sehr allgemein gehalten und hat in dieser Form fast keine Einschränkungen. Es ist durchaus möglich, dass zwei Elemente auf P und rechts von schneidende Pfade P und sich schneiden, liegen und dabei e Für sich in einem Element (P, e, Q) die Elemente von P von Q nach e (bezüglich e links von f e, f ∈ P ∪ Q Q sowie e f auf Q liegt. umfasst die Kreuzungsmenge vor dem Kreuzungselement (bezüglich <Q ) auf zwei Pfaden, die <P ) und die Elemente selbst. Es ist nicht erforderlich, dass (P, e, Q) selbst einen Pfad bildet. Es ist aber garantiert, dass zumindest ein Pfad in jeder Kreuzungsmenge liegt, da der leere Pfad 2 ∅ in der Menge der Pfade enthalten ist. Dadurch ist r wohldeniert. Wenn alle Kanten umgedreht werden und die Quelle und Senke ihre Rollen tauschen, kann dieser mit den gleichen Algorithmen berechnet werden. 16 2.4 Das abstrakte Graphmodell e e (a) Die Kreuzungsmenge (P, e, Q). (b) Kreuzungsmenge (Q, e, P ). Abbildung 2.1: Zwei Pfade P (horizontal) und Q (diagonal), die sich in einem Element e berühren sowie deren beide Kreuzungsmengen. Es ist einfach, ein gegebenes Netzwerk N = (V, E, s, t, c) in das abstrakte Modell zu überführen. Eine Beschreibung des Verfahrens ist im Beweis zu Satz 2.4.6 zu nden. Es lassen sich auch ohne Probleme Varianten mit mehreren Quelle-Senke-Paaren in diesem Modell darstellen. Ebenfalls sind Formulierungen, die auf Knoten, anstatt auf Kanten, basieren, möglich. Weitere Beispiele sind in [20] zu nden. Falls den Kanten klischen Graphen Gewichte w(e) ∈ N0 zugeordnet sind, kann r(P ) := P e eines azy- w(e) gesetzt e∈P werden und (2.7) wird erfüllt. In einem solchen Modell können Transportprobleme oder das Problem einen Fluss mit minimalen Kosten zu nden gelöst werden. Ein Algorithmus dazu, der den in Abschnitt 3.2 vorgestellten Algorithmus verallgemeinert, ist in [26] zu nden. Im Folgenden werden wir den oben beschriebenen Fall für ungewichtete Graphen besprechen. Wir denieren dazu einen Fluss auf abstrakten Graphen: 2.4.2 Denition (Abstrakter Netzwerkuss). Die Funktion Sei φ∈ c : E → R≥0 |P| R≥0 . φ Sei G = (E, P) weise jedem Element eine nichtnegative ist ein gültiger Pfaduss, ein abstrakter Graph. Kapazität c(e) zu. falls er die Kapazitäten einhält, das heiÿt es gilt X ∀e ∈ E : φP ≤ c(e). P :e∈P Falls für ein Element e X φP = c(e) P :e∈P gilt, ist e saturiert. Ein Pfad Der Wert P heiÿt positiv, falls φP > 0 gilt. eines Flusses φ ist deniert als val(φ) := X φP . P ∈P 17 2 Grundlagen Der Fluss Fluss φP φ ist also ein Vektor der Länge |P|, der jedem Pfad P einen nichtnegativen zuweist. Folgendes lineare Programm beschreibt das Problem, einen maximalen Fluss in der pfadbasierten Variante zu nden: 2.4.3 Algorithmus (Lineares Programm für einen maximalen Fluss). Eingabe: Ein abstrakter Graph Ausgabe: Ein maximaler Fluss G = (E, P) φ in mit Kapazitäten c(e) für alle e ∈ E. G. P (P ) maximiere φP P ∈P P s.t. φP ≤ c(e) ∀ e ∈ E xP ≥ 0 P :e∈P ∀P ∈ P Das duale Programm berechnet einen Schnitt mit minimalen Wert in einem (abstrakten) Graphen: 2.4.4 Algorithmus (Duales Programm zum maximalen Fluss). Eingabe: Ein abstrakter Graph G = (E, P) Ausgabe: Ein minimaler Schnitt y in (D) minimiere mit Kapazitäten c(e) für alle e ∈ E. G. P e∈E s.t. c(e)ye P ye ≥ 1 ∀ P ∈ P P ∈P ye ≥ 0 ∀ e ∈ E Dies sind die beiden dualen Programme zur Berechnung eines Flusses mit maximalem und eines Schnittes mit minimalem Wert. Wir überprüfen noch kurz, dass die beiden Programme tatsächlich duale lineare Programme sind. 2.4.5 Satz. Algorithmus 2.4.4 ist das duale Programm zu Algorithmus 2.4.3. Beweis. Sei m := |E| T denieren wir c ∈ Rp und damit die Matrix die Anzahl der Kanten und := (1, 1, . . . , 1) ( 1 aij := 0 und für p := |P| die Anzahl der Pfade. Dann i ∈ {1, 2, . . . , m} Kante i liegt auf Pfad j ∈ {1, 2, . . . , p} sei j sonst A := (aij ). Dann lässt sich für jede Kante ei linearen Programm in 2.4.3 darstellen als ai1 X1 + ai2 X2 + · · · + aip Xp ≤ c(ei ). 18 und die Bedingung aus dem 2.4 Das abstrakte Graphmodell Mit b := (c(e1 ), c(e2 ), . . . , c(em ))T und x := (φ1 , φ2 , . . . , φp )T gilt dann Ax ≤ b. Die yi bezeichnen die dualen Variablen für jede Ungleichung aus dem primalen linearen Programm. Mit den Matrixelementen aij lässt sich jede Ungleichung des dualen Programms darstellen als a1j y1 + a2j y2 + · · · + amj ym ≥ cj y := (y1 , y2 , . . . , ym )T und mit gilt AT y ≥ c. Die beiden Programme sind also primales und duales Programm für das Problem einen maximalen Fluss zu bestimmen. Die Denition eines abstrakten Graphen ist sehr allgemein, da sie es erlaubt, abstrakte Graphen auf beliebige Mengen zu denieren. Die gleiche Benennung der Kanten von Graphen in Denition 2.2.1 und der Elemente in Denition 2.4.1 deutet bereits an, welche Interpretation wir im Folgenden annehmen wollen: Wir werden die Elemente eines abstrakten Graphen als Kanten auassen und die Pfade als Folge von Kanten. Wie bereits angedeutet, können Netzwerke problemlos in abstrakte Graphen transformiert werden. Ein maximaler Fluss stimmt dann in beiden Modellen überein. 2.4.6 Satz (Transformation eines Netzwerks in einen abstrakten Graphen). Sei ein Netzwerk N = (V, E, s, t, c) gegeben. Dann gibt es einen abstrakten Graphen G = (E, P), der dem Netzwerk entspricht. Auÿerdem ist der maximale Flusswert auf dem abstrakten Graphen und N gleich. Beweis. Die Menge der Elemente entspricht der Menge der Kanten Pfad wird ein Pfad in E von N . Für jeden s-t- P eingefügt. Sei P = (v1 , v2 , . . . , vn ) ein s-t-Pfad in N . Dann ist P 0 := {(v1 , v2 ), (v2 , v3 ), . . . , (vn−1 , vn )} deniert als Menge der den Kanten auf P entsprechenden Elementen. Seien e := (vi , vi+1 ) und f := (vj , vj+1 ) auf P. Wir denieren die Ordnungsrelation e <P f :⇔ i < j . e ist genau dann kleiner als f , wenn e in N S P := P 0 die Vereinigung aller solcher Pfade P 0 . als P :P ist ein Für alle s-tPfad P0 ∈ P sei r(P 0 ) := 1. Dann gilt stets für P0 und Q0 links von und f <P liegt. Es sei e ∈ P 0 ∩ Q0 max{r(R) | R ∈ (P 0 , e, Q0 )} + max{r(S) | S ∈ (Q0 , e, P 0 )} = 1 + 1 = r(P ) + r(Q) und 2.7 ist erfüllt. 2.4.7 Satz (Homan [20]). Sei G = (E, P) ein abstrakter Graph mit m := |E| Elemen- ten und p := |P| Pfaden und c = (c1 , c2 , . . . , cp ) ∈ Np0 . 19 2 Grundlagen Dann haben die beiden dualen Programme P (P ) maximiere r(P )xP P xP P ∈P s.t. ≤ c(e) ∀ e ∈ E P :e∈P xP und (D) minimiere P e∈E s.t. ≥ 0 ∀P ∈ P c(e)ye P ye ≥ r(P ) ∀ P ∈ P P ∈P ye ≥ 0 ∀e ∈ E eine ganzzahlige optimale Lösung. Beweis. Ein Beweis ndet sich in [20, Theorem 2.4]. 2.4.8 Korollar. Sei N ein Netzwerk mit ganzzahligen Kapazitäten c(e) ∈ N für alle e ∈ E . Dann gibt es einen maximalen Fluss, der jeder Kante einen ganzzahligen Fluss zuweist. Beweis. = (V, E, s, t, c) Nach Satz 2.4.6 kann aus N ein abstrakter Graph mit gleichem Fluss erzeugt werden. Nach Satz 2.4.7 ist dieser Fluss ganzzahlig. Somit ist auch der Kantenuss in N ganzzahlig. 20 3 Maximale Flüsse 3.1 Flussaugmentierende Verfahren 3.1.1 Das Ford-und-Fulkerson-Prinzip Aus der Existenz der Pfad-Dekomposition (Satz 2.2.11) folgt, dass es immer einen maximalen Fluss gibt, der nur entlang von s-t-Pfaden Fluss führt. Als Verfahren macht es also Sinn, Fluss nur entlang von passenden Pfaden zu erhöhen und Kreise zu ignorieren. In diesem Fall vereinfacht sich die Berechnung des Flusswertes zu val(φ) = sout für einen Fluss φ. Eine erste Idee zur Umsetzung des Verfahrens ist, ausgehend vom Nulluss, schrittweise den Fluss entlang eines Pfades zu erhöhen, bis kein weiterer s-t-Pfad zum Augmentieren mehr gefunden wird. Abbildung 3.1 zeigt, dass dieses Verfahren in dieser Form nicht funktioniert, da die Pfade schnell eine Sackgasse bilden können, ohne dass ein maximaler Fluss gefunden worden ist. 1 s 1 t s 1 t s t 2 2 2 (a) Der Beispielgraph mit Kapazität 1 für jede Kante. (b) Der maximale Fluss mit Wert 2. (c) Der Fluss, falls entlang des Pfades (s, 1, 2, t) augmentiert wird. Abbildung 3.1: Der einfache Graph aus (a) zeigt, dass schrittweises Augmentieren nicht immer einen maximalen Fluss liefert. Der maximale Fluss mit Wert 2 ist in (b) dargestellt. Falls jedoch im ersten Augmentierungsschritt der Pfad aus Abbildung (c) gewählt wird, kann der Fluss nicht weiter erhöht werden. Zur Lösung des Problems muss Fluss umgeleitet werden, das heiÿt auf Kanten, die bereits Fluss führen, muss der Fluss wieder verringert werden können. In der Situation aus Abbildung 3.1 (c) genügt es, Fluss entlang des Pfades Kante (s, 2, 1, t) zu schicken, wobei entlang der (1, 2) der Fluss nicht erhöht, sondern verringert wird. Die Flussbedingungen bleiben 21 3 Maximale Flüsse Residualnetzwerke dadurch erhalten. Um Fluss tatsächlich umleiten zu können, werden benutzt, die ein Netzwerk um zusätzliche Kanten erweitern. 3.1.1 Denition (Residualnetzwerk). schen jedem Knotenpaar ist und φ nur eine der beiden Kanten (v, w) oder (w, v) enthalten ← Rückwärtskante zu e = (v, w) ∈ E und E := {←e | e ∈ E} die Rückwärtskanten. Die Restkapazität von e ∈ E bezüglich φ ist deniert als e := (w, v) Menge der N = (V, E, s, t, c) ein Netzwerk, in dem zwi- N. ein Fluss auf ← v, w ∈ V Sei heiÿt cφ (e) := c(e) − φ(e) und die Restkapazität der zugehörigen Residualkante ← e ist deniert als cφ (← e ) := φ(e). Das Residualnetzwerk ← zum Fluss φ ist deniert als Nφ := (V, E ∪ E, s, t, cφ ). 0 2/2 1 2 2/8 1 0/2 t s 2 0/1 0 5/7 4 t 2 3 3/3 3 1 2 2/2 s 2 2 6 0/1 5 1 0 3 2 5 4 5/8 (a) Ein Netzwerk mit Fluss 5. Die Zahlen an den Kanten geben an, wieviel Fluss über sie ieÿt. Der maximale Fluss ist 8. Damit er erreicht werden kann, muss auf (2, 3) Fluss zurückgenommen werden. 3 (b) Das Residualnetzwerk mit den Restkapazitäten. Gestrichelte schwarze Kanten sind Residualkanten, blaue gestrichelte Kanten sind ausgeschöpft und können bei der Pfadsuche nicht mehr benutzt werden. Abbildung 3.2: Ein Netzwerk mit einem Fluss und das zugehörige Residualnetzwerk. Wir haben in dieser Denition die Einschränkung, dass nur eine Kante zwischen einem Paar von Knoten im Netzwerk vorhanden ist. Wenn es zwei solcher Kanten gäbe, würde das Hinzufügen der Residualkanten zu einem Multigraphen führen. Das ist keine Einschränkung, denn wenn zwischen zwei Knoten beide Kanten existieren, kann die Situation durch Einfügen eines Dummyknotens in eine der beiden Kanten bereinigt werden. d v w (a) Ein Kreis mit zwei Knoten. v w (b) Die Auösung mit dem temporären Knoten d. Es gilt c(v, d) := c(d, w) := c(v, w). Abbildung 3.3: Hinzufügen eines Dummyknotens, falls zwischen einem Knotenpaar beide gerichteten Kanten existieren. In Residualnetzwerken funktioniert die obige Idee, den Fluss sukzessive entlang augmentierender 22 s-t-Pfade zu erhöhen. Dabei werden Kanten mit Restkapazität 0 ignoriert. 3.1 Flussaugmentierende Verfahren 3.1.2 Algorithmus (Ford und Fulkerson [9]). ← Eingabe: Ein Residualnetzwerk Ausgabe: Ein maximaler Fluss 1 φ := 0 2 do 4 5 6 8 9 φ und ein Fluss φ. N. auf if existiert flussvergr ö ÿ ernder s - t - Pfad P in Nφ δ := min{cφ (e) | e ∈ P } for e ∈ E ∩ P φ(e) := φ(e) + δ 3 7 Nφ := (V, E ∪ E, s, t, cφ ) ← for ← e ∈E∩P φ(← e ) := φ(← e) − δ while existiert s - t - Pfad P Allgemein heiÿt das Verfahren, den Fluss in einem Residualnetzwerk schrittweise vom Nulluss zum maximalen Fluss zu saturieren, Ford und Fulkerson-Prinzip. Viele Algorith- men verfolgen dieses Prinzip und unterscheiden sich jeweils darin, wie eine zur Augmentierung genutzte Kantenmenge gefunden wird. 3.1.3 Satz (Korrektheit des Ford und Fulkerson-Algorithmus). Sei ein Netzwerk gegeben. Dann berechnet Algorithmus 3.1.2 einen maximalen Fluss φ auf N . Die benötigte Laufzeit ist O(mnU ) mit U := max{c(e) | e ∈ E}. N = (V, E, s, t, c) Beweis. In jeder Iteration der Schleife wird der Fluss um 1 erhöht. Da der Fluss nach oben beschränkt ist, hat der Algorithmus endliche Laufzeit. Betrachten wir die Situation, wenn der Algorithmus abbricht. Es gibt dann keinen Pfad mehr in Nφ . Wie in Lemma 2.3.2 sei erreichbaren Knoten und Vt := V \ Vt . Vs := {v ∈ V | ∃s-v -Pfad Die Menge in Nφ } s-t- die Menge der S := {e = (v, w) ∈ E | v ∈ Vs , w ∈ Vt } bildet einen Schnitt, dessen Wert mindestens so groÿ ist wie der Flusswert. Alle Kanten Pfad e = (v, w) ∈ S (s, . . . , v, w) sind saturiert, ansonsten könnte der Knoten erreicht werden. Kanten Fluss, da sonst die Residualkante s e = (w, v) ← e = (v, w) in S mit w ∈ Vt und v ∈ Vs w über den führen keinen positive Kapazität hätte und w auch von erreicht werden könnte. Weil (2.6) in Residualnetzwerken weiterhin gilt folgt zusammen mit diesen Betrachtun- gen X val(φ) = val(S) − φ(e) e=(v,w):v ∈V / s ,w∈Vs = val(S) − 0 Ein ussvergröÿernder s-t-Pfad kann in O(m) gefunden werden. Wenn entlang des Pfades augmentiert wird, wird eine vorher unsaturierte Kante saturiert und der Fluss um minde- 23 3 Maximale Flüsse stens 1 erhöht. Da der maximal zu erreichende Fluss durch ist die Gesamtlaufzeit n·U nach oben beschränkt ist, O(mnU ). 3.1.2 Algorithmus von Edmonds und Karp Wie in Abbildung 3.4 gezeigt, kann der Algorithmus tatsächlich pseudopolynomielle Laufzeit haben, wenn die Pfade entlang denen augmentiert wird, schlecht ausgewählt werden. Edmonds und Karp [7] und Dinic [6] haben gezeigt, dass es genügt, nur kürzeste augmentierende Wege zu betrachten. Dadurch kann der maximale Fluss in streng polynomieller Zeit berechnet werden. Im Beispielgraphen genügt es, den Fluss entlang der beiden Wege der Länge 2 zu augmentieren, um bereits mit zwei Augmentierungsschritten einen maximalen Fluss zu berechnen. 3.1.4 Algorithmus (Edmonds und Karp). Eingabe: Ein Residualnetzwerk Ausgabe: Ein maximaler Fluss 1 φ := 0 2 do 4 5 6 8 9 φ auf und ein Fluss φ. N. if existiert k ü rzester flussvergr ö ÿ ernder s - t - Pfad P in Nφ δ := min{cφ (e) | e ∈ P } for e ∈ E ∩ P φ(e) := φ(e) + δ 3 7 ← Nφ := (V, E ∪ E, s, t, cφ ) ← for ← e ∈E∩P ← φ( e ) := φ(← e) − δ while existiert s - t - Pfad P 3.1.5 Satz (Edmonds und Karp [7]). Der Algorithmus von Endmonds und Karp be- rechnet in einem Netzwerk N = (V, E, s, t, c) mit n := |V | Knoten und m := |E| Kanten einen maximalen Fluss in Laufzeit O(m2 n). Beweis. Wir beweisen zunächst eine Hilfsaussage. Es seien Flüsse, wobei φi entlang des Pfades Pi augmentiert werde und φ1 , φ2 , . . . Pi die entstandenen ein kürzester augmentie- render Pfad sei. Es sei k < `. Falls die Pfade Pk+1 , Pk+2 , . . . , P` Rückwärtskante ← e nicht eine Kante enthalten, gilt |Pk | ≤ |Pk+` | insbesondere gilt für alle k |Pk | ≤ |Pk+1 |. 24 e und gleichzeitig deren 3.1 Flussaugmentierende Verfahren 1 1 M 1 M s M s t 1 s t t M 2 2 2 (a) Die äuÿeren Kanten haben Kapazität M 1, die mittlere Kante Kapazität 1. (b) Der erste augmentierende Pfad. (c) Der zweite augmentierende Pfad, der (1, 2) als Rückwärtskante benutzt. Abbildung 3.4: Der maximale Fluss für dieses Netzwerk ist 2M und kann in zwei Augmentierungsschritten entlang der Pfade (s, 1, t) und (s, 2, t) erreicht werden. Bei einer ungünsitgen Wahl der Pfade werden jedoch 2M Schritte benötigt, jeweils abwechselnd M Schritte wie in (b) und (c). ← Es sei P` , E 0 := {e ∈ E ∪ E | e ∈ Pk ∪ P` ∧ ← e∈ / Pk ∪ P` } die Multimenge aller Kanten in Pk und die nicht zusammen mit ihrer Rückwärtskante auf den beiden Pfaden enthalten sind. Kanten, die auf beiden Pfaden liegen, kommen doppelt in E0 vor. Es ist dann G0 := (V, E 0 ) der aus dieser Kantenmenge entstehende Graph. Für einen Fluss φi sei die Menge der benutzten Kanten deniert als ← Eφi := {e ∈ E ∪ E | φi (e) > 0}. Dann gilt nicht in E 0 ⊆ Eφk : E φk Da φk enthalten war, aber in sein, die von einem der Pfade setzung in durch Pk+1 , . . . , Pk+`−1 Pk augmentiert wird, gilt Eφk+` Pk ⊆ Eφk . Eine Kante, die enthalten ist, muss Rückwärtskante einer Kante Pk , Pk+1 . . . , Pk+`−1 hinzugefügt worden ist. Da nach Voraus- eine solche Kante nicht vorkommt, muss sie in sein. Diese Kanten werden jedoch nicht in 0 In E existieren zwei kantendisjunkte E0 Pk enthalten aufgenommen. s-t-Pfade Q1 und Pk+` eine Kante 0 doppelt nutzen, gibt es an dieser Stelle die Mehrfachkanten in E . Wenn die Pfade jedoch und Q2 : Falls Pk eine Vorwärts- und Rückwärtskante gemeinsam benutzen, wird ein solches Kantenpaar entfernt. Betrachten wir zunächst den Pfad e1 = (v1 , w1 ) entfernt worden ist. Dann liegt die Kanten ab v1 auf Pk+` Pk v1 bis zur ersten Stelle, an der eine Kante auf Pk+` und wir können den Pfad über verlängern bis zur zweiten Kante und rückwärts durchlaufen wird. Ab v2 e2 = (v2 , w2 ), die vorwärts kann der Pfad wieder ein Stück entlang von Pk verlängert werden. Schlieÿlich wird irgendwann die Senke erreicht. Die alternierenden Teilstücke zusammen bilden so den Pfad Q1 . Wenn wir mit dem ersten Teilstückvon beginnen, können wir genauso verfahren um den Pfad Q2 Pk+` zu bilden. Diese Konstruktion ist in Abbildung 3.5 zu sehen. 25 3 Maximale Flüsse v w v (a) Der grüne Pfad ist Pk , der blaue Pk+` . Die Kanten (v, w) und (w, v) werden nicht in E 0 aufgenommen. w (b) Die Pfade Q1 und Q2 , die bis v , beziehungsweise ab w, den Pfad Pk nutzen und auf den Pfad Pk+` wechseln. Abbildung 3.5: Eine Kante (v, w), die von Pk und als Rückwärtskante auch von Pk+1 benutzt wird. Es existieren Wege über v und w, die den benutzten Pfad wechseln. Bei der Konstruktion können keine Probleme auftreten. Jeder Knoten hat entweder vier oder zwei eingehenden und ausgehenden Kanten, oder gar keine. Die möglichen Fälle wer3 den in Abbildung 3.6 dargestellt. v w v (a) Ein Knoten wird nur auf einem Pfad benutzt. w v (b) Die beschriebene Situation, in der die Kanten zwischen v und w entfernt werden. w (c) Die doppelte Kante (v, w) kann von beiden kantendisjunkten Pfaden benutzt werden. Abbildung 3.6: Die möglichen Situationen, die an einem Knoten auftreten können. Falls sowohl beide eingehenden als auch ausgehenden Kanten entfernt werden, ist der Knoten isoliert und wird nicht betrachtet. Pk Da ein kürzester augmentierender Pfad war, gilt |Pk | ≤ |Q1 | und |Pk | ≤ |Q2 | und damit |Pk | + |Pk | ≤ |Q1 | + |Q2 | ≤ |E 0 | ≤ |Pk | + |Pk+` | ⇔ |Pk | ≤ |Pk+` | Falls Pk ∪ Pk+` eine Kante und gleichzeitig die zugehörige Rückwärtskante enthalten, gilt auch |Pk | + 2 ≤ |P` |. Hierfür genügt es, Pi ∪ P` k und ` i ∈ {k + 1, k + 2, . . . , ` − 1} in kein Paar einer Kante und zugehörigen Rückwärtskante enthalten ist, denn für alle sonstigen Pfade kann wegen 3 so zu wählen, dass für alle |Pk | ≤ |Pk+1 | die entsprechende Ungleichung gezeigt werden. Gerichtete Graphen, mit der Eigenschaft, dass | d+ (v)| = | d- (v)| an jedem Knoten v gilt, heiÿen Euler'sch. Ein Euler'sches Netzwerk mit zusätzlichen Kanten (t, s) enthält allgemein so viele disjunkte Pfade wie Kanten (t, s). Damit folgen die gezeigten Eigenschaften ebenfalls (vgl. [24, Kapitel 8.2 und 8.3]). 26 3.1 Flussaugmentierende Verfahren Da mindestens zwei Kanten entfernt werden, gilt diesmal für die gefundenen kantendisjunkten Pfade Q1 und Q2 |Pk | + |Pk | ≤ |Q1 | + |Q2 | ≤ |E 0 | ≤ |Pk | + |Pk+` | − 2 ⇔ |Pk | + 2 ≤ |Pk+` |. Jeder Pfad Pi , der augmentiert wird enthält mindestens eine Flaschenhalskante, die festlegt. Seien für eine solche Flaschenhalskante den Pfade, auf denen sie liegt. Da aufeinanderfolgende Pfade die Rückwärtskante ← e Pj und liegt, die e e e die Pfade ein Pfad Pk mit ij < k < ij+1 wieder unsaturiert. Falls 3 e nicht s j. existieren, auf dem t oder als Endpunkt Kanten lang sein und können nicht alle enthalten, da sonst jeder Knoten benutzt worden wäre. Es gilt also alle die augmentieren- durch jeden dieser Pfade saturiert wird, muss für zwei Pj+1 hat, müssen die Pfade mindestens Pi1 , Pi2 , . . . δ n Kanten 3 ≤ |Pij | ≤ n − 1 für Wegen |Pij | + 2 + 2 ≤ |Pk | + 2 ≤ |Pij+1 | Pij für wachsende j jeweils um 4 Kanten länger, insgesamt gibt es also höchstens 1 4 (n − 1) + 1 solcher Pfade die e als Flaschenhalskante enthalten. Falls e an der Quelle oder werden die Senke liegt, enthält mindestens einer der Pfade diese Kante als Flaschenhalskante. Da keine Pfade mehr zur Quelle zurück- oder aus der Senke herausführen, werden sie nicht mehr benutzt. Sie bleiben damit saturiert. Jeder Pfad enthält mindestens eine Flaschenhalskante. Insgesamt gibt es m Kanten. Es mn kann also höchstens 2 augmentierende Pfade geben. Da jede Pfadsuche mittels Breiten2 suche Laufzeit O(m) hat, beträgt die Gesamtlaufzeit des Algorithmus O(m n). Der fast zeitgleich von Dinic angegebene Algorithmus [6] verändert den Fluss nicht mehr nur auf Pfaden, sondern auf einer gröÿeren Kantenmenge, dem sogenannten Sperruss. Dabei werden gleichzeitig alle kürzesten Pfade augmentiert. Wie im Beweis von Satz 3.1.5 gezeigt, werden kürzeste Pfade immer länger. Gleichzeitig werden alle kürzesten Pfade gefunden. Es werden also nur n Augmentierungsphasen mit jeweils Laufzeit n · m durchge- führt. Die Laufzeit ist somit durch O(mn2 ) beschränkt. Die Sperrussberechnung wurde weiter verbessert, so zum Beispiel von Malhotra, Kumar und Maheshwari [25], die einen Präuss nutzen, der zunächst ungültig ist und verbessert wird. Dadurch kann ein Sperruss in O(n2 ) berechnet werden, was zu einer Gesamtlaufzeit von O(n3 ) führt. Ein komplett anderer Ansatz wurde 1988 von Goldberg und Tarjan [13] veröentlicht. Sie benutzen auch einen Präuss, der solange auf einzelnen Kanten geändert wird, bis ein gültiger Fluss entsteht, der dann auch maximal ist. Für dieses (oder auch Preow-Push-Verfahren Push-Relabel-Verfahren ) gibt es ebenfalls verschiedene Implementierungen und 3 kann O(n ) und 2 imO nm log nm (heuristische) Verbesserungen. Die erste Variante hatte eine Laufzeit von mit einer speziellen Datenstruktur von Sleator und Tarjan [33] in plementiert werden. Die zur Zeit schnellsten Varianten stammen von King, Rao und Tarjan [23] sowie Goldberg und Rao [12] mit Laufzeiten von O mn + n2+ε beziehungsweise 27 3 Maximale Flüsse 2 2 1 O min n 3 , m 2 m log nm log U , wobei U := max{c(e) | e ∈ E} die maximale Kapa- zität ist. Planare Graphen Ford und Fulkerson gaben 1956 einen Algorithmus an, der einen ma- ximalen Fluss in einem st-planaren Variante in der Ebene gezeichnet ( Graphen berechnet. Dies sind Graphen, die auf eine eingbettet ) werden können, in der sich keine Kanten kreuzen. Zusätzlich liegen die Quelle und die Senke auÿen. In diesem speziellen Fall kann (ausgehend von einer Einbettung) der Pfad immer entlang der obersten Pfade augmentiert werden. Da in diesem Fall niemals Fluss zurückgenommen werden muss, kommt die Berechnung ohne Residualkanten aus. Dieser Algorithmus hat ohne weitere Optimierungen eine Laufzeit von in einem st-planaren O(m2 ). Hassin zeigte, dass ein maximaler Fluss Graphen einem kürzesten s-t-Weg im zugehörigen dualen Graphen 4 entspricht[18]. In planaren Graphen können kürzeste Wege in linearer Zeit in der Anzahl der Knoten berechnet werden[19]. Zusammen führt dies zu einem Berechnung maximaler Flüsse in st-planaren O(n)-Algorithmus zur Graphen. 3.2 Das Abstrakte-Fluss-Verfahren 3.2.1 Vorüberlegungen Sowohl Homans Beweis [20] von Satz 2.4.7 als auch der originale Beweis zum einfachen Max-Flow-Min-Cut-Theorem auf Graphen von Ford und Fulkerson [10] sind nicht konstruktiv. McCormick [27] entdeckte einen polynomiellen Algorithmus, der im von Homan eingführten Szenario der abstrakten Graphen (vgl. Denition 2.4.1) einen maximalen Fluss berechnet. Wir betrachten den Algorithmus zunächst in der ursprünglichen Version von McCormick; in Kapitel 4.1 wird das Verfahren des Algorithmus dann auf kantenbasierte Flüsse in Netzwerken nach Denition 2.2.4 angewendet. Sei im Folgenden Graph mit m := |E| Elementen und einem Fluss φ. Die Menge G = (E, P) ein abstrakter P+ := {P ∈ P | φP > 0} bezeichnet die Menge der positiven Pfade. Zusätzlich zu den Voraussetzungen in Denition 2.4.1 fordern wir, dass in jeder Kreuzungsmenge (P, e, Q) ein Pfad Zur Berechnung eines maximalen Flusses werden die Pfadgewichte R 6= ∅ r(P ) enthalten ist. nicht benötigt. Das Problem bei pfadbasierten Darstellungen von Flüssen ist die groÿe Anzahl der möglichen Pfade, die im schlechtesten Fall exponentiell in m ist. Das Problem kann umgangen werden, indem die Pfade nicht gespeichert werden, sondern ein Orakel angenommen wird, das einen Pfad angeben kann. Zusätzlich werden alle Pfade φP > 0 4 P mit echt positivem Flusswert gespeichert. Eine Einbettung eines Graphen unterteilt die Ebene in Flächen. Im dualen Graphen entspricht jeder dieser Flächen einem Knoten. Zwei Knoten sind verbunden, wenn ihre Flächen im ursprungsgraphen aneinander grenzen. 28 3.2 Das Abstrakte-Fluss-Verfahren 3.2.1 Bemerkung. Sei Kn ein vollständiger gerichteter Graph mit n Knoten, dessen Kan- ten von Knoten mit niedrigem Index zu Knoten mit hohem Index verlaufen (vgl. Denition 4.3.1). In solchen Graphen gibt es für n. n≥2 K2 Ein Beweis folgt per Induktion. Ein genau 2n−2 Pfade zwischen den Knoten es also einen Pfad über i ∈ {1, 2, . . . , n} 1-(n + 1)-Pfad (1, n + 1). die Kanten (i, n + 1) der die neue Kante Sei die Anzahl der IV = n X i=2 n X Kn zu einem hinzugfügt. Für jeden (i, n + 1) 1-i-Pfade P (1, n + 1) = und besteht aus zwei Knoten die mit einer Kante verbunden sind und es gibt genau einen Pfad. Erweitern wir nun einen Es werden für 1 mit Kn+1 . 1-i-Pfad gibt nutzt. Zusätzlich gibt es einen P (1, i) bezeichnet. Dann gilt P (1, i) + 1 2i−2 + 1 i=2 = 2n−2 − 1 + 1 = 2n−2 1 2 3 1 (a) Der K3 enthält die beiden Pfade (1, 3) und (1, 2, 3); zusätzlich gibt es einen Pfad (1, 2) von 1 nach 2. 2 3 4 (b) Im K4 entstehen aus den Pfaden von 1 nach 3 im K3 die Pfade (1, 3, 4) und (1, 2, 3, 4), der Pfad (1, 2) kann verlängert werden zu (1, 2, 4) und es gibt die zusätzliche Kante (1, 4). Abbildung 3.7: Der induktive Schritt vom gerichteten K3 zum gerichteten K4 . Im ersten Graphen gibt es zwei 1-3-Pfade, während es durch Verlängerung der Pfade insgesamt 2 + 1 + 1 = 4 = 22 Pfade von 1 nach 4 im K4 gibt. Die Anzahl der erzeugten positiven Pfade bleibt polynomiell in m, so dass wir alle Pfade + durchsuchen können, wenn es nötig ist. Einen Pfad zu nden, der nicht in von P P+ liegt, dauert zu lange. Um trotzdem solche Pfade nden zu können, nutzen wir ein Orakel, das aus den exponentiell vielen möglichen Pfaden einen passenden aussucht, falls es einen solchen gibt. 3.2.2 Denition (Orakel). Das Orakel O F ⊆E eine Teilmenge der Elemente. ist ein Algorithmus, der einen Pfad solcher Pfad existiert, stellt Orakels sei Sei O ∅ 6= P ∈ P ∩ F bestimmt. Falls kein fest, dass es keinen solchen Pfad gibt. Die Laufzeit des O(1). Das lineare Programm 2.4.3 berechnet einen maximalen Fluss, das dazugehörige duale Programm berechnet einen minimalen Schnitt. Die Probleme einen maximalen Fluss und 29 3 Maximale Flüsse einen minimalen Schnitt zu nden, sind also dual zueinander. Der Satz des komplementären Schlupfes (2.1.3) erlaubt nun, Aussagen über die Maximalität von zulässigen Lösungen für diese beiden Probleme zu treen: sind zwei Lösungen φ ∈ R|P| für einen Fluss und y ∈ Rm für einen Schnitt gegeben, kann damit getestet werden, ob sie maximal sind. Der Satz von Homan (2.4.7) impliziert, dass eine ganzzahlige Lösung für Programm 2.4.4 existiert. Die Bedingung des Programms ist für einen Pfad für ein Element ein e∈P 0-1-Vektor. ye e ∈ L :⇔ ye = 1 Sei P ∈P erfüllt. Weil die Summe über positive P c(e)ye bereits mit ye = 1 minimiert wird, ist y kann als Inzidenzvektor aufgefasst werden und bestimmt direkt durch eine Menge L ⊆ E. ein Pfad und es sei 1 − y T AP · φ P = 0 wie in Satz 2.1.3 gefordert. Diese Gleichung ist erfüllt, falls auf dem Pfad kein Fluss ieÿt. Andernfalls gilt gleichzeitig y T AP = a1P y1 + a2P y2 + · · · + amP ym = 1 aiP 6= 0 Umgkehrt sei und e∈E und es ist genau für ein i yi 6= 0. ein Element und es gelte entsprechend ye · ATe x − c(e) = 0. Auch diese Gleichung ist trivialerweise für 0 ⇔ Ae1 x1 + Ae2 x2 + · · · + Aep xp = c(e), ye = 0 erfüllt. Andernfalls gilt Ae x − c(e) = die Kapazität des Elements wird also auf dem Pfad durch den Fluss genau ausgeschöpft. Für einen gegebenen Fluss φ und eine Menge L ⊆ E können wir damit überprüfen, ob es sich um einen maximalen Fluss beziehungsweise minimalen Schnitt handelt. Dies ist genau dann der Fall, wenn die obigen Betrachtungen gelten und L mit dem Vektor ye korrespondiert und zusätzlich die beiden trivialen Fälle nicht gelten, das heiÿt es existiert kein Pfad ohne Fluss. 3.2.3 Eigenschaft (Komplementärer Schlupf). Sei L⊆E und φ ein Fluss auf G. Jeder positive Pfad enthält genau eine Kante aus Jedes Element in L wird von φ L. saturiert. (3.1) (3.2) Solange diese Eigenschaft nicht gilt, kann der Fluss nicht maximal sein; wir können in diesem Fall versuchen, einen augmentierenden Pfad zu nden und die Menge L anzupassen, so dass die Eigenschaft anschlieÿend gilt. Sie beschränkt sich auf positive Pfade, da es davon nur polynomiell viele gibt, die wir alle überprüfen können. Falls es noch einen Pfad mit Fluss 0 gibt, kann der Flusswert erhöht werden und anschlieÿend muss die Eigenschaft für 30 3.2 Das Abstrakte-Fluss-Verfahren diesen Pfad ebenfalls überprüft werden. Solche Pfade können mit dem Orakel bestimmt werden. Zunächst wollen wir überlegen, welche Menge L für unsere Zwecke benutzt werden kann. In Lemma 2.3.4 werden die Mengen S ∗ := {e ∈ E | e wird saturiert von jedem maximalen Fluss} und L∗ := {e ∈ S ∗ | ∃ deniert auch S∗ 5 Pfad und es wird gezeigt, dass trennend. L∗ P : e ∈ P ∧ ∀ e 6= f ∈ P : f ∈ / S ∗ ∨ f >P e} L∗ eine trennende Menge ist; wegen L∗ ⊆ S ∗ beschreibt die Teilmenge der linkesten Elemente aus positiven Pfad. Nach dieser Idee bestimmen wir auch die Menge saturierten Elemente auf jedem positiven Pfad in φ. Lφ S∗ ist dann auf jedem als Menge der linkesten Insgesamt nutzen wir eine Partition der saturierten Kanten in drei Teilmengen: Sφ := {e ∈ E | e wird von Lφ := {e ∈ Sφ | e φ saturiert} ist linkestes Element auf einem positiven Pfad} Aφ := Sφ \ Lφ Tφ := ∅ Lφ erfüllt automatisch (3.2). Angenommen, Lφ erfüllt sogar beide Bedingungen des komplementären Schlupfes. Wenn gleichzeitig kein Pfad mit Fluss keine Elemente aus Lφ 0 mehr existiert, der benutzt, ist der Fluss optimal. Insgesamt führt dies zu folgendem Verfahren: 1. Überprüfe, ob die Eigenschaft 3.2.3 erfüllt ist. 2. Wenn das nicht der Fall ist, korrigiere 3. Falls E \ Lφ Lφ . keinen Pfad mehr enthält, ist φ ein maximaler Fluss und Lφ minimaler Schnitt. 4. Wenn φ nicht maximal war, nde eine Möglichkeit zum Augmentieren und fahre bei 1) fort. Wir weisen den drei disjunkten Teilmengen von Sφ folgende Bedeutung zu: jeweilige Menge, die vielleicht einen minimalen Schnitt darstellt. Die Menge Kanten, die eventuell noch zu bekannt ist. Lφ Lφ Aφ ist die enthält hinzugefügt werden müssen, über die aber noch nichts kann Elemente enthalten, die zwar saturiert sind, jedoch nicht zwangsweise saturiert werden müssen, denn nur L∗ enthält die Elemente, die von jedem Fluss saturiert werden. Diese fälschlicherweise saturierten Elemente werden in 5 Lφ Tφ gesammelt; es können Die Denition wurde angepasst an die Notation von abstrakten Graphen. 31 3 Maximale Flüsse also Elemente von Lφ nach Tφ verschoben werden und von Aφ nach Lφ oder auch Tφ . Die Anpassung der Mengen soll dabei möglichst gut sicherstellen, dass die Bedingungen des komplementären Schlupfes gelten. Da Elemente aus Tφ nicht zu jedem maximalen Fluss gehören, erlauben wir solche Ele- mente auf ussvergröÿernden Pfaden. Da sie jedoch vom aktuellen Fluss bereits saturiert werden, muss ein anderer Weg gefunden werden, um tatsächlich den Fluss zu erhöhen. In diesem Fall läuft das so ab, dass wir eine Menge von Pfaden suchen, deren Flusswerte abwechselnd erhöht und verringert werden können. Damit val(φ) tatsächlich erhöht wird, muss es einen Pfad mehr geben, auf dem der Fluss erhöht wird. Die Initialisierung der Menge Lφ muss dabei in jedem Augmentierungsschritt neu durchgeführt werden. 3.2.2 Pfade nden Lφ am Anfang jedes Augmentierungsschrittes, genügt es über + alle Pfade in P zu iterieren und das jeweils erste saturierte Element festzustellen. Es gilt Zum Initialisieren der Menge dann folgende Eigenschaft: 3.2.4 Eigenschaft. ∀ e ∈ Lφ gilt: e ist linkestes Element aus (Lφ ∪ Aφ ) auf einem Pfad. Wir wollen diese Eigenschaft für den restlichen Augmentierungsschritt invariant halten. Darum müssen wir immer, wenn die Menge Lφ geändert wird, dafür sorgen, dass die Invariante weiterhin gilt. Die Eigenschaften des komplementären Schlupfes gelten jedoch nicht unbedingt. Da nur saturierte Elemente betrachtet werden, ist (3.2) auf jeden Fall erfüllt. Es können jedoch Pfade existieren, auf denen mehrere Elemente aus Lφ liegen. Um (3.1) besser zu erfüllen, werden überüssige Elemente in Tφ verschoben. Diese Ele- mente betrachten wir als wären sie nicht saturiert, das heiÿt, dass zusätzlicher Fluss über sie ieÿen kann. Dies wird in Eigenschaft 3.2.4 angedeutet, wo nur gefordert wird, dass ein Element aus Lφ nur linkestes Element aus Lφ ∪ Aφ entlang eines positiven Pfades sein muss, nicht jedoch linkestes saturiertes Element überhaupt. Wenn wir überüssige Kanten aus Lφ entfernen, nähern wir uns (3.1) zumindest an, da damit immerhin jeder positive Pfad höchstens ein Element aus dies, indem Elemente aus nach Tφ L φ ∪ Aφ , Lφ enthält. Realisiert wird die sich links eines anderen Elements aus Lφ benden, verschoben werden. Dass dies korrekt ist, zeigt folgendes Lemma: 3.2.5 Lemma. Sei φ ein Fluss auf einem Netzwerk G = (E, P) und P ein positiver Pfad mit einem saturierten Element e ∈ Lφ und einem weiteren saturierten Element f ∈ Lφ ∪Aφ , das links von e liegt. Weiterhin existiere ein Pfad P 0 , auf dem e erstes Element aus Lφ ∪Aφ ist. Dann existiert ein Fluss φ0 mit gleichem Wert, der f nicht saturiert und f kann dann in die Menge Tφ verschoben werden. 32 3.2 Das Abstrakte-Fluss-Verfahren Beweis. Wir beweisen durch Induktion die stärkere Aussage, dass der Fluss auf dem i-ten Element f, auf das dieses Lemma angewendet wird, um i-ten dass jedes nicht saturierte Element im von 1 2i−1 Sei Schritt noch mindestens eine Restkapazität hat. i = 1, es werde also das erste Paar saturierter Elemente auf einem positiven Pfad betrachtet. Nach Voraussetzung ist ist 1 verringert werden kann und 2i Tφ = ∅. e das erste Element aus Also kann entlang dieses Pfades mindestens Fluss Aφ ∪ L φ 1= auf P 0, auÿerdem 1 bis zum Element 20 e geschickt werden. Da von P 1= ein positiver Pfad ist, kann der Fluss entlang des Pfades auch mindestens in Höhe 1 verringert werden. 20 Die beiden Pfade schneiden sich in in (P 0 , e, P ) Entlang P e und mit dem Orakel können wir einen Pfad bestimmen und entlang dieses Pfades den Fluss um kann der Fluss um ε alle diese liegen jedoch links von P 0, 1 2 1 erhöhen. 21 = verringert werden und er bleibt gültig. Tatsächlich wird der Fluss nur auf Elementen in liegt und nicht auf ε := P 00 e und damit auf wird der Fluss auf f P 00 erhöht, die nicht bereits auf P P0 und sind nicht saturiert. Da auf jeden Fall um ε f liegen, auf P verringert. Der Flusswert ändert sich jedoch nicht. Die freie Kapazität aller (vorher) freien Kanten und auch aller Kanten in Sei nun Tφ ist nun mindestens i > 1. 1 1 , jedes positive Element führt mindestens Fluss . 2 21 Nach Voraussetzung ist e das erste Element aus Pfad, auÿerdem kann dieser Pfad auch Elemente aus Tφ Das Orakel liefert einen Pfad erhöht werden kann. Entlang Da f auf P und nicht P0 P P 00 P 1 verringert werden. 2i−1 1 1 entlang dem der Fluss um ε := · i−1 2 2 wird der Pfad um liegt, ist f 1 . Weiterhin kann nach 2i−1 um mindestens (P 0 , e, P ) in auf einem enthalten. Nach Induktionsvor- aussetzung ist die freie Kapazität dieser Elemente mindestens Induktionsvoraussetzung der Fluss auf Aφ ∪ Lφ = ε verringert; dabei bleibt der Fluss gültig. nicht mehr saturiert und kann nach Tφ verschoben werden. Die Kapazität aller (vorher) nicht saturierten Elemente und aller Elemente in ist nun mindestens 1 2i 1 1 , jedes positive Element führt mindestens Fluss i . 2i 2 T ein maximaler Fluss ist, können die Elemente, die in Tφ verschoben werden, ∗ nicht in L enthalten sein, da sie von einem Fluss gleichen Wertes nicht saturiert werden. Falls φ Da der neu berechnete Fluss nicht ganzzahlig ist, liefert dieses Lemma kein konstruktives Vorgehen, das wir benutzen können. s v x w t y Abbildung 3.8: Die in Lemma 3.2.5 beschriebene Situation. Geschlängelte Kanten entsprechen beliebigen Pfaden im Netzwerk. 33 3 Maximale Flüsse Es bleibt die Aufgabe, doppelte Kanten in Lφ ∪ Aφ entlang positiver Pfade zu nden. Dazu genügt es, alle positiven Pfade durchzugehen und zu überprüfen, ob mehrere saturierte Elemente aus Elemente in Tφ Lφ und Aφ auf diesem Pfad enthalten sind und die links liegenden zu verschieben. 3.2.6 Algorithmus (ReduceL). Eingabe: Die Menge P+ der positiven Pfade und die Partition Ausgabe: Eine angepasste Partition Lφ ∪· Aφ ∪· Tφ Lφ ∪· Aφ ∪· Tφ . nach Lemma 3.2.5. for P ∈ P+ mit |P ∩ Lφ | ≤ 2 e := das rechteste saturierte Element aus Lφ auf P for f ∈ Lφ ∪ Aφ links von e auf P Lφ := Lφ \ {f } Aφ := Aφ \ {f } Tφ := Tφ ∪ {f } in(f ) := e P out (f ) := P end for 1 2 3 4 5 6 7 8 9 Nachdem dieser Algorithmus ausgeführt worden ist gilt Eigenschaft (3.1). Er arbeitet korrekt, da nach Lemma 3.2.5 die links liegenden saturierten Elemente nach Tφ verschoben werden können. Das Lemma ist wegen Eigenschaft 3.2.4 anwendbar, da sie zusichert dass jedes Element in Lφ linkestes saturiertes Element auf einem Pfad ist. 3.2.7 Denition (Verletzender Pfad). φ und Sφ = Lφ ∪· Aφ ∪· Tφ Ein Pfad P ∈ P, Sei G = (E, P) ein abstrakter Graph mit Fluss die Partition der saturierten Kanten. der keine Kante aus Lφ enthält, heiÿt Ein verletzender Pfad ist ein Pfad, der beweist, dass Lφ verletzender Pfad. kein Schnitt ist. Mittels des Ora- kels kann ein solcher Pfad gefunden werden, indem ein Pfad in E \ Lφ gesucht wird. Wenn vor der Orakelanfrage ReduceL ausgeführt worden ist und ein solcher Pfad nicht gefunden wird, ist der Fluss φ maximal, da nun beide Teile der Eigenschaft des komplementären Schlupfes gelten. Andernfalls wurde ein verletzender Pfad V gefunden. Falls ein Pfad ohne Aφ -Elemente gefunden wurde, können dessen Elemente alle zur Augmentierung benutzt werden. Sonst sei f die linkeste aller Aφ -Kanten auf eine Schnittkante ist, oder ob sie zu liegt, verschieben wir sie in Lφ , V. Tφ Über diese Kante wissen wir noch nicht, ob sie gehört. Da sie aber auf einem verletzenden Pfad um damit den komplementären Schlupf besser zu erfüllen. Allerdings kann es auch passieren, dass es nun wieder einen positiven Pfad gibt, der mehr als ein Element aus 34 Lφ ∪ Aφ enthält. Wir fahren also in einer Schleife solange erneut mit 3.2 Das Abstrakte-Fluss-Verfahren einem Aufruf von Algorithmus 3.2.6 fort, bis entweder ein Pfad ohne wurde oder Aφ -Elemente gefunden φ als maximal erkannt wird. Durch den erneuten Aufruf von Algorithmus 3.2.6 wird Eigenschaft 3.2.4 wieder gesichert. Dies führt zu folgendem Algorithmus: 3.2.8 Algorithmus (SearchForPaths). Eingabe: Abstrakter Graph mit Fluss Ausgabe: Ein Pfad V ohne φ und den Mengen Aφ -Elemente do 2 ReduceL() V := O(E \ Lφ ) e := das linkeste Aφ - Element auf V if e 6= ⊥ Lφ := Lφ ∪ {e} Aφ := Aφ \ {e} until V = ∅ or e = ⊥ 3 5 6 7 8 und oder die Feststellung, dass 1 4 Lφ , Aφ φ Tφ . maximal ist. 3.2.3 Pfad zusammensetzen Die Pfadsuche stoppt, wenn ein Pfad ohne Aφ -Elemente gefunden wurde, der jedoch Tφ - Elemente enthalten kann. Lemma 3.2.5 garantiert, dass diese Elemente unsaturiert werden können, liefert dabei aber einen fraktionalen Fluss. Bei direkter Anwendung des Lemmas nacheinander auf jede in Tφ verschobene Kante könnte der Fluss zwar direkt ganzzahlig umgeleitet werden, durch weitere Pfadsuchen könnte er jedoch erneut in die Ursprungssituation gebracht werden, so dass eine Endlosschleife entstünde. Stattdessen werden die saturierten Elemente alle gespeichert und wir können eine Folge von Pfaden berechnen, die zwischen den saturierten Elementen den Fluss erhöht oder verringert. Wir wollen Pfade c(Pk0 ) für alle P10 , P20 , . . . , Pj0 nden, die augmentiert werden können, das heiÿt φPk0 < 1 ≤ k ≤ j. ReduceL speichert für die in Tφ verschobenen Elemente f den out ursächlichen Pfad als P (f ) und die rechts liegende verursachende Lφ -Kante als in(f ). Wir werden eine Folge von out mente kürzer Pk in und schreiben Pk := Tφ -Elementen (ek ) bestimmen und schreiben für solche Ele- P out (e k ). Genauso bestimmen wir eine Folge von Lφ -Elementen (ik ) := P in (ik ). Während entlang der Pfade Pk0 der Fluss erhöht werden soll, out für 1 ≤ k < j verringert. Wenn der Fluss jeweils um wird der Fluss entlang der Pfade Pk δ erhöht oder verringert wird, ändert sich der Flusswert und ganzzahligen Fall gilt jδ − (j − 1) · δ = δ > 0. δ ≥ 1. Daher müssen wir die nötigen Pfade noch nden. Falls der zuletzt gefundene Pfad keine Tφ -Elemente Im enthält, kann der Fluss entlang V V augmentiert werden. Anderenfalls 35 3 Maximale Flüsse P1in e1 P1out i1 P1out P1 (a) Die Pfade P1 (rot) und P1out (blau) schneiden sich (b) Die Pfade P1in (rot) und P1out (blau) schneiden in e1 . Der vom Orakel in (P1out , e1 , P1 ) gefundene sich in i1 . Der vom Orakel in (P1in , i1 , P1out ) Pfad ist dicker gezeichnet. gefundene Pfad ist dicker gezeichnet. P1in e1 i1 P1out P10 P1 P2 (c) Die dickeren Pfade wurden beide vom Orakel gefunden. Falls P2 keine Tφ -Kante enthält, kann gestoppt werden. Der Fluss ändert sich nur auf dem Stück zwischen e1 und i1 , auf dem garantiert keine saturierte Kante liegt. Der Fluss kann entlang P10 und P2 erhöht und entlang P1out verringert werden. Abbildung 3.9: Die augmentierenden Pfade nach dem ersten Schritt. sei P1 = V , e 1 das rechteste Tφ -Element auf P1 und i1 := in(e1 ) das Lφ -Element e1 in Tφ verschoben worden ist. out Beide Elemente liegen auf P1 . Nach Eigenschaft 3.2.4 existiert ein Pfad das in Algorithmus 3.2.6 dafür sorgte, dass P1in auf dem i1 liegenden saturierten Elemente in Tφ sind. Nach Voraussetzung gibt es in out (P1 , e1 , P1 ) einen Pfad P10 6= ∅, der durch einen Orakelaufruf O((P1out , e1 , P1 )) gefunden out und P in , so dass das Orakel auch einen werden kann. Gleichzeitig liegt i1 auch auf P1 1 in out Pfad P2 in (P1 , ii , P1 ) ndet. Die Situation ist in Abbildung 3.9 beschrieben. alle links von Falls sich die bestimmten Pfade nicht überschneiden und P2 kein Tφ -Element links von i1 enthält, kann der Fluss augmentiert werden: Der Fluss auf den Pfaden P10 und P2 wird out (i ) verringert. Was passiert, falls sich die berechneten Pfade schneiden, erhöht und auf P 1 betrachten wir später. Wir betrachten zunächst den Fall, dass i1 enthält. Dieses Element sei neue Pfade P20 in Falls nun P3 kein (P2out , e2 , P2 ) e2 und wie oben sei P3 und in kann das Verfahren mit e3 i2 := in(e1 ). (P2in , i2 , P2out ) Tφ -Element links von i2 P2 ein Tφ -Element links von Mit dem Orakel können gefunden werden. enthält, kann augmentiert werden. Andernfalls iterativ fortgesetzt werden. Es stoppt, sobald für ein durch das Orakel gefundene Pfad Pk keine Tφ -Elemente links von ik−1 mehr enthält. 3.2.9 Algorithmus (FindPath). Eingabe: Ein verletzender Pfad V Ausgabe: Eine Folge von Pfaden 36 ohne Pk0 , k∈N Aφ -Elemente die augmentiert werden können. der 3.2 Das Abstrakte-Fluss-Verfahren 2 P1 := V k := 1 3 P0out := ∅ 4 out while Pk \ Pk−1 enth ä lt ein Tφ - Element out ek := das rechteste Tφ - Element auf Pk \ Pk−1 ik := in(ek ) Pk0 := Pfad in (Pkout , ek , Pk ) Pk+1 := Pfad in (Pkin , ik , Pkout ) k := k + 1 end while j := k Pj0 := Pj 1 5 6 7 8 9 10 11 12 3.2.10 Satz. Der Algorithmus berechnet eine Folge von Pfaden auf denen der Fluss abwechselnd verringert und erhöht werden kann. Beweis. Solange die Schleife nicht verlassen wird, ist out Pi \Pk−1 ein Pfad, der ein Tφ -Element enthält. Für 1<k<j links von out . Pk−1 ek auf sind die Teilpfade Pk0 liegen auf out Pk0 \ P out (ik ) \ Pk−1 P out (ik ). Sämtliche Elemente links von Auf ik−1 Pk auf Pk nicht saturiert, denn alle Elemente liegen alle Elemente rechts von liegen auf in . Pk−1 in das linkeste Tφ -Element auf Pk−1 und auf dem Pfad liegen keine ik−1 . Der Teilpfad zwischen ek und ik−1 ik−1 auf Nach Denition ist Aφ und Lφ -Elemente ek vor ist also unsaturiert. P1in e1 i1 P10 P2in P1 e2 P20 P1out i2 P2out P30 Abbildung 3.10: Die Menge der Pfade, entlang denen der Fluss in zwei Schritten verändert wird. Entlang der grünen Pfade wird er erhöht, entlang der roten verringert. Elemente die auf beiden Pfadtypen liegen, ändern ihren Flusswert nicht. 37 3 Maximale Flüsse Da die Pkout positive Pfade sind, kann Fluss zwischen den Elementen Pfaden verringert werden. Falls die Pfade bis auf die Elemente wird der Flusswert erhöht, indem für ein geeignetes ε ek ek und und ik auf diesen ik disjunkt sind, der Fluss auf den Pfaden Pk0 erhöht out verringert wird. Auf den anderen Teilstücken der Pfade bleibt und auf den Pfaden Pk der Fluss gleich. Denn: Sei 1 < k < j. Es ist Pk0 ∩ Pkout ⊆ Pkout und out Pk0 ⊆ Pk−1 und die Start- und Endteile der Pfade stimmen überein. Darum ändert sich der summierte Flusswert auf den entsprechenden Elementen nicht. t : E → N0 Zum Abschätzen der Laufzeit nutzen wir eine Hilfsfunktion und eine Variable t die zunächst 0 ist. Für jeden positiven Pfad, der in ReduceL betrachtet wird, setzen wir in Tφ verschoben wird, wird t(f ) := t gesetzt. Wenn auf in dem Pfad P (f ) ein saturiertes Element g liegt, muss dieses schon vorher nach Tφ ver- t um 1 herauf. Wenn eine Kante f schoben worden sein und daher gilt Pkin liegt, gilt t(ek+1 ) < t(ek ). t(g) < t(f ). Da für ein ik Wegen |T | ≤ |E| Mit dieser Konstruktion entsteht ein ek und ik und zwischen ek+1 das nächste Element gibt es maximal augmentierender Pfad m ek+1 auf Schleifendurchläufe. aus den Teilpfaden zwischen und ik , auf denen der Fluss abwechselnd erhöht und verringert wird. Ein Element, das auf einem Pfad out zwischen Pfad P` e` und des Elements aber bloÿ i` Pkout zwischen ek und liegt, wird um mindestens 2ε ik und gleichzeitig auf einem erhöht. Falls die Restkapazität ε beträgt, wird sie damit überschritten und es entsteht kein gültiger Fluss mehr. Diese Überschneidungen können ebenfalls durch ein Orakelaufruf behoben werden. Wenn sich zwei Pfade (Pk0 , e, P`0 ) Pk0 und zurück, der P`0 e in einem Element e schneiden, liefert das Orakel einen Pfad in nur einmal enthält. Auf diese Weise können nacheinander alle Elemente, die auf mehreren positiven Abschnitten vorkommen, entfernt werden. 3.2.11 Algorithmus (Uncross). Eingabe: Folge von Pfaden Pk0 und Pkout , auf denen der Fluss erhöht und verringert werden kann. Ausgabe: Eine disjunkte Teilmenge der Folgen. 1 2 3 4 5 6 7 8 38 while Teilpfade zwischen ek und ik nicht disjunkt Pk0 und P`0 enthalten beide Element e f ü r l < k . P := O(Pk0 , e, P`0 ) for ` ≤ i < k l ö sche Pi0 l ö sche P out (ik ) ersetze Pk0 durch P if i − ` + k ≤ j 3.2 Das Abstrakte-Fluss-Verfahren 0 0 setze Pi0 := Pi−`+k und l ö sche Pi−`+k if i − ` + k < j out out setze Piout := Pi−`+k und l ö sche Pi−`+k for i = k to j 0 0 Pi0 := Pi−`+k und l ö sche Pi−`+k for i = k to j -1 out Piout := Pi−`+k und l ö sche Pi−`+k j := k − ` 9 10 11 12 13 14 15 16 3.2.4 Der Algorithmus Wir haben nun alle Bestandteile für die Berechnung eines maximalen Flusses im abstrakten Graphen beisammen. Der komplette Algorithmus ist wie folgt: 3.2.12 Algorithmus (AbstractMaximumFlow). Eingabe: Ein abstrakter Graph G = (E, P) Ausgabe: Der Wert eines maximalen Flusses 1 φ sowie ein minimaler Schnitt Lφ do 2 Lφ := Aφ := Tφ 3 for P ∈ P+ e := linkestes saturiertes Element auf P Lφ := e end for V = SearchForPaths() if V = ⊥ break FindPath() Uncross() P ε := min(minPkout {xP }, min{c(e) − xP | e ∈ Pk0 , e > ek , e < ik−1 , 1 < k < j}) 4 5 6 7 8 9 10 11 12 P :e∈P 13 14 15 16 17 18 19 20 21 22 for k := 1 to j − 1 xPkout := xPkout − ε xPk0 := xPk0 + ε end for xPj0 := xPj0 + ε while true φ := 0 for P ∈ P+ φ := φ + xP end for 39 3 Maximale Flüsse 3.2.13 Satz. Algorithmus 3.2.12 berechnet einen maximalen Fluss in Laufzeit O(|E|4 U 2 ), dabei ist U := max{c(e) | e ∈ E}. Beweis. In jedem Augmentierungsschritt wird der Fluss mindestens um ximale Fluss ist |E| · U , 1 erhöht, der ma- also gibt es höchstens so viele Augmentierungsschritte. In jedem Augmentierungsschritt werden alle positiven Pfade mehrmals betrachtet. Da in jedem Schritt maximal |E| neue positive Pfade hinzugefügt werden, ist die Anzahl der positiven Pfade beschränkt durch |E|2 U . Im ungünstigsten Fall muss |E|-mal nach einem verletzenden Pfad gesucht werden. Insgesamt ist die Laufzeit für einen Augmentierungsschritt beschränkt durch |E|3 U . Damit ergibt sich eine Gesamtlaufzeit von |E|4 U 2 . Der Algorithmus hat also pseudopolynomielle Laufzeit. Mit einem Skalierungsschema kann jedoch eine polynomielle Laufzeit erreicht werden [27]. Ein ähnliches Skalierungsschema haben Edmonds und Karp angegeben [7]. 40 4 Der AbstractMaxFlow-Algorithmus 4.1 Algorithmus 4.1.1 Übertragung auf kantenbasierte Netzwerke In diesem Abschnitt wollen wir nun die Methode aus Abschnitt 3.2 auf kantenbasierte Netzwerke übertragen, um einen maximalen Fluss zu berechnen. In solchen Netzwerken können Pfade ezient gesucht werden, so dass wir kein Orakel mehr benötigen und trotzdem für den Augmentierungsschritt eine polynomielle Laufzeit erhalten. Mit der Konstruktion aus Satz 2.4.6 kann ein Netzwerk direkt in einen abstrakten Graphen umgewandelt werden; dies rechtfertigt, die grundlegende Idee des Algorithmus direkt zu übernehmen. Statt Iterationen über sämtliche positiven Pfade werden übliche Suchalgo6 rithmen wie die Breiten- oder Tiefensuche verwendet, um das Netzwerk zu durchsuchen. Ebenso werden verletzende Pfade gefunden, die in der pfadbasierten Variante nur von einem Orakel geliefert werden können. Da nicht speziziert ist, welche Pfade das Orakel O liefert, gilt Lemma 2.3.4 auch ohne Änderung für in Netzwerken gefundene Pfade. Sei im Folgenden ein Netzwerk nicht zwingend maximalen, Fluss N = (V, E, s, t, c) mit einem darauf gegebenen gültigen, φ gegeben. Dabei seien n := |V | und m := |E| die Anzahl der Knoten beziehungsweise Kanten. Die Kanten im Netzwerk entsprechen den Elementen im abstrakten Graphen, entsprechend bilden die Mengen Lφ , Aφ und Tφ eine Partition der Kanten. Als Erstes muss die Menge Lφ der linkesten saturierten Kanten auf jedem positiven Pfad initialisiert werden. Diese Menge kann für kantenbasierte Netzwerke von einer abgewandelten Breitensuche bestimmt werden. Die Suche läuft in zwei Phasen ab. In der Ersten werden alle initialen Kanten in gefunden, in der zweiten die restlichen saturierten Kanten, also die Menge Aφ . Lφ Jede der Phasen verhält sich im Wesentlichen wie eine Breitensuche, die sich nur entlang ussführender Kanten orientiert und Kanten ohne Fluss ignoriert. Während der ersten Phase wird die Suche abgebrochen, sobald eine saturierte Kante gefunden wurde, da eine solche die linkeste saturierte Kante eines Pfades ist. 6 Nähere Informationen zu diesen Standardalgorithmen wie Breitensuche und Tiefensuche sind zum Beispiel in [24, Kapitel 2.3] zu nden. 41 4 Der AbstractMaxFlow-Algorithmus Phase 1 7 Zu Beginn wird eine Warteschlange Q1 mit der Quelle initialisiert und eine Breitensuche gestartet. Für einen extrahierten Knoten (v, w) Q1 in mit φ(v, w) > 0 v werden alle ausgehenden Kanten betrachtet. Wenn die Kante nicht saturiert war, wird wie üblich w eingefügt, falls der Knoten noch nicht markiert worden ist. Falls sie jedoch saturiert ist, wird die Kante in Lφ und w in die Schlange Q2 eingefügt, unabhängig davon, ob der Knoten bereits markiert worden ist. Es wird jedoch sichergestellt, dass jeder Knoten nur einmal in Q2 eingefügt wird. Auÿerdem muss beachtet werden, dass Knoten, die bereits markiert sind, trotzdem noch Zielknoten neu gefundener Kanten aus Lφ sein können (siehe dazu Abbildung 4.1). Nachdem alle Kanten abgearbeitet worden sind, wird Phase endet, wenn Phase 2 Q1 Q2 . markiert. Die leer ist. Q2 Alle Knoten in auf Basis von v werden markiert, anschlieÿend beginnt eine Breitensuche Es werden auch hier nur ussführende Kanten benutzt und alle noch gefundenen saturierten Kanten werden zu Aφ hinzugefügt. x s v w t Abbildung 4.1: Die dicken Kanten seien saturiert. Während Phase 1 der Bestimmung von Lφ wird der Knoten w zweimal entdeckt, er darf jedoch nur einmal in Q2 eingefügt werden. 4.1.1 Algorithmus (FindLeftSaturatedEdges). Eingabe: Ein Netzwerk N = (V, E, s, t, c) mit einem Fluss Ausgabe: Partition der saturierten Kanten in und Tφ = ∅. 1 Lφ := Aφ := Tφ := Q1 := Q2 := ∅ 2 Enqueue(Q1 , s) while Q1 6= ∅ v := Dequeue(Q1 ) for e = (v, w) ∈ v + mit φ(e) > 0 markiere e if e saturiert Lφ := Lφ ∪ {e} lastT(e) := ⊥ if w wurde noch nicht in Q2 eingef ü gt Enqueue(Q1 , w) else if w nicht markiert 3 4 5 6 7 8 9 10 11 12 7 Lφ , Aφ φ. Informationen zur Implementation von Warteschlangen und der Breitensuche mit Warteschlangen nden sich zum Beispiel in [3, Kapitel 10.1 und 22.2]. Wir verwenden auch die dort angegebenen Notationen: Mit Enqueue(Q, x) wird ein Element x in eine Schlange Q eingefügt, Dequeue(Q) liefert das nächste Element in der Schlange. 42 4.1 Algorithmus markiere w Enqueue(Q1 , w) for v ∈ Q2 markiere v while Q2 6= ∅ v := Dequeue(Q2 ) for e = (v, w) ∈ v + mit φ(e) > 0 und e nicht markiert if e saturiert Aφ := Aφ ∪ {e} if w wurde noch nicht in Q2 eingef ü gt Enqueue(Q2 , w) else if w nicht markiert markiere w if w wurde noch nicht in Q2 eingef ü gt Enqueue(Q2 , w) 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 4.1.2 Satz. Algorithmus 4.1.1 initialisiert die Menge Lφ der linkesten Kanten auf jedem positiven Pfad von s nach t in einem Netzwerk N = (V, E, s, t, c) und ndet eine Partition Lφ ∪· Aφ ∪· Tφ der saturierten Kanten, wobei Tφ leer ist. Die Laufzeit beträgt O(|V | + |E|). Beweis. Sei e = (v, w) die erste saturierte Kante auf einem positiven (v0 , v1 , v2 , . . . , vk ) also ein kürzester Pfad alle in k∈N und s = v0 und i ∈ {1, 2, . . . , k} die Kanten (vi−1 , vi ) Fluss führen. Die Knoten vi Q1 eingefügt, bis vk extrahiert wird. Anschlieÿend wird Andersherum wird eine Kante ist, nicht in Lφ e0 , vk = v , Es existiert so dass für werden nacheinander e betrachtet und in Lφ eingefügt. die auf keinem positiven Pfad erste saturierte Kante eingefügt: Kanten ohne Fluss werden nicht betrachtet. Auf jedem positiven 0 Pfad über e liegt eine saturierte Kante Knoten werden nicht in e0 für ein s-t-Pfad. Q1 e, die vorher in Lφ eingefügt wird. Die weiteren eingefügt, so dass die Breitensuche auf jedem Pfad stoppt und nicht gefunden wird. In Phase 2 wird die Breitensuche an jeder Kante, die vorher in Lφ eingefügt worden ist, fortgesetzt. Diese Breitensuche arbeitet wie üblich und betrachtet alle erreichbaren Kanten, die nicht bereits vorher markiert worden sind. Alle gefundenen saturierten Kanten werden in Aφ verschoben, da sie nicht erste saturierte Kanten auf einem Pfad sind. Jeder Knoten wird genau einmal entweder in hiert. Die Knoten aus wenn Q1 Q2 Q1 oder in Q2 eingefügt und auch extra- werden ein weiteres Mal betrachtet, wenn sie markiert werden, leer ist. Nachdem ein Knoten v extrahiert worden ist, werden seine ausgehen- den Kanten betrachtet und in die Mengen eingeordnet. Diese Iteration kann mit einer Adjazenzlisten-Datenstruktur in O(|v + |) durchgeführt werden. Mit zusätzlichen Variablen 43 4 Der AbstractMaxFlow-Algorithmus für jeden Knoten kann die Mengenzuordnung und der Test, ob ein Knoten bereits in Q2 eingefügt worden ist, in konstanter Zeit durchgeführt werden. Da jeder Knoten und jede Kante konstant oft betrachtet werden, beträgt die Laufzeit O(|V | + |E|). Nachdem der Algorithmus ausgeführt worden ist, gilt die Invariante aus Eigenschaft 3.2.4. Das heiÿt jede Kante in Lφ ist linkestes Element aus (Lφ ∪ Aφ ) auf einem s-t-Pfad. Nun muss eine kantenbasierte Variante für ReduceL gefunden werden, die doppelte Kanten aus Lφ auf positiven Pfaden ndet. Da die positiven Pfade nicht gespeichert werden, müssen wir solche erst wieder suchen. Auch hierfür verwenden wir eine abgewandelte Breitensuche. Es sollen alle Kanten aus Lφ ∪ Aφ , werden. Da also die rechtesten die links einer Kante aus Lφ liegen, in Tφ verschoben Lφ -Kanten gesucht werden, beginnt die Breitensuche diesmal an der Senke und verläuft entlang der eingehenden Kanten (mit positivem Fluss). Die Suche verläuft dabei in zwei Schleifen, der Äuÿere Suche äuÿeren Suche und der inneren Suche. Ausgehend von der Senke wird rückwärts eine Kante e ∈ Lφ gesucht. Knoten mit einer (beliebigen) Markierung werden ignoriert und es werden nur Kanten mit positivem Fluss benutzt. Sobald eine solche Kante e gefunden worden ist, wird ausgehend von dieser Kante die innere Suche gestartet und anschlieÿend mit den weiteren Kanten fortgefahren. Abschlieÿend werden betrachtete Knoten mit 1 markiert. Innere Suche Sei v der Startknoten derjenigen Kante den wird. Ausgehend von v e, die in der äuÿeren suche gefun- startet eine zweite Breitensuche. Die Suche verläuft ebenfalls rückwärts entlang positiver Kanten. Knoten mit Markierung 1 werden in die Suche einbezogen, Knoten mit markierung 2 hingegen nicht. Sobald ein Knoten abgearbeitet worden s . . . Tφ . . . Lφ . . . Aφ . . . t Abbildung 4.2: Anschauliche Einteilung eines Netzwerkes in Tφ , Lφ und Aφ . Die Mengen aus Lφ sollen den linkesten minimalen Schnitt im Netzwerk darstellen. Links davon liegende saturierte Kanten sind in Tφ , da sie unsaturiert werden können. Die Kanten rechts von Lφ sind in Aφ , über sie ist noch nichts bekannt. Wenn es einen s-t-Pfad gibt, der keine Kante in Lφ benutzt, kann die Menge noch keinen Schnitt dargestellt haben. Der unterste Pfad ist ein verletzender Pfad, der keine Lφ -Kante nutzt. 44 4.1 Algorithmus ist, erhält er Markierung 2. Sei wird in(f ) := e f eine gefundene Kante aus Lφ ∪ Aφ . Wie in Abschnitt 3.2 gespeichert, um später bei der Pfadsuche darauf zugreifen zu können. Für jeden Knoten wird die Vorgängerkante, über die er erreicht worden ist, gespeichert. Damit können, später die Pfade rekonstruiert werden. Die zwei Markierungen sind notwendig. Eventuell existiert eine jedoch links einer anderen Lφ -Kante, die selbst Lφ -Kante liegt, die später gefunden wird. In diesem Fall werden alle links der ersten Kante liegenden Kanten aus Aφ ∪ Lφ in Tφ verschoben. Da diese Kante jedoch selbst links einer weiteren Kante liegt, muss sie ebenfalls in Tφ verschoben werden (vgl. Abbildung 4.3). 4.1.3 Algorithmus (ReduceLFromRight). 1 Q1 := Q2 := ∅ 2 Enqueue(Q1 , t) while Q1 6= ∅ v := Dequeue(Q1 ) for e := (u, v) ∈ v − and e nicht markiert if e saturiert and e ∈ Lφ Enqueue(Q2 , u) while Q2 6= ∅ y := Dequeue(Q2 ) for f := (x, y) ∈ t− mit φ(f ) > 0 and f nicht markiert mit 2 if f ∈ Lφ ∪ Aφ Lφ := Lφ \ {f } Aφ := Aφ \ {f } Tφ := Tφ ∪ {f } Enqueue(Q2 , f ) in(f ) := e markiere x mit 2 end if markiere u mit 1 Enqueue(Q1 , u) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 x s ··· v w y z ··· t Abbildung 4.3: Die Kanten (v, w) und (x, y) seien in Lφ . Wenn nach z Knoten w extrahiert wird, und Vorgänger von (v, w) nach Tφ verschoben worden sind, darf w nicht abschlieÿend markiert werden, da die Kante auch noch bei der Suche nach Lφ -Kanten, die links von (x, y) liegen, gefunden werden muss. 45 4 Der AbstractMaxFlow-Algorithmus 4.1.4 Satz (Korrektheit von ReduceFromRight). Sei ein Netzwerk mit einem Fluss φ. Dann ndet Algorithmus 4.1.3 alle Kanten aus Lφ ∪ Aφ die sich links von saturierten Kanten aus Lφ auf einem positiven Pfad benden und verschiebt diese nach Tφ . Die Laufzeit beträgt O(|V | + |E|). Beweis. N = (V, E, s, t, c) Wir beweisen zunächst zwei Behauptungen, aus denen zusammen die Korrektheit folgt: Behauptung 1: Alle auf positiven Pfaden links einer Kante der inneren Suche gefunden und in Tφ e liegenden Kanten werden in verschoben (falls das nicht bereits vorher geschehen ist). Ausgehend von e beginnt eine Breitensuche, die alle bisher noch nicht mit 2 markier- ten Kanten betrachtet. Für eine links von e liegende Kante zwischen den beiden Kanten. Nehmen wir an, dass f f existiert ein positiver Pfad noch nicht in Tφ verschoben worden ist. Dann wird die Kante über einen positiven Pfad gefunden und mit 2 markiert. Da bei der Suche alle mit 2 markierten Kanten ignoriert werden, kann eine solche Kante nur dann nicht gefunden werden, wenn auf jedem der positiven Pfade zwischen markierte Kante liegt. Dann wäre Behauptung 2: Alle Kanten e, f aber bereits vorher in die rechteste Lφ -Kante Tφ e und f eine solche verschoben worden. s-t-Pfad auf einem positiven werden vom äuÿeren Algorithmus gefunden, falls sie nicht vorher bereits in Tφ sind, verschoben worden sind. Wir nehmen an, dass e nicht in Tφ liegt, gibt es einen (kürzesten) Weg von verschoben wird. Da e zur e auf einem positiven Pfad Senke. Dieser Pfad wird irgendwann von der äuÿeren Suche gefunden. Die einzige Möglichkeit, e nicht zu nden ist, dass alle Wege zur Senke über mit Kanten führen, die mit Markierung 2 versehen worden sind. Dann ist wegen Behauptung 1 aber bereits nach Tφ verschoben worden. Aus den Behauptungen folgt: Es wird jedes Paar von Kanten die auf einem positiven s-t-Pfad e e ∈ Lφ und f ∈ L φ ∪ Aφ , liegen, gefunden. Nehmen wir an, ein solches Paar würde nicht gefunden. Das kann passieren, falls die rechts liegende Kante e nicht während der äuÿeren Suche gefunden wird. Nach Behauptung 2 wird die Kante aber gefunden. Wenn e einmal gefunden worden ist, wird wegen Behauptung 1 auch die links liegende Kante f gefunden. Durch die Markierungen kann eine Kante, die zunächst in der äuÿeren Suche gefunden wird, später während einer inneren Suche von einer noch weiter rechts liegenden Kante gefunden werden. Jeder Knoten wird, sobald er aus aus 46 Q1 extrahiert worden ist, mit 1 markiert und wenn er Q2 extrahiert wird, mit 2. Mit 1 markierte Knoten können noch in Q2 eingefügt werden, 4.1 Algorithmus aber nicht mehr in Q1 . Sobald ein Knoten mit 2 markiert worden ist, wird er in keine Schlange mehr eingefügt. In jedem extrahierten Knoten werden sämtliche eingehenden Kanten betrachtet. Insgesamt wird also jeder Knoten und jede Kante nur konstant oft betrachtet. Analog zu Denition 3.2.7 nutzen wir die Bezeichnung Pfad in verletzender Pfad für einen s-t- N , der keine Lφ -Kanten benutzt. Wenn kein solcher Pfad existiert, war φ maximal. Im Gegensatz zur pfadbasierten Darstellung können wir in der kantenbasierten Version einen verletzenden Pfad ezient suchen, ohne ein Orakel zu benutzen. Dazu reicht es, die Lφ Kanten aus s-t-Pfad aus dem Netzwerk zu entfernen und mit einer beliebigen Pfadsuche einen zu bestimmen. 4.1.5 Algorithmus. (FindViolatingPath) 2 V 0 := V E 0 := E \ Lφ 3 c0 := c|E 0 sei die Einschr ä nkung der Kosten auf E 0 4 N 0 = (V 0 , E 0 , s, t, c0 ) ein neues Netzwerk 5 return ein s - t - Pfad in N 0 1 4.1.6 Satz. Algorithmus 4.1.5 berechnet einen verletzenden Pfad in N , falls es einen gibt. Die Laufzeit beträgt O(|V | + |M |). Beweis. Sei P ein verletzender Pfad. Dann benutzt Da diese Kanten alle noch in gefunden. Wenn N N0 P nur Kanten, die nicht in Lφ sind. enthalten sind, wird dieser Pfad mit der Pfadsuche in keinen verletzenden Pfad enthält, ist erst recht keiner in N0 N0 enthalten. 0 Für den Algorithmus muss das neue Netzwerk N erstellt werden. Dazu müssen im schlechtesten Fall alle Kanten und Knoten kopiert werden, mit einer geeigneten Datenstruktur genügt es, die Kanten aus Lφ zu verstecken. Die Suche nach dem verletzenden Pfad kann mit Breiten- oder Tiefensuche in O(|V | + |E|) durchgeführt werden. Die Pfadsuche kann im Wesentlichen analog zur Pfadsuche für abstrakte Graphen ablaufen (Algorithmus 3.2.8). In einer Schleife wird so lange ReduceLFromRight und die Suche nach einem verletzenden Pfad aufgerufen, bis ein Pfad ohne Aφ -Kante gefunden wird, oder bis festgestellt wird, dass der Fluss optimal ist. Eine gefundene Aφ -Kante f auf einem verletzenden Pfad wird in Lφ verschoben und anschlieÿend wird eine neue Iteration gestartet. Falls der Pfad links von enthält, sei e die rechteste solcher Kanten. Dann wird der Teilpfad von e nach f gespeichert. Falls es keine bis nach f f Tφ -Kanten Tφ -Kanten links von f auf V Tφ -Elemente P in (f ) gibt, wird ein Pfad von der Quelle gespeichert. Im abstrakten Graphmodell lieferte einen Pfad auf dem höchstens als P in nach Eigenschaft 3.2.4 liegen. 47 4 Der AbstractMaxFlow-Algorithmus 4.1.7 Algorithmus (FindAugmentablePaths). N = (V, E, s, t, c) Lφ ∪· Aφ ∪· Tφ . Eingabe: Ein Netzwerk saturierten Kanten Ausgabe: Ein verletzender Pfad V der keine mit einem Fluss Aφ -Kanten do 2 ReduceLFromRight() V := FindViolatingPath() if V = ⊥ exit if V enth ä lt eine Aφ - Kante f := die linkeste Aφ - Kante auf V Lφ := Lφ ∪ {f } Aφ := Aφ \ {f } if existiert Tφ - Kante links von f auf V e := die rechteste Tφ - Kante links von f lastT(f ) := e P in (f ) := Pfad von e nach f else P in (f ) := Pfad von s nach f while V enth ä lt eine Aφ - Kante return V 4 5 6 7 8 9 10 11 12 13 14 15 16 17 und die Partition der enthält. 1 3 φ 4.1.8 Satz. Wenn Algorithmus 4.1.7 abbricht, ist der Fluss φ maximal. Der für eine Kante f gespeicherte Pfad P in (f ) enthält keine saturierte Kante. Der Algorithmus terminiert immer und hat eine Laufzeit von O(|E| · (|V | + |E|)). Beweis. Gebe FindViolatingPath keinen verletzenden Pfad zurück. Da vorher Redu- ceLFromRight ausgeführt worden ist, gelten die Eigenschaften des komplementären Schlupfes, das heiÿt auf jedem positiven s-t-Pfad liegt genau eine Kante aus Lφ . Da kein verletzender Pfad existiert, gibt es keinen (nicht positiven) Pfad, entlang dem der Fluss augmentiert werden könnte. Es ist also Lφ ein minimaler Schnitt und φ ein maximaler Fluss. Sei nun V linkeste. Vor ein verletzender Pfad, der eine f können auf V Aφ -Kante enthält. Von diesen Kanten sei f die in nur unsaturierte Kanten und Tφ -Kanten liegen. Als P (f ) wird der Teilpfad von der rechtesten solcher Kanten bis nach keine saturierte Kante. Falls es keine Tφ -Kanten auf V f gespeichert, er enthält also links von f gibt, enthält der ganze Pfad beginnend von der Quelle keine saturierte Kante. Die in der Schleife aufgerufenen Algorithmen 4.1.3 und 4.1.5 haben eine Laufzeit von O(|V | + |E|). 48 Der Algorithmus terminiert, falls entweder kein Pfad gefunden worden ist, 4.1 Algorithmus oder falls ein Pfad gefunden wurde, der kein Aφ -Element wird nochmal durchsucht, er besteht jedoch höchstens aus enthält. Ein gefundener Pfad |V | − 1 8 Kanten . In jedem Schleifendurchlauf, in dem der Algorithmus nicht abbricht, wird eine Kante aus Aφ nach Lφ verschoben. Nach höchstens |Aφ | ≤ |E| Iterationen wird ein Pfad ohne Aφ -Kanten gefunden. Die Gesamtlaufzeit ist damit O(|E|·(|V |+|E|)) = O(|E|·|V |+|E|2 ). Falls der zurückgegebene Pfad V keine Kante aus Tφ enthält, kann der Fluss wie beim Algorithmus von Ford und Fulkerson entlang des Pfades direkt augmentiert werden. Ansonsten müssen wir aus Paaren von Kanten aus zusammensetzen. Für sich schneidende s-t-Pfad Lφ s-t-Pfade und Tφ einen ussvergröÿerndern Pfad ist es problemlos möglich, einen weiteren anzugeben, der zunächst auf dem ersten Pfad verläuft und ab der Schnittkante auf dem zweiten. Auch in diesem Fall ist das Orakel also nicht nötig. Wir bestimmen zwei Folgen Pfade von ek nach ik (ek ) und von und ek+1 (ik ) nach von Kanten aus ik . Tφ beziehungsweise Lφ , sowie Die Teilpfade werden nur Kanten enthalten, die nicht saturiert sind, genauso wie in Algorithmus 3.2.9. Das heiÿt, es sei ik := in(ek ) und ek+1 := lastT(ik ). In FindAugmentablePaths werden für e = lastT(f ) die Teilpfade von e nach f als P in (f ) gespeichert und können hier verwendet werden. Für die Bestimmung der Teilpfade zwischen ek und ik können die Vorgänger, die während der inneren Suche von ReduceLFromRight gespeichert werden, genutzt werden. Die Teilpfade werden in einem Array gespeichert. 4.1.9 Algorithmus (CalculateAugmentingPath). 3 k := 0 e1 := rechteste Tφ - Kante auf V paths[0] := Pfad von e1 bis t 4 do 1 2 5 6 7 8 9 10 11 12 13 8 k := k + 1 ik := in(ek ) paths[2k − 1] := Pfad von ek nach ik ek+1 := lastT(ik ) if ek+1 6= ⊥ paths[2k] := Pfad von ek+1 nach ik while ek+1 6= ⊥ ` := k paths[2`] := Pfad von s nach i` Ein Pfad besteht nach Denition 2.2.7 aus disjunkten Knoten. Es gibt maximal |V | Knoten auf einem Pfad, zwischen denen |V | − 1 Kanten liegen können. 49 4 Der AbstractMaxFlow-Algorithmus 4.1.10 Satz. Sei j Algorithmus 4.1.9 berechnet eine Folge von Teilpfaden Pj , so dass Pfade Pj mit geradem Index j ≡ 0 mod 2 negativ und Pfade Pj mit ungeradem Index j ≡ 1 mod 2 positiv sind. Insgesamt werden ` positive und ` + 1 negative Pfade erzeugt. Die Laufzeit ist O(|V | · |E|). Beweis. ∈ {0, · · · , 2`}. Beginnen wir mit ungeradem j . Dann sind die Pfade Pj Teilpfade zwischen ek und ik = in(ek ) für ein k . Dieses Kantenpaar wird von ReduceLFromRight gefunden. In der inneren Suche werden nur Kanten benutzt, deren Fluss echt positiv ist und die während der Suche gespeicherten Vorgänger liefern einen positiven ek -ik -Pfad, auf dem Fluss verringert werden kann. Sei nun von V ab j e1 gerade. e1 . Für ist die linkeste saturierte Kante auf 1 < j < 2` ist Pj der Teilpfad von V, und von der Quelle nach ek+1 i` . nach ik als Pfad ohne gespeichert. Der letzte gespeicherte Pfad P2` verläuft e`+1 = ⊥, das Tφ -Elemente vor Da das Abbruchkriterium erfüllt war, galt vorher enthielt und damit augmentiert werden kann. Es gibt insgesamt ` In FindAug- P in (ik ) heiÿt in FindAugmentablePaths wurde ein Pfad gefunden, der keine i` ist das Teilstück ek+1 = lastT(ik ). mentablePaths wird dieses Kantenpaar gefunden und gleichzeitig saturierte Kanten von P0 ` + 1 = |{0, 2, 4, . . . , 2`}| augmentierbare Pfade und 2` + 1 − (` + 1) = positive Pfade. Falls die Teilpfade sich nicht schneiden, können wir den Fluss erhöhen, indem wir ihn auf positiven Pfaden verringern und auf augmentierbaren Pfaden erhöhen. Da diese Pfade an der Quelle beginnen und an der Senke enden, wird der Flusswert insgesamt erhöht. Im Folgenden durchsuchen wir die Pfade (in absteigender Reihenfolge) von der Quelle bis zur Senke kantenweise. Für jede Kante notieren wir die Position, an der sie das letzte Mal aufgetaucht ist. Sobald eine Kante mehrmals auftaucht, können die dazwischenliegenden Kanten entfernt werden. Dadurch werden alle Schleifen in der Pfadmenge entfernt, so dass am Ende eine kantendisjunkte Menge von Pfaden herauskommt. Insgesamt haben wir damit den Fluss um mindestens 4.1.11 Algorithmus (RemoveCrossingEdges). 1 2 3 4 5 6 7 8 50 for v ∈ V o(v) := −1 := p s o(s) := 0 index := 1 for i := 2` downto 0 pi := paths[i] for j := 1 to |pi | 1 erhöht. 4.1 Algorithmus if i mod 2 ≡ 0 e := (u, v) sei die j - te Kante auf pi else e := (v, w) sei die (|p| − j) - te Kante auf pj if o(v) = −1 o(v) := index p := p + v index := index + 1 else for x ∈ pi mit o(x) > o(v) o(x) := -1 p := p − x index := o(v) + 1 9 10 11 12 13 14 15 16 17 18 19 20 21 4.1.12 Satz. Algorithmus 4.1.11 berechnet aus der Folge von eventuell nicht disjunkten Teilpfaden die von Algorithmus 4.1.9 berechnet werden, eine Knotensequenz (v1 , v2 , . . . , vn ), so dass für zwei aufeinanderfolgende Knoten vi und vi+1 entweder (vi , vi+1 ) oder (vi+1 , vi ) eine Kante in E ist. Im ersten Fall ist φ((vi , vi+1 )) < c((vi , vi+1 )) und im zweiten Fall ist φ((vi+1 , vi )) > 0. Die Laufzeit beträgt O(|V | · |M |). Beweis. Zur anfangs leeren Sequenz p werden nacheinander die Knoten der 2` + 1 Pfade hinzugefügt. Zwei aufeinanderfolgende Knoten entstammen also diesen Pfaden, die auch zusätzlich entweder positiv oder augmentierbar sind. Damit der Übergang zwischen den von CalculateAugmentingPath berechneten Pfaden korrekt ist, werden Pfade mit geradem Index von vorn durchlaufen und Pfade mit ungeradem Index von hinten. Liegt an den Knoten (. . . , vi−1 , vi , vi+1 , . . .) sitiven Pfad vor, ist ein Übergang von einem augmentierbaren zu einem po- (vi−1 , vi ) die letzte Kante auf dem augmentierbaren Pfad und (vi+1 , vi ) die letzte Kante auf dem positiven Pfad. Andersherum gilt das Gleiche beim Übergang von einem positiven zu einem augmentierbaren Pfad. Zunächst wird für jeden Knoten i o(v) := 0 gesetzt. Sobald ein Knoten in die Knotenfolge p an Stelle v bereits eingefügt worden ist, das heiÿt, es ist eingefügt wird, wird dieser Index als Pfad wie v o(v) = i gespeichert. Falls ein Knoten für ein i, werden alle Knoten i von dem Pfad entfernt. Für den doppelt betrachteten Knoten o(v) nicht. Da der nächste einzufügende Knoten auf dem gleichen an Positionen gröÿer als ändert sich der Wert o(v) := i lag, bilden zwei aufeinanderfolgende Knoten weiterhin eine Kante aus E (vgl. Abbildung 4.4). Insgesamt werden höchstens von |V | |E| Pfade berechnet, von denen jeder eine maximale Länge hat. Für jeden Pfad wird jeder auf dem Pfad liegende Knoten höchstens zweimal 51 4 Der AbstractMaxFlow-Algorithmus betrachtet: einmal, wenn er an p angehängt wird und einmal, falls er wieder entfernt werden sollte. Die Laufzeit beträgt also O(|V | · |E|). Entlang der positiven Kanten kann der Fluss verringert werden, entlang der negativen erhöht und insgesamt wird der Fluss dadurch gröÿer. Die Algorithmen können in einer Schleife aufgerufen werden, bis ein maximaler Fluss erreicht ist. Folgender Algorithmus beschreibt das Vorgehen im Detail: 4.1.13 Algorithmus (Augment). 1 do 2 FindLeftSaturatedEdges() FindAugmentablePaths() CalculateAugmentingPath() RemoveCrossingEdges() p sei der Pfad entlang dem augmentiert wird δ := ∞ for e ∈ p if e positiv δ := min(δ, c(e) − φ(e)) else δ := min(δ, φ(e)) for e ∈ p if e positiv φ(e) := φ(e) + δ else φ(e) := φ(e) − δ whle δ > 0 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 4.1.14 Satz. Algorithmus augmentiert schrittweise einen Fluss φ auf einem Netzwerk N = (V, E, s, t, c) um einen echt positiven Wert δ bis ein maximaler Fluss erreicht ist. Augment w u v i` Abbildung 4.4: Wechsel zwischen positiven und negativen Pfaden in Algorithmus 4.1.11. Die Kante (u, v) liegt auf einem positiven Pfad, der nächste Knoten auf dem Pfad ist also v . Anschlieÿend wird der augmentierbare Pfad von e` nach i` betrachtet, dessen letzte Kante ist (w, v). Hier muss der Startknoten w als neuer Knoten auf dem Pfad betrachtet werden. 52 4.1 Algorithmus Die Laufzeit für eine Augmentierung beträgt O(|E|2 ). Die Gesamtlaufzeit zur Berechnung eines maximalen Flusses ist O(|E|3 · U ) mit U := max{c(e) | e ∈ E}. Beweis. Entlang positiver Teilpfade ist der Fluss Kanten ist die Residualkapazität c(e) − φ(e) φ(e) > 0 echt positiv, entlang negativer echt positiv. Das Minimum δ über diese Kapazitäten aller Kanten ist auch positiv. Sei der neue Fluss φ0 deniert als φ(e) − δ 0 φ (e) := φ(e) + δ φ(e) Für eine positive Kante e e auf positivem Teilpfad e auf augmentierbarem Teilpfad sonst. gilt wegen δ ≤ φ(e) φ0 (e) = φ(e) − δ ≥ φ(e) − φ(e) = 0. Wegen δ ≤ c(e) − φ(e) gilt für augmentierbare Kanten e φ0 (e) = φ(e) + δ ≤ φ(e) + c(e) − φ(e) = c(e). Nach Lemma 2.2.9 gilt die Flusserhaltung an inneren Knoten der positiven und negativen Teilpfade. Es bleibt zu zeigen, dass die Flusserhaltung gilt, wenn an einem Knoten negative und positive Kanten zusammenstoÿen. Sei (u0 , . . . , u, v) (w0 , . . . , w, v) ein negativer Teilpfad, die 0 (v, v ) treen. Der ausgehende Fluss vout (φ0 ) wird durch die ein positiver Teilpfad und sich in einer Kante ik = Flussänderung nicht verändert, es genügt also zu zeigen, dass dazu f := (w, v) und g := (u, v) Def vin (φ0 ) = vin (φ) = vin (φ0 ) gilt. Seien die letzten Kanten auf den Pfaden. Dann gilt X φ0 (e) e∈v − = X φ0 (e) + φ0 (f ) + φ0 (g) e∈v − \{e,f } Def = X φ(e) + φ(f ) − δ + φ(g) + δ e∈v − \{e,f } = X φ(e) + φ(f ) + φ(g) e∈v − \{e,f } = X φ(e) e∈v − Def = vin (φ) 53 4 Der AbstractMaxFlow-Algorithmus Sei v nun Knoten einer Kante negativer Pfad g := (v, u) (v, w, . . . , w0 ) ek = (v 0 , v) in dem ein positiver Pfad beginnen. An v ändert sich vin (v, u, . . . , u0 ) und ein f := (v, w) nicht, mit und gilt auÿerdem Def vout (φ0 ) = X φ0 (e) e∈v + X = φ0 (e) + φ0 (f ) + φ0 (g) e∈v + \{e,f } Def X = φ(e) + φ(f ) − δ + φ(g) + δ e∈v + \{e,f } X = φ(e) + φ(f ) + φ(g) e∈v + \{e,f } = X φ(e) e∈v + Def = vout (φ) Nach Lemma 2.2.9 ändert sich der ausieÿende Fluss in der Quelle um δ>0 und damit wächst der Fluss bei einem Aufruf von Augment mindetens um 1. Nach dem Aufruf von RemoveCrossingEdges hat der Pfad die Berechnung von δ und das Ändern des Flusses kann also in p keine Kreuzungen mehr, O(|V |) durchgeführt wer- den. In jedem Schleifenaufruf werden nacheinander FindLeftSaturatedEdges(), FindAugmentablePaths(), CalculateAugmentingPath() und RemoveCrossingEdges() aufgerufen, die eine Gesamtlaufzeit von |V | · U O(|E|2 ) haben. Der gesamte Fluss ist durch nach oben beschränkt, so dass der Algorithmus eine Laufzeit von O(|V | · |E|2 · U ) hat. 4.1.2 Optimierung Der im letzten Kapitel beschriebene Algorithmus ahmt das Verhalten des pfadbasierten Algorithmus im Rahmen der Möglichkeiten kantenbasierter Flüsse möglichst genau nach. Dadurch ist aber insbesondere die Suche nach einem augmentierbaren Pfad in FindAugmentablePaths sehr langsam, da im Worst-Case Θ(m)-mal sowohl die Suche nach einem verletzenden Pfad als auch die Entfernung doppelter saturierter Kanten durchgeführt wird. Dies kann in dichten Graphen mit m ∈ O(n2 ) sehr lange dauern. Durch die Nutzung der Breitensuche können wir in einem Schritt mehr Informationen gewinnen, als es in einer pfadbasierten Variante möglich ist. Dadurch können FindLeftSaturatedEdges und in FindAugmentablePaths angepasst werden. In FindLeftSaturatedEdges wird die Suche nur entlang positiver Kanten durchgeführt. Betrachten wir den Fall, in dem bei der Pfadsuche mit FindViolatingPath ein Pfad zurückgegeben wird, der zunächst nur Kanten ohne Fluss benutzt, um dann eine saturierte Kante aus 54 Aφ zu benutzen. Dann wird diese Kante in Lφ und die links davon 4.1 Algorithmus liegende Lφ -Kante nach Tφ verschoben. Solche Kanten können aber direkt in FindLeft- SaturatedEdges gefunden werden, wenn auch Kanten ohne Fluss benutzt werden. 4.1.15 Algorithmus (FindLeftSaturatedEdgesEx). Eingabe: Ein Netzwerk N = (V, E, s, t, c) mit einem Fluss Ausgabe: Partition der saturierten Kanten in L φ , Aφ und φ. Tφ = ∅. 1 Lφ := Aφ := Tφ := Q1 := Q2 := ∅ 2 Enqueue(Q1 , s) while Q1 6= ∅ v := Dequeue(Q1 ) for e = (v, w) ∈ v + markiere e if e saturiert Lφ := Lφ ∪ {e} lastT(e) := ⊥ if w wurde noch nicht in Q2 eingef ü gt Enqueue(Q1 , w) else if w nicht markiert markiere w Enqueue(Q1 , w) for v ∈ Q2 markiere v while Q2 6= ∅ v := Dequeue(Q2 ) for e = (v, w) ∈ v + nicht markiert if e saturiert Aφ := Aφ ∪ {e} if w wurde noch nicht in Q2 eingef ü gt Enqueue(Q2 , w) else if w nicht markiert markiere w if w wurde noch nicht in Q2 eingef ü gt Enqueue(Q2 , w) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Mit der gleichen Idee kann auch FindAugmentablePaths abgeändert werden. Jeder Aufruf von FindViolatingPath ndet einen verletzenden Pfad und die erste saturierte Kante aus Aφ wird nach Lφ verschoben. Die Suche nach dem Pfad kann mit einer Breiten- suche implementiert werden (was gegenüber der Implementierung mit Tiefensuche deutlich Aφ -Kanten ge- ndet) und nach Lφ besser ist, siehe dazu Kapitel 4.3). In diesem Fall können direkt alle ersten funden (genauso, wie FindLeftSaturatedEdges die Lφ -Kanten verschoben werden. Alle so gefundenen Kanten lägen auch auf einem verletzenden Pfad. 55 4 Der AbstractMaxFlow-Algorithmus 1/1 1/2 s v 1/1 1/2 w x 1/2 y t 0/2 Abbildung 4.5: Ein Fluss in einem Netzwerk. Die Zahlen geben die Kapazitäten und Restkapazitäten an. Die (x, y) kann direkt in Lφ einsortiert werden, so dass der Algorithmus im ersten Schritt bereits terminiert. Andernfalls müsste erst der verletzende Pfad (s, x, y, t) gefunden werden. Die Breitensuche wird an einer Aφ -Kante nicht fortgesetzt. Wenn ein Pfad bis zur Senke gefunden wurde, ist dies ein Pfad der nur Tφ -Kanten als saturierte Kanten enthält und er kann zur Pfadsuche benutzt werden. Die Iteration wird also abgebrochen. Falls keine neuen Aφ -Kanten und kein Pfad zur Senke gefunden worden sind, ist der aktuelle Fluss maximal. Andernfalls wird eine neue Iteration gestartet, da durch neue Tφ -Kanten eventuell neue Wege entstanden sein können. Wenn der Fluss nicht maximal war, wird für jede gefundene P in (e) Aφ -Kante e der Pfad von Tφ -Kante f enthält, in wird nur das rechteste Teilstück ab dieser Tφ Kante als P (e) gespeichert und zusätzlich lastT(e) := f gespeichert. Damit stehen für jede Kante die Pfade P in und die Kanten lastT der Quelle zu ihr als gespeichert. Falls der benutzte Pfad eine zur Verfügung, so dass CalculateAugmentingPath weiterhin korrekt funktioniert. 4.1.16 Algorithmus (FindAugmentablePaths). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 56 do ReduceLFromRight() Q := ∅ Enqueue(Q, s) A := ∅ do v := Dequeue(Q) for e := (v, w) ∈ v + \ Lφ markiere v if e ∈ Aφ A := A ∪ e else if w nicht markiert Enqueue(Q, w) while Q 6= ∅ for f := (v, w) ∈ A Lφ := Lφ ∪ f Aφ := Aφ \ f if Pfad von s nach f enth ä lt Tφ - Element e := die rechteste Tφ - Kante auf dem berechneten s - v - Pfad 4.1 Algorithmus 20 lastT(f ) := e 21 P in (f ) := Pfad von e nach f else P in (f ) := Pfad von s nach f end for if s - t - Pfad V gefunden return V else if |A| = 0 exit while true 22 23 24 25 26 27 28 29 4.1.17 Satz. Wenn Algorithmus 4.1.7 abbricht, ist der Fluss φ maximal. Wenn für eine Kante f P in (f ) gespeichert wird, enthält der Pfad keine saturierte Kante. Der Algorithmus terminiert immer und hat eine Laufzeit von O(|E| · (|V | + |E|)). Beweis. Wir betrachten die Situation, in der der Algorithmus abbricht. Auf jedem positiven s-t-Pfad liegt genau eine Kante aus kein Aφ -Element. Falls Lφ . Es wird kein s-t-Pfad gefunden und gleichzeitig Also existiert kein verletzender Pfad und damit ist der Fluss maximal. Aφ -Kanten gefunden werden, könnten sie linkeste Aφ -Kanten auf einem verletzen- Lφ den Pfad sein. Für die Korrektheit schaded es nicht, dass wir diese Kanten in verschie- ben, es werden nur zu viele Iterationen durchgeführt. Also werden alle diese Kanten in verschoben. Die rechteste, auf dem zu einer wird als lastT(f ) Aφ -Kante gefundenen Pfad liegende, Tφ Lφ Kante in gespeichert und dieser Teilpfad als P (f ). Er enthält keine saturierte Kante, da Kanten aus Lφ ignoriert werden. Die Breitensuche hat eine Laufzeit von O(|V |). Abgesehen von Lφ -Kanten werden alle von einem besuchten Knoten ausgehenden Kanten betrachtet. Der Algorithmus bricht ab, wenn ein verletzender s-t-Pfad gefunden worden ist, oder wenn kein Aφ -Element gefunden wurde. Nehmen wir an, der Algorithmus breche in einer Runde nicht ab. Dann existieren Elemente, die nach Lφ Aφ - verschoben werden. Wenn in der nächsten Iteration der Schleife kein neuer Knoten erreicht wird, bricht der Algorithmus ab mit |A| = 0 und der Fluss war maximal. Ansonsten wird ein Knoten besucht, der vorher nicht besucht worden ist. Da es nur n Knoten gibt, kann der Algorithmus maximal Die Laufzeit der Pfadsuche beträgt also Ein Pfad hat höchstens Länge |V | − 1, |V | Schleifeniterationen durchführen. O(|V | · |E|). es können maximal |E| Elemente in werden. Das Speichern aller Pfade kann also insgesamt in Laufzeit Aφ gefunden O(|V |·|E|) durchgeführt werden. Die Gesamtlaufzeit des Algorithmus ist damit O(|V | · |E|). 57 4 Der AbstractMaxFlow-Algorithmus 4.2 Analyse Pseudopolynomielle Laufzeit Bei der Übertragung des Algorithmus wird FindViolatingPath benutzt, um einen verletzenden Pfad zu nden. Die Methode, mit der dieser Pfad gefunden wird, haben wir dabei nicht weiter festgelegt. Der Algorithmus von Ford und Fulkerson, der die Pfadsuche ebenfalls nicht einschränkt, hat im schlechtesten Fall pseudopolynomielle Laufzeit. Schon die Wahl von kürzesten Wegen, wie in Algorithmus 3.1.4, verhindert dies und liefert eine streng polynomielle Laufzeit. Betrachten wir zunächst einen Lauf des AbstractMaxFlow-Algorithmus auf dem Beispiel aus Abbildung 3.4, auf dem der Algorithmus von Ford und Fulkerson rungsschritte durchführt, wobei M Lφ -Kante (s, 2, t) (1, 2) M −1 (1, 2) (s, 1, t) (s, 1) und (2, t) in Lφ Tφ verschoben. Der Pfad ist (2, t). oder augmentiert werden kann. (s, 1) saturiert, einzig möglicher Pfad im dritten (s, 1, t) enthält einsortiert und anschlieÿend (s, 1) als Tφ -Kante (s, 1) und (1, 2) nach und die zugehörige Lφ -Kante Der Fluss wird also auf der limitierenden Kante zurückgenommen und auf (1, t) als (s, 2, t), entlang dem der Fluss wieder um M − 1 augmentiert werden kann. Nun werden die Kanten (s, 2) um 1 erhöht und ist anschlieÿend maximal. Im zweiten Fall wird die Kante des einzig möglichen Pfades (1, 2) gefunden, der die limitie- klassiziert und nicht weiter beachtet. Es wird nun einer der Pfade Im ersten Fall ist anschlieÿend die Kante und (s, 1, 2, t) mit Kapazität 1 enthält. Im nächsten Schritt wird die Kante gefunden, entlang denen der Fluss jeweils um Schritt ist Augmentie- eine groÿe Kantenkapazität ist. Im ungünstigen Fall wird im ersten Schritt der Pfad rende Kante O(M ) und (2, t) (2, t) saturiert und im nächsten Schritt der Fluss entlang (s, 1, t) um M −1 augmentiert. Nun sind die Kanten (s, 1), saturiert und es liegt die gleiche Situation wie im ersten Fall vor. Es werden also, auch wenn keine kürzesten Wege benutzt werden, maximal vier Augmentierungsschritte durchgeführt, bis ein maximaler Fluss erreicht wird. Dies ist zwar doppelt so viele, wie nötig sind, führt aber nicht zu pseudopolynomieller Laufzeit. Falls die Pfadsuche immer kürzeste Wege liefert, werden wie vom Algorithmus von Edmonds und Karp zwei Schritte durchgeführt. Mit einer kleinen Modikation des Graphen lässt sich jedoch auch für den abstrakten Algorithmus eine pseudopolynomielle Laufzeit erreichen, auch in dem Fall, in dem nur kürzeste Wege genutzt werden. Der Graph in Abbildung 4.6 ist eine Version des oben benutzten Gegenbeispiels mit einigen zusätzlichen Knoten und Kanten. Wenn Multikanten zulässig sind, genügt es zwei zusätzliche Knoten und Kanten hinzuzufügen. In diesem Graphen haben alle kürzesten s-t-Pfade Länge 5. Die Kante (1, 2) sowie die geschwungenen Kanten haben Einheitskapazitäten, die anderen Kanten haben Kapazität M 1. Es existiert dann eine Folge von Augmentierungsschritten, die vom abstrakten Algorithmus berechnet wird und zu 58 O(M ) Augmentierungsschritten führt. 4.2 Analyse t1 1 d a e s t b f c 2 t2 Abbildung 4.6: Ein Graph auf dem M Augmentierungsschritte durchgeführt werden, auch wenn sämtliche berechneten Teilpfade kürzeste Wege sind. Die Kanten entlang des Pfades (s, t1 , 1, 2, t2 , t) haben Kapazität 1, die anderen Kanten haben Kapazität M 1. Wir nehmen an, dass sämtliche Pfadsuchen kürzeste Wege zurückliefern. Die ersten drei Pfade können einfach augmentiert werden: Die Pfade (s, a, 1, 2, f, t) (s, t1 , 1, d, e, t), (s, b, c, 2, t2 , t) und enthalten zunächst alle keine saturierten Kanten und können jeweils mit maximaler Kapazität von 1 saturiert werden. Im Anschluss führen alle Kanten einen Fluss von 1. Zu Beginn des nächsten Augmentierungsschrittes werden die Kanten als Tφ -Kanten klassiziert. Anschlieÿend werde der Pfad noch saturierte Kanten aus lastT((t1 , 1)) = zwischen 2 und Tφ enthält. Die letzte (s, t1 , 1, d, e, t) Tφ -Kante verringert und wieder entlang Im nächsten Schritt ist (1, d, e, t) gefunden, der nur auf dem Pfad ist (2, t2 ), es wird also Fluss entlang von P in ((2, t2 )) 1 (s, t1 ), (t1 , 1), (1, 2) (t1 , 1) = (s, b, c, 2) und erhöht, um eine Einheit erhöht. (1, 2) unsaturiert, als kürzester Pfad werde diesmal (s, a, 1, 2, f, t) gefunden; auch entlang dieses Pfades kann der Fluss um 1 erhöht werden. Es liegt nun wieder die gleiche Situation wie nach den ersten drei Augmentierungsschritten vor und es kann wieder wie beschrieben fortgefahren werden. Indem diese letzten beiden Schritte immer abwechselnd durchgeführt werden, kann der Fluss in 2(M − 1) + 3 Schritten maximiert werden. Wir betrachten als nächstes den Graphen aus Abbildung 4.7. Die Kanten (19, 20) haben Kapazität 2, die Kante (2, 9) (1, 2) und habe Kapazität 1. Die anderen Kanten haben beliebige, aber höhere Kapazität. Dann kann in drei Augmentierungsschritten ein Fluss mit Wert 3 entstehen. Dazu wird der Fluss nacheinander auf den Pfaden (s, 15, 16, 17, 18, 19, 20, t) (s, 1, 2, 9, 10, 19, 20, t), (s, 1, 2, 3, 4, 5, 6, t) und um 1 erhöht. Alle diese Pfade haben eine Länge von 7. Zu Beginn des vierten Augmentierungsschrittes wird ebenfalls saturierten Kanten (1, 2) und (2, 9) nach Tφ (19, 20) in Lφ einsortiert, sowie die verschoben. Der kürzeste verletzende 59 4 Der AbstractMaxFlow-Algorithmus 2 1 2 3 4 5 1 7 s 6 9 8 11 10 15 12 13 t 14 16 17 18 2 19 20 Abbildung 4.7: Ein Graph auf dem M Augmentierungsschritte durchgeführt werden, auch wenn sämtliche berechneten Teilpfade kürzeste Wege sind. Die Kanten entlang des Pfades (s, t1 , 1, 2, t2 , t) haben Kapazität 1, die anderen Kanten haben Kapazität M 1. Pfad ist dann (19, 20) (s, 1, 2, 3, 4, 5, 6, t) der Länge 7, der die Tφ -Kante (1, 2) nutzt. Da in((1, 2)) = gilt, wird der Fluss wie folgt abgeändert: auf den Pfaden (s, 15, 16, 17, 18, 19) und (2, 3, 4, 5, 6, t) wird er um 1 erhöht und auf dem Pfad (2, 9, 10, 19) wird der Fluss verringert. Der so benutzte Pfad hat eine Länge von 13. Zuletzt wird noch der Pfad (s, 7, 8, 9, 10, 11, 12, 13, 14, t) gefunden, entlang dem der Pfad augmentiert werden kann. Dieser hat eine Länge von 9. Es gilt also nicht, dass die Länge der augmentierenden Pfade monoton wächst, wie dies beim Algorithmus von Edmonds und Karp oder beim Algorithmus von Dinic der Fall ist. Damit können die Laufzeitschranken nicht übertragen werden. Das Problem ist, dass zwar alle berechneten Teilpfade kürzeste Pfade sind, das zusammengesetzte Gebilde der positiven und augmentierbaren Kanten zwischen saturierten Kanten aus Tφ und Lφ muss aber nicht mehr die kürzeste Möglichkeit sein, Fluss zu augmen- tieren. Eine kleine Änderung im Inneren des Graphen führt dazu, dass Fluss auf der Kante (9, 10) zurückgenommen werden muss. Es ist nicht möglich, auf bestimmten Kanten Fluss zurückzunehmen, sondern nur auf Abschnitten zwischen zwei saturierten Kanten. Laufzeit für reelle Kapazitäten Es kann sein, dass der Algorithmus von Ford und Fulkerson nicht terminiert, falls reellwertige Kapazitäten verwendet werden. In [11, Kapitel 1.8] geben sie einen Graphen mit 10 Knoten und 48 Kanten, auf dem der Algorithmus nicht terminiert und der berechnete Fluss gegen den falschen Wert konvergiert. Kleinere Beispiele entwickelte Zwick [35]. Dort beschreibt er unter anderem das Netzwerk in Abbildung 4.8, das auch das kleinstmögliche Netzwerk ist, auf dem der Algorithmus nicht terminiert. Die Kanten e1 , e2 , e3 und e4 seien ausgezeichnete Kanten mit den irrationalen Kapa- zitäten, deren Wert wir nachher bestimmen. Zuerst wird Fluss über den Pfad verschickt und dadurch die Kante 60 e4 saturiert. Jeder der Pfade P1 , P2 , P3 und (s, 3, 2, t) P4 nutzt 4.2 Analyse e1 1 2 e1 1 2 t1 `1 e3 e3 s s t t e4 3 e4 t2 e2 4 (a) Das Netzwerk auf dem der Algorithmus von Ford und Fulkerson nicht terminiert. `2 e2 3 4 (b) Das erweiterte Netzwerk. Abbildung 4.8: Nicht konvergierendes Beispiel. eine der ausgezeichneten Kanten als Rückwärtskante. Sie können in dieser Reihenfolge nacheinander angewendet werden und die Kanten e4 , e2 , e3 e1 und werden nacheinander unsaturiert. Nehmen wir an, die Kanten es gelte c2 Kanten die Kapazitäten c3 e4 haben Restkapazitäten Beim Augmentieren von c1 − c2 , c2 − c2 = 0, c3 − c2 Im nächsten Schritt wird kapazitäten c1 , c2 , c3 P1 wird e4 und 0 und als Rück- ist limitierende Kante. Anschlieÿend haben die ausgezeichneten und c2 . Beim Augmentieren von die limitierende Kante und die neuen Restkapazitäten sind c2 − c3 . P4 und c1 > c2 > c3 > c1 − c2 > c2 − c3 . wärtskante benutzt und ist e1 , e2 , e3 P3 mit Wert c1 − c2 Kanten die Restkapazitäten und augmentiert. Es entstehen die Rest- c1 − c2 − (c1 − c2 ) = 0, c3 − (c1 − c2 ), c1 − c2 augmentiert und mit der limitierenden Kapazität c1 − c2 , c3 , c3 − c3 P2 und c2 − c3 c2 − c3 . Als letztes wird haben die ausgezeichneten c2 − c3 , c3 − (c1 − c2 ), (c1 − c2 ) − (c2 − c3 ) und 0. Die Kanten bilden also einen Zyklus und wir sind in der selben Situation wie am Anfang. Bezeichnen wir die neuen Kapazitäten der Kanten nach diesem Zyklus mit c02 := −c1 + c2 + c3 und c03 := c1 − 2c2 + c3 c01 0 c01 := c2 − c3 , erfüllen die Kapazitäten das Gleichungssystem 1 −1 c0 = −1 1 2 0 c3 1 −2 c1 c2 . · 1 1 c3 61 4 Der AbstractMaxFlow-Algorithmus Es ist dann 1 0 0 1 −1 0 det 1 x · 0 1 0 − −1 0 0 1 1 −2 x −1 1 = det 1 x − 1 −1 −1 2 x−1 1 1 = x3 − 2x2 + x − 1 + 2 + x − 1 + 2x + x − 1 = x3 − 2x2 + 5x − 1 = f (x) das charakteristische Polynom der Matrix. 9 Nullstelle des Polynoms . Es sei λ r := λ ≈ 0, 216756572 √ 1+ 1−4λ 2 ≈ 0, 682327804 ist die eindeutigen reelle 10 . Dann ist (1, r, r2 ) der zu gehörende Eigenvektor. Wir setzen als Kapazitäten c(e1 ) := 1, c(e2 ) := r, c(e3 ) := r2 und c(e4 ) := 1. Nachdem 2 zu Beginn P4 augmentiert wird, haben die Kanten die Restkapazitäten 1, r, r und 0. Damit 1 > r > r2 > 1 − r > r − r2 , so dass wie beschrieben entlang der vier Pfade augmentiert werden kann. In der ersten Runde wird der Fluss insgesamt um 1+r erhöht 11 r + r2 + (1 − r) + (r − r2 ) = . Nachdem zum ersten Mal entlang der vier Pfade augmentiert worden ist, beträgt die λn · c(e). Restkapazität für e ∈ {e1 , e2 , e3 , e4 } λ · c(e) wird der Fluss um λn−1 ·(1+r) erhöht. Der Fluss konvergiert also gegen 1+ und nach n Phasen In jeder Runde ∞ P λn ·(1+r) = i=0 1+ 1+r 1−λ = 2 + r + r2 ≈ 3, 147899036, was auch der maximale Fluss ist. Da er kürzeste Wege benutzt bestimmt der AbstractMaxFlow-Algorithmus den maximalen Fluss in vier Iterationen. Es wird nacheinander jede der ausgezeichneten Kanten saturiert und anschlieÿend nicht mehr betrachtet. Wenn das Netzwerk jedoch so abgeändert wird, wie in Abbildung 4.8 (b), terminiert AbstractMaxFlow ebenfalls nicht. Wir wollen zeigen, dass er die gleiche Folge von augmentierenden Pfaden erzeugt. Die Kanten Länge t1 , t2 , `1 und `2 haben jeweils Kapazität 1. Alle augmentierenden Pfade haben 3. Zu Beginn wird der Fluss entlang der Pfade (s, 1, 2, t) und (s, 3, 4, t) augmentiert, wobei jeweils die Kanten mit Kapazität 1 benuzt werden. In sämtlichen weiteren Iterationen werden die Kanten `1 und `2 als Lφ -Kanten sowie t1 und t2 als Tφ -Kanten klassifziert. Wir nehmen an, dass die optimierte Variante genutzt wird, dadurch werden automatisch alle saturierten Kanten gefunden. Ansonsten müssen die Kanten passenden verletzenden Pfad in 9 Lφ `1 und `2 durch einen verschoben werden. Sie lässt sich zum Beispiel mit den cardanischen Formeln bestimmen. Eine numerische Lösung kann mit dem Newton-Verfahren bestimmen werden. 10 In [35] ist hier ein Tippfehler, die dort angegebene Zahl ist 0, 682378. 11 Hier ndet sich in [35] die falsche Angabe 2 + r. 62 4.2 Analyse Abhängig davon, ob in ReduceLFromRight zuerst entweder in(t1 ) = in(t2 ) = `1 entlang von (s, 3, 2, t) oder augmentiert, wobei werden. Dazu werde der Pfad Tφ -Kante t2 (s, 3, 4, t) benutzt werde. Mit Anschlieÿend ist e4 oder `2 betrachtet wird, ist Als erster Schritt werde wieder P1 saturiert wird. Zuerst soll augmentiert von der Quelle zur Senke gefunden, wobei die in(t2 ) = `1 wird der Fluss entlang von P1 augmentiert. e2 saturiert. Zum Augmentieren von P2 werde (s, 3, 2, t) als Pfad zur Senke in(t2 ) = `2 . Mit P in (`2 ) = (s, 2, 4) wird entlang von P2 gefunden. Diesmal sei Um entlang von in(t1 ) = in(t2 ) = `2 . `1 P3 augmentiert. zu augmentieren, muss der mit der Kante t1 beginnende Pfad gefunden werden und in(t1 ) gefunden werden und es sei muss `2 sein. Für den letzten Pfad werde der Pfad (s, 1, 2, t) (s, 1, 4, t) in(t1 ) = `1 . Durch diese Wahl der gefundenen Pfade, die vom Algorithmus durchgeführt werden kann, wird die beschriebene Folge von Augmentierungen durchgeführt und der Algorithmus 2 terminiert nicht. Der erreichte Fluss ist um höher, da es zwei zusätzliche Pfade mit Kapazität 1 gibt. Das Netzwerk enthält Mehrfachkanten, um es einfach zu halten. Mit zusätzlichen Knoten, wie im Netzwerk aus Abbildung 4.6, kann das Verfahren auch auf einfachen Graphen angewendet werden. Laufzeit der Pfadsuche Wir wissen nun, dass die Gesamtlaufzeit pseudopolynomiell ist und wollen als nächstes überprüfen, wieviele Suchen nach verletzenden Pfaden (in der Standardversion) durchgeführt werden müssen. Wir betrachten dazu einen Graphen wie in Abbildung 4.9. Für n ∈ N hat das Netzwerk jeweils n Knoten i ∈ {0, 1, . . . , n − 1} gibt es die Kanten zusätzlich die Kanten (xi , yi−1 ). x0 , x1 , . . . , xn−1 (s, xi ), (xi , yi ) Insgesamt gibt es 2n + 2 und und y0 , y1 , . . . , yn−1 . (yi , t). Knoten und Für i > 0 4n − 1 Für gibt es Kanten. Alle Kanten haben Einheitskapazität. xn−1 xn−2 s .. x1 x0 . yn−1 yn−2 t y1 y0 Abbildung 4.9: Eine Graphklasse auf der mit m Kanten O(m) Pfadsuchen durchgeführt werden. 63 4 Der AbstractMaxFlow-Algorithmus Der maximale Fluss im Netzwerk ist werden, indem nacheinander die Pfade n und kann in (s, x0 , y0 , t) n bis Augmentierungsschritten erreicht (s, xn−1 , yn−1 , t) augmentiert wer- den. Wir betrachten nun den Fall, dass stattdessen in den ersten n−1 Schritten die Pfade (s, x1 , y0 , t) bis (s, xn−1 , yn−2 , t) gewählt worden sind. Algorithmen, die Residualnetzwerke benutzen, können den Fluss nun entlang des Pfades yn−1 , t) Im (s, x0 , y0 , x1 , y1 , . . . , xn−1 , yn−2 , xn−1 , augmentieren und erreichen so einen maximalen Fluss. n-ten Augmentierungsschritt von AbstractMaxFlow werden i-ten FindAugmentablePaths durchgeführt. In der n−1 Iteration wird die Kante als am weitesten rechts auf einem verletzenden Pfad liegende Kante in nächsten Schritt können dann die Kanten (s, xi ) und Iterationen in (xi , yi−1 ) in Tφ Lφ (xi−1 , t) verschoben. Im verschoben werden. In diesem Beispiel ist die Laufzeit des Algorithmus um den Faktor zwei gröÿer und die Anzahl der Kanten ist in der selben Gröÿenordnung wie die Anzahl der Knoten. Die Anzahl der Iterationen in FindAugmentablePaths ist begrenzt durch die Anzahl der saturierten Kanten. Die Laufzeit vom AbstractMaxFlow-Algorithmus ist nur um einen Faktor gröÿer, wenn jede gefundene saturierte Kante vorher entlang eines Pfades augmentiert worden ist. 4.2.1 Satz. In einem Netzwerk mit n Augmentierungsschritten zu saturieren. Beweis. sei √ Knoten ist es möglich, Ω(n · n) Kanten mit n Wir betrachten einen vollständigen Graphen mit n Knoten {1, 2, · · · , n}. Für i < j (i, j) eine Kante, das heiÿt, alle Kanten verlaufen von Knoten mit niedriger Nummer zu Knoten mit hoher Nummer (vgl.. Denition 4.3.1). In Bemerkung 3.2.1 haben wir gezeigt, dass in solchen Graphen exponentiell viele Pfade existieren. Wir wollen nun zeigen, dass mit n Augmentierungsschritten (für groÿes n) mindestens n· p (n) Kanten saturiert werden können. Wir sagen eine Kante e überbrückt ` Knoten, falls e = (i, j) ist und j − i = ` gilt. Zum Beispiel überbrückt die Kante Wir wollen für wachsendes (3, 5) zwei Knoten. i nacheinander alle Kanten nutzen, die i Knoten überbrücken. Sei zunächst i = 1. Der Pfad (1, 2, . . . , n) nutzt alle Kanten die einen Knoten überbrücken. n−1 Das sind i = n−1 1 Wir setzen nun =n−1 i = 2. können, und der Pfad 1 Stück. Wenn nur Kanten, die zwei Knoten überbrücken genutzt werden beginnt, werden die Kanten (1, 3, 5, . . .) benutzt. Falls n=1≡2 ist, muss die letzte Kante zum ausgleich benutzt werden. Andersrum können, falls die Kante (1, 2) genutzt wird, die Knoten (2, 4, 5, . . .) besucht werden. Mit diesen zwei Pfaden wurden also alle Kanten, die zwei Knoten überspringen, genutzt. i Pfade benötigt, um alle Kanten, die i Knoten übersprin n−1 gen, zu nutzen. Der in 1 startende Pfad nutzt Kanten. Ein Pfad, der ab Knoten j die ij k n−j Kanten nutzt, die i Knoten überspringen, nutzt Kanten, die i Knoten überbrücken. i Insgesamt werden auf diese Art 64 4.2 Analyse 1 2 3 4 5 6 Abbildung 4.10: Ein Graph mit 6 Knoten. Die zwei Pfade mit den roten Kanten nutzen jeweils 6−1 = 6−2 = 2 neue Kanten. Die blauen Pfade nutzen 6−1 = 6−2 = 2 2 3 3 6−3 = 1 neue Kante. Insgesamt werden 5 + 2 + 2 + 1 + 1 + 1 = 12 Kanten 3 genutzt. Wir wollen die Anzahl der Kanten, die insgesamt in werden, bestimmen. Es werden 1+2+3+4+··· überbrücken, hinzugefügt. Da sich n n Augmentierungsschritten genutzt Pfade, die die gleiche Anzahl an Knoten nicht immer als Summe aufeinanderfolgender Zahlen darstellen lässt, müssen eventuell von den letzten Pfaden einige ausgelassen werden. Abbildung 4.10 zeigt ein Beispiel für n = 6 = 1 + 2 + 3, so dass es genau aufgeht. Für 1, 2 können dieselben Pfade genutzt werden. Damit werden alle Kanten genutzt, die 3 Knoten überbrücken. Es kann jedoch nur einer der möglichen vier Pfade, die überbrücken, genutzt werden. Dies ist erst für n = 10 gegeben mit n = darstellen. Wenn man dies nach mit k > 0. k n als Summe der ersten auöst, gilt 4 und Knoten möglich. Da die Summe der benutzten Kanten monoton wächst, sei ab jetzt immer k·(k+1) . Dann lässt sich 2 n=7 k = − 12 ± q 1 4 + 2n. k n und k natürlichen Zahlen Wir nutzen die Lösung Es gilt dann lim k n→∞ 1 = lim − + n→∞ 2 √ √ = 2 · n. r 1 + 2n 4 Wir schätzen nun die Anzahl der benutzten Kanten ab: k X i X n−j i i=1 j=1 ≥ k X i X n−j i=1 j=1 i −1 i X 1 −i + = n − j i i=1 j=1 k i X X −i + 1 i · n − = j i k X i=1 j=1 65 4 Der AbstractMaxFlow-Algorithmus k X 1 i(i + 1) −i + i·n− i 2 i=1 k X i 1 = −i + n − − 2 2 = i=1 k 1 3X = k · (n − ) − i 2 2 i=1 1 = k · (n − ) − 2 1 Def = k · (n − ) − 2 3 k(k + 1) · 2 2 3 n 2 (4.1) Damit gilt für groÿe n: 3 1 lim k · (n − ) − n 2 2 √ √ 1 3 = lim 2 · n · (n − ) − n n→∞ 2 2 √ √ = 2· n·n n→∞ Die Kapazitäten für alle benutzten Kanten, die mehr als einen Knoten überbrücken, wird auf 1 sind gesetzt, die Kapazität der Kanten, die mehrmals benutzt werden, sei passend. Dann Ω(n · √ n) Kanten saturiert. Wir betrachten nun einen Graphen mit Graphen mit n n+2 Knoten, der aus einem vollständigen Knoten und zwei zusätzlichen Knoten als Quelle und Senke besteht, wie in i ∈ {1, 2, . . . , n} die Kanten (s, i) √ werden Ω(n · n) Kanten saturiert. Denition 4.3.1. Zusätzlich gebe es für ersten n Augmentierungsschritten Der nicht optimierte abstrakte Fluss-Algorithmus klassiziert alle in als Lφ -Kanten. θ(n · (i, t). In den 1 startenden Kanten In der anschlieÿenden Pfadsuche können alle anderen saturierten Kanten jeweils einzeln sukzessive insgesamt und √ n) Aφ -Kante auf einem verletzenden Pfad gefunden werden, so dass Phasen durchgeführt werden. Der optimierte Algorithmus ndet in einer Iteration alle saturierten Kanten und verschiebt sie in Lφ (beziehungsweise Tφ ). 4.3 Empirische Ergebnisse Implementierung Zum experimentellen Testen der Güte des abstrakten Fluss-Algorithmus wurde er in mehreren Varianten implementiert in Java implementiert. Die in Abschnitt 3.1 vorgestellten Algorithmen wurden ebenfalls implementiert. 66 4.3 Empirische Ergebnisse Als Grundlage wurde eine objektorientierte Datenstruktur für Graphen implementiert, die es ermöglicht unter einer Schnittstelle mehrere Ansätze zur Verfügung zu stellen. In der gewählten Implementierung besteht ein Graph aus einer Menge von Knoten und Kanten, die beide in einem Array gespeichert werden. Sie können beide direkt über eine Identikationsnummer angesprochen werden. Die Knoten verwalten Adjazenzlisten, die sowohl eingehende als auch ausgehende Kanten speichern. Es wurden zwei Varianten implementiert, eine auf einem Array und eine auf Bäumen basierende 12 Rot-Schwarz- . Diese beiden Varianten unterstützen das Durchlaufen aller adjazen- ten Kanten (oder Knoten) in der gespeicherten Reihenfolge. Das Suchen einer Kante, von der nur der Start- und Endknoten bekannt sind, erfordert in der array-basierten Datenstruktur lineare Zeit in der Anzahl der adjazenten Knoten und in der baum-basierten Datenstruktur nur logarithmische Zeit. Zusätzlich wurde eine Variante der array-basierenden Knotendatenstruktur implementiert, mit der die adjazenten Kanten in zufälliger Reihenfolge durchlaufen werden können. Wie in Abschnitt 3.1 und 4.2 gezeigt, haben sowohl der Ford und Fulkerson-Algorithmus als auch der Abstrakte Fluss-Algorithmus eine pseudopolynomielle Worst-Case-Laufzeit, wenn eine schlechte Folge von augmentierenden Pfaden gewählt wird. Mit der randomisierten Datenstruktur kann geprüft werden, ob die Eekte durch zufällige Wahl der Pfade gemildert werden können. Als Suchalgorithmen wurden eine Breitensuche und eine Tiefensuche implementiert, die jeweils die besuchten Vorgänger markieren. Beide Algorithmen entsprechen damit den Bedingungen für den Markierungsalgorithmus nach Ford und Fulkerson. Der Algorithmus von Ford und Fulkerson wurde mit der Tiefensuche als Pfadsuche implementiert und der Algorithmus von Edmonds und Karp mit der Breitensuche. Der Abstrakte Fluss-Algorithmus wurde in drei Varianten implementiert. Die ersten beiden Varianten entsprechen dem in Abschnitt 4.1.1 beschriebenen Algorithmus: Abstract benutzt zur Pfadsuche in FindViolatingPath eine Tiefensuche und AbstractSP nutzt eine Breitensuche und damit kürzeste Pfade. Die in Abschnitt 4.1.2 beschriebenen Verbesserungen wurden in AbstractOpt implementiert. Der Ford und Fulkerson-Algorithmus ist als FordFulkerson und der Algorithmus von Edmonds und Karp als EdmondsKarp implmentiert. Zum Laden und Speichern von Dateien mit Netzwerken im Format für maximale Flüsse der ersten DIMACS-Challenge wurde ein Konverter geschrieben. Dies erlaubt die von den bei der DIMACS-Challenge erzeugten Graphgeneratoren zu nutzen. Zusätzlich wurden einige Graphgeneratoren neu implementiert. Diese können nun nicht nur Dateien im DIMACS-Format schreiben, sondern die Graphen direkt im internen Format erzeugen. 12 Als Spezialfall von B-Bäumen sind Rot-Schwarz-Bäume binäre Suchbäume, die annähernd balanciert sind (vgl. [3, Kapitel 13,18]). 67 4 Der AbstractMaxFlow-Algorithmus 13 Die erzeugten Klassen stehen als freie Software unter der GPL-Lizenz Version 3 Testinstanzen . Zum Vergleichen der Algorithmen nutzen wir drei Graphklassen. Die er- ste Graphklasse bestehen im Wesentlichen aus einem vollständigen gerichteten Graphen und zwei zusätzlichen Knoten. Für die Kanten lassen wir Zufallszahlen in verschiedener Verteilung zu, solange sie ganzzahlige Werte erzeugen. 4.3.1 Denition (Kn ). Sei n ∈ N und für c1 , c2 ∈ N diskrete Wahrscheinlichkeitsverteilung, die Werte von V := {s, v1 , v2 , . . . , vn , t} ten ist deniert als c1 mit bis c2 c1 > c2 sei D(c1 , c2 ) eine liefert. Die Menge der Kno- und die Menge der Kanten ist deniert als E := {(vi , vj ) | vi , vj ∈ V ∧ i < j} ∪ {(s, v1 ), (vn , t)}. Die Kapazitäten sind deniert als e = (s, v1 ) n · c2 c(e) := D(c1 , c2 ) e ∈ E \ {(s, v1 ), (vn , t)} n·c e = (vn , t) 2 Eine Instanz Kn Die Instanzen ist ein Netzwerk Kn bestehen (bis auf die zwei Kanten ständigen gerichteten Graphen mit damit azyklisch. N = (V, E, v1 , vn , c). n (s, v1 ) und (vn , t)) aus einem voll- Knoten und vorwärtsgerichteten Kanten und sind Diese Klasse stellt für Algorithmen, deren Laufzeit von der Anzahl der Kanten abhängt, die schwierigsten Instanzen. Ein Beispiel für diese Klasse ist in Abbildung 4.11 zu sehen. s 1 2 3 4 5 6 7 t Abbildung 4.11: Ein Beispielgraph der Klasse K7 . Ein weiterer Typ von Instanzen ist RMFGEN, die in [14] und in mehreren Vergleichen bei der DIMACS-Challenge [21] benutzt werden. 13 Der Originaltext ist unter der Adresse http://www.gnu.org/licenses/gpl.html zu nden, eine deutsche Übersetzung unter http://www.gnu.de/documents/gpl-3.0.de.html. 68 4.3 Empirische Ergebnisse 4.3.2 Denition (RM F GEN ). deniere Vi := {vjk | 1 ≤ j, k ≤ a}. Sei a, b, c1 , c2 ∈ N und c2 > c1 . i ∈ {1, 2, . . . , b} b S als V := Vi . Für Die Menge der Knoten ist deniert i=1 Deniere Ei := {(vijk , vij 0 k0 ) | vijk , vij 0 k0 ∈ Vi ∧ |j − j 0 | = 1 ∧ |k − k 0 | = 1}. {1, 2, . . . , b − 1} sei 2 2 π` : {1, 2, . . . , a} → {1, 2, . . . , a} eine Permutation. Deniere damit E`0 := {(v`jk , v`+1π` (jk) ) | v`jk ∈ Vi ∧ v`+1π` jk ∈ V`+1 }. Die Menge der Kanten b b−1 S S 0 E` . Die Kapazitäten sind randomisiert14 deniert als als E := Ei ∪ i=1 ` ∈ Für ist deniert `=1 ( c22 c(e) := Eine Instanz RMFGEN(a, b) e ∈ Ei U (c1 , c2 ) e ∈ E`0 ist ein Netzwerk N = (V, E, v111 , vbaa , c). Die Graphen sind in mehreren Schichten mit jeweils a2 Knoten angeordnet, jeweils zwei 2 aufeinanderfolgende Schichten werden mit a Kanten verbunden. Sie haben damit eine relativ hohe Anzahl von Kanten, die aber noch linear in der Anzahl der Knoten ist. Diese Instanzen repräsentieren damit dünne Graphen mit relativ vielen Kanten. Insgesamt hat eine RMFGEN(a, b)-Instanz a2 ·b Knoten und 4b·(a2 −a)+(b−1)∗a2 Eingangs- und Ausgangsgrad ist jeweils Kanten. Der höchste 5. Ein Beispielnetzwerk für a = 3 ist in Abbildung 4.12 zu sehen. Eine dritte Instanz ist die Variante Mesh des Washington-Generators, die ebenfalls bei der DIMACS-Challenge vorgestellt worden ist. 4.3.3 Denition (Washinton-Mesh). {1, 2, . . . , d1 }, j ∈ {1, 2, . . . , d2 }} ∪ {s, t} k + 1 mod d2 und d1 , d2 ≥ 3 ∈ N. Sei Dann ist die Menge der Knoten. Es sei se (k) := k − 1 mod d2 . V := {vij | i ∈ s1 (k) := k , s2 (k) := Dann ist die Menge der Kanten deniert als E := {(s, i) | i ∈ {1, 2, . . . , d1 }} ∪{(vij , vi+1,s1 (j) ) | i ∈ {1, 2, . . . , d2 − 1}, j ∈ {1, 2, . . . , d1 }} ∪{(vij , vi+1,s2 (j) ) | i ∈ {1, 2, . . . , d2 − 1}, j ∈ {1, 2, . . . , d1 }} ∪{(vij , vi+1,s3 (j) ) | i ∈ {1, 2, . . . , d2 − 1}, j ∈ {1, 2, . . . , d1 }} ∪{(i, t) | i ∈ {1, 2, . . . , d1 }}. Die Kapazitäten einer diskreten Wahrscheinlichkeitsverteilung zugewiesen. Dann ist Instanz von c werden gemäÿ N = (V, E, s, t, c) eine Washington-Mesh. Eine Washington-Mesh-Instanz besteht aus d1 · d2 Knoten (zuzüglich Quelle und Senke), die auf einem Gitter liegen. Es gibt Kanten zwischen benachbarten Schichten von der Quelle in Richtung Senke. Jeder Knoten hat drei Nachfolger: denjenigen an seiner Position in der nächsten Ebene, sowie den darüber und darunter. Diese werden durch die Methoden s2 und s3 s1 , bestimmt. An den Rändern des Gitters wird umgebrochen, so dass die oberen Knoten mit den unteren verbunden sind, und umgekehrt. Washington-Mesh-Graphen sind dünne, azyklische Graphen. 14 Mit U (x, y) wird eine diskrete Gleichverteilung der Zahlen von x bis y bezeichnet. 69 4 Der AbstractMaxFlow-Algorithmus Ebene 1 Ebene 2 Ebene ··· Abbildung 4.12: Ein Beispielgraph der Klasse RMFGEN mit a = 3. Es gibt b Ebenen mit jeweils a2 Knoten, die untereinander zu einem Gitter verbunden sind. Die Knoten auf benachbarten Ebenen werden randomisiert mit a2 Kanten verbunden. Die Quelle ist grün, die Senke rot. Tests Zuerst überprüfen wir, wie die Laufzeiteigenschaften der unterschiedlichen Imple- mentierungen der Adjazenzlisten sind. Wir nutzen dazu EdmondsKarp als Vergleichsalgorithmus, da seine Laufzeit unabhängig von der Kantenkapazität ist. Es wurden für die array-basierte, baum-basierte und randomisierte Version je 250 Durchläufe auf den Instanzen K1 bis K200 durchgeführt. Abbildung 4.14 zeigt die Ergebnisse. Mit der array-basierte Datenstruktur ist die Laufzeit am niedrigsten, gefolgt von der Variante mit dem Baum. Die langsamste Variante ist die randomisierte. Dies ist einerseits darauf zurückzuführen, dass durch die zufällige Wahl der nächsten Nachbarn ein Overhead entsteht. Andererseits besucht der Algorithmus von Edmonds und Karp die Knoten bereits in optimaler Reihenfolge. Alle folgenden Versuche werden nur mit der array-basierten Datenstruktur durchgeführt, sowie nicht anders gesagt wird. Es werden jedoch auch noch weitere Versuche mit randomisierten Algorithmen durchgeführt. Nun werden die verschiedenen Algorithmen untereinander verglichen. Als ersten Test vergleichen wir die die Algorithmen EdmondsKarp, FordFulkerson, Abs, AbsSP und 70 b 4.3 Empirische Ergebnisse s v11 v21 v31 v41 v12 v22 v32 v42 v13 v23 v33 v43 v14 v24 v34 v44 v15 v25 v35 v45 t Abbildung 4.13: Ein Beispiel einer Washington-Mesh-Instanz mit d1 = 5 Knoten pro Schicht und d2 = 4 Schichten. EdmondsKarp mit Array EdmondsKarp mit Baum EdmondsKarp randomisiert 7 6 Zeit (s) 5 4 3 2 1 0 20 40 60 80 100 120 140 160 180 Anzahl Knoten Abbildung 4.14: Einuss der Graph-Datenstruktur auf den Edmonds-Karp-Algorithmus. AbsOpt auf den vollständigen Graphen. Die maximale Knotenkapazität ist 500, sobald ein Algorithmus jedoch mehr als acht Sekunden für das berechnen einer Instanz benötigte, wurde er nicht mehr auf gröÿere Instanzen angewendet. Die Kantenkapazitäten sind in diesem Test gleichverteilt von 1 bis 1000. Für jede Instanz wurden 5 Durchläufe durchgeführt. Die Ergebnisse dieses Experiments sind in Abbildung 4.15 zu sehen. Der Algorithmus von Edmonds und Karp schneidet am besten ab, der nicht auf kürzesten Wegen beruhende Algorithmus von Ford und Fulkerson ist hier deutlich schlechter. Das gleiche Bild zeigt sich bei AbstractMaxFlowSP und AbstractMaxFlow. Hier ist die Variante mit kürzesten Wegen deutlich schneller als die Variante, die beliebige verletzende Pfade nutzt. Es zeigt sich auÿerdem, dass die Laufzeit von Abstract- 71 4 Der AbstractMaxFlow-Algorithmus MaxFlowSP starken Schwankungen unterliegt und für einzelne Läufe unter der Laufzeit von FordFulkerson liegt. Deutlich schneller, als FordFulkerson, aber noch nicht so gut, wie EdmondsKarp, ist AbstractMaxFlowOpt. Hier zeigt sich, dass die Optimierungen aus Abschnitt 4.1.2 die Laufzeit tatsächlich deutlich verbessern. FordFulkerson EdmondsKarp Abstract AbstractSP AbstractOpt 7 6 Zeit (s) 5 4 3 2 1 0 50 100 150 200 250 300 350 400 450 Anzahl Knoten Abbildung 4.15: Vergleich der verschiedenen Algorithmen mit der array-basierten Adjazenzliste. Alle Instanzen sind vollständige Graphen. Schwieriger ist die Lage bei den RMFGEN-Instanzen. Die Algorithmen wurden auf 6 Instanzen getestet, die in [2] benutzt werden. Drei dieser Instanzen sind sogenannte breite Instanzen, die aus wenigen Ebenen bestehen, aber in einer Ebene viele Knoten enthalten. Die anderen drei Instanzen sind sogenannte lange Instanzen, die viele Ebenen enthalten, aber in jeder Ebene relativ wenig Knoten. Die Parameter sind so gewählt, dass die breiten und langen Instanzen jeweils etwa gleich viele Knoten und Kanten enthalten. Die Kantenkapazität ist gleichverteilt zufällig aus dem Bereich von 0 bis 10000. Auf beiden Klassen ist EdmondsKarp der beste Algorithmus, wie zu erwarten war. Auf den breiten Instanzen ist jedoch der Algorithmus von Ford und Fulkerson deutlich besser als der abstrakte Algorithmus, auch in der optimierten Version. Bei den langen Instanzen ist die Reihenfolge genauso, wie bei den vollständigen Graphen. Auf sämtlichen Instanzen wurden 30 Durchläufe durchgeführt. Die Ergebnisse sind in der folgenden Tabelle zu sehen. Die Laufzeiten sind in Sekunden angegeben: 72 4.3 Empirische Ergebnisse Knoten Kanten EdmondsK. FordFulk. AbsOpt RMFGEN(16, 4) 1024 4608 0,57 1,98 14,58 RMFGEN(21, 5) 2205 10146 4,40 129,97 200,29 RMFGEN(28, 5) 3920 18256 16,71 320,38 1587,02 RMFGEN(6, 31) 1116 4800 0,53 8,00 5,84 RMFGEN(7, 42) 2058 9065 2,65 105,67 42,16 RMFGEN(8, 64) 4096 18368 12,64 653,68 289,70 Auf den Washington-Mesh-Graphen verhalten sich die Algoritmen so, wie auf den vollständigen Graphen und den langen RMFGEN-Instanzen. Getestet wurden Graphen mit d1 ∈ {3, 4, 5, 6, 7, 8} und d2 von 3 bis 100. Dabei wurden für jede Instanz 50 Durchläufe durchgeführt. Das Ergebnis ist in Abbildung 4.16 zu sehen. FordFulkerson EdmondsKarp AbstractOpt 7 6 Zeit (s) 5 4 3 2 1 0 d1 = 3 d1 = 4 d1 = 5 d1 = 6 d1 = 7 d1 = 8 Instanzen, d2 jeweils von 3 bis 100. Abbildung 4.16: Vergleich der verschiedenen Algorithmen mit der array-basierten Adjazenzliste auf den Washington-Mesh-Graphen. In einem nächsten Schritt wurden die randomisierten Versionen der abstrakten Algorithmen getestet. Hier wurden die gleichen Instanzen und Parameter wie beim obigen Test mit vollständigen Graphen verwendet. Das Ergebnis ist ziemlich eindeutig. Für den abstrakten Algorithmus ohne Optimierung, tritt die enorme Verschlechterung erst später ein, am generellen Verlauf der Kurve ändert sich jedoch nichts. Die Laufzeit des optimierten Algorithmus verschlechtert sich ein bisschen, er bleibt aber noch schneller als FordFulkerson. 73 4 Der AbstractMaxFlow-Algorithmus FordFulkerson EdmondsKarp Abstract Abstract(rnd) AbstractOpt AbstractOpt(rnd) 7 6 Zeit (s) 5 4 3 2 1 0 50 100 150 200 250 300 350 400 450 Anzahl Knoten Abbildung 4.17: Vergleich der Algorithmen zwischen der array-basierten Adjazenzliste und der randomisierten. Alle Instanzen sind vollständige Graphen. Ein weiterer Test überprüft, wie stark sich die Pseudopolynomialität auswirkt. Die Analyse hat ergeben, dass der Abstrakte Flussalgorithmus pseudopolynomiell ist. Auf den Standardbeispielen, auf denen der Algorithmus von Ford und Fulkerson pseudopolynomielles Verhalten zeigt, läuft er allerdings schneller. Als Testinstanz dient ein K100 , dessen Kantenkapazitäten ansteigen. Sie beginnen bei konstant 1. Die maximalen Kapazitäten √ werden nacheindander um den Faktor 2 erhöht, bis der Wertebereich überschritten ist. Die minimalen Kapazitäten wachsen langsamer, aber ebenfalls exponentiell, bis 8192. Es wurden jeweils 100 Instanzen generiert, auf denen die Algorithmen getestet worden sind. Das Ergebnis ist in Abbildung 4.18 zu sehen. Es zeigt sich, dass die Laufzeit von FordFulkerson stark wächst, während die Laufzeit AbstractOpt zu Beginn langsam wächst und anschlieÿend fast Konstant bleibt. Die Laufzeit von EdmondsKarp ist quasi Konstant, egal welche Kapazitäten genutzt werden, was auch so erwartet wird. Der letzte Test zeigt, wie sich die Anzahl der Iterationen in der Pfadsuche verringert. In AbsOpt werden die Iterationen in FindAugmentablePaths gezählt. Als Instanzen wurden vollständige gerichtete Graphen genutzt, mit Kapazitäten zufällig gleichverteilt im Bereich von 1 bis 1000. Gemittelt wurde über 5 Iterationen. Beim Übergang zu kürzesten Wegen tritt eine deutliche Verbesserung ein. Für die optimierte Version des abstrakten Algorithmus wird nur eine Iteration der Schleife ausgeführt. Wie schon bei der Laufzeit, zeigt AbstractSP hier eine groÿe Varianz. 74 4.3 Empirische Ergebnisse FordFulkerson EdmondsKarp AbstractOpt 6 Zeit (s) 5 4 3 2 1 0 23 26 29 212 215 218 221 Maximale Kantenkapazität Pfadsuchen pro Augmentierungsschritt Abbildung 4.18: Einuss der Kantenkapazitäten auf die Laufzeit. Instanz ist ein vollständiger gerichteter Graph mit 100 Knoten. Abstract AbstractSP AbstractOpt 60 50 40 30 20 10 0 39 77 116 154 193 232 270 309 347 Anzahl Knoten Abbildung 4.19: Vergleich der Iterationen der unterschiedlichen abstrakten Algorithmen. Instanzen sind vollständige gerichtete Graphen. 75 5 Zusammenfassung und Ausblick In dieser Arbeit wurde ein Algorithmus um Berechnen eines maximalen Flusses entwickelt und implementiert, der auf dem abstrakten Fluss-Algorithmus von McCormick basiert. Der abstrakte Algorithmus hat jedoch eine sehr hohe Laufzeit, da er pfadbasiert arbeitet und in jedem Iterationsschritt eine potenziell groÿe Menge neuer positiver Pfade hinzugefügt werden. Die Menge der positiven Pfade bleibt zwar polynomiell, es wird jedoch zusätzlich ein polynomielles Orakel benötigt, um neue verletzende Pfade zu berechnen. Der Algorithmus wurde auf kantenbasierte Netzwerke übertragen. Dadurch verringert sich der Aufwand, da keine positiven Pfade gespeichert werden müssen. Zusätzlich können bekannte Prinzipien, wie die Breitensuche, in Graphen genutzt werden, um Pfade zu nden. Die Laufzeit des Algorithmus ist pseudopolynomiell. Durch den zusätzlichen Aufwand (verglichen mit Algorithmen, die Rückwärtskanten nutzen) während des Augmentierungsschrittes, ist der Algorithmus in der Laufzeit nicht mit anderen bekannten und schnellen Algorithmen vergleichbar. Durch eine sinnvolle Implementierung konnte eine Version erstellt werden, die auf einigen Instanzen schneller arbeitet, als der normale Ford und Fulkerson-Algorithmus. In der Analyse in Abschnitt 4.2 haben wir einige Worst-Case-Beispiele gesehen. Sie zeigen, dass der Algorithmus pseudopolynomielle Laufzeit hat, auch wenn kürzeste Wege genutzt werden. Dies beantwortet für unsere Netzwerke die Frage, ob ein mächtigeres Orakel, das immer kürzeste Wege zurückgibt, zu einer polynomiellen Laufzeit führt. Die Beispiele sind jedoch komplizierter, als die von Ford und Fulkerson angegebenen Beispiele für ihren Algorithmus. In der Praxis zeigt sich auch, dass die Anzahl der Augmentierungsschritte zwar höher ist, als die Anzahl der Augmentierungsschritte des Algorithmus von Edmonds und Karp, dass sie jedoch deutlich geringer ist, als die vom Algorithmus von Ford und Fulkerson. Kantenkapazitäten haben einen deutlich geringeren Einuss auf die Laufzeit. Wir haben in der Analyse ebenfalls gesehen, dass der Algorithmus nicht terminiert, falls die Kapazitäten irrational sind. Die bekannten Beispiele reichen dafür jedoch nicht aus, auf ihnen terminiert der Algorithmus immer, falls er kürzeste Wege benutzt. Auch hier müssen die Beispiele deutlich komplizierter sein. Ein Beispiel von Zwick wurde abgewandelt, da in diesem Beispiel alle Pfade kürzeste Wege haben. Es ist noch kein Beispiel bekannt, auf dem der Algorithmus gegen einen nicht maximalen Wert konvergiert. In Abschnitt 4.2 wurde ein Verfahren vorgestellt, mit dem in Ω(n · √ n) n Augmentierungsschritten Kanten saturiert werden können. Die optimierte Version des kantenbasierten 77 5 Zusammenfassung und Ausblick abstrakten Fluss-Algorithmus aus 4.1.2 arbeitet auf dieser Instanz um eine Gröÿenordnung schneller, als die nicht optimierte Version. Auÿer diesen Optimierungen wurde keine weitere Verbesserung vorgenommen. In jedem Augmentierungsschritt werden die berechneten Mengen Lφ , Aφ und Tφ verworfen und neu berechnet. Es wird nicht beachtet, wie sich diese Mengen ändern, wenn eine Kante saturiert wird, oder wieder augmentierbar wird. Dadurch kann Laufzeit eingespart werden. Weiterhin können bekannte Prinzipien anderer Flussalgorithmen übernommen werden, um die Laufzeit zu senken. Ein Beispiel hierfür ist der Sperruss. Es ist nicht klar, ob es sowas wie einen abstrakten Sperruss gibt und wie ein solcher berechnet werden könnte. Der angegebene Algorithmus berechnet nur maximale Flüsse und nutzt das von Homan vorgegebene Szenario der abstrakten Flüsse nur eingeschränkt. Es existiert ein Algorithmus von Martens und McCormick, der die Möglichkeit zusätzlicher Gewichte auf den Pfaden nutzt. Eine konkrete Implementierung dieses abstrakten Fluss-Algorithmus auf einem kantenbasierten Netzwerk steht noch aus. 78 Notationsverzeichnis N Die Menge {1, 2, 3, . . .} N0 Die Menge N∪0 R Die Menge der reellen Zahlen. P(M ) Die Potenzmenge einer Menge |M | Anzahl der Elemente einer Menge v∈ Rn der natürlichen Zahlen. der natürlichen Zahlen und die Null. M. M. Ein Spaltenvektor. Ai Die AT Transponierte Matrix zu einer Matrix f |A Die Einschränkung einer Funktion ⊥ Uninitialisierte Variable oder Variable ohne Inhalt. ≡ Äquivalenzklasse bezüglich ganzzahliger Division mit Rest. mod i-te Zeile einer Matrix A. A. f :M →N auf den Denitionsbereich A ⊆ M. Der Rest einer ganzzahligen Division. 79 Literaturverzeichnis [1] Ahuja, Ravindra K., Thomas L. Magnanti und James B. Orlin: Flows: Theory, Algorithms, and Applications. [2] Badics, T. und E. Boros: Network Prentice Hall Inc., 1993. Implementing a Maximum Flow Algorithm: Experiments With Dynamic Trees. In: Johnson, David S. und Catherine C. McGeoch (Herausgeber): Network Flows and Matching: First DIMACS Implementation Challenge, DIMACS Series in Discrete Mathematics and Theoretical Computer Science, 12, Seiten 4363. American Mathematical Society, Providence, RI, 1993. [3] Cormen, Thomas K., Charles E. Leiserson, Ronald L. Rivest und Clifford Stein: Introduction to Algorithms. MIT Press, 2. Auflage, 2001. Maximization of a linear function of variables subject to linear inequalities. In: Koopmans, Tjalling. C. (Herausgeber): Activity Analysis of Production and Allocation, Cowles Commission Monograph No. 13, Kapitel XX, Seiten [4] Dantzig, George B.: 339347. Jon Wiley & Sons, Inc., New York, N. Y., 1951. On the Max-Flow Min-Cut Linear inequalities and related systems, Annals of Mathe- [5] Dantzig, George B. und Delbert R. Fulkerson: Theorem of Networks. In: matics Studies, no. 38, Seiten 215221. Princeton University Press, Princeton, N. J., 1956. Algorithms for Solution of a Problem of Maximum Flow in Networks with Power Estimation. Soy. Math. Doklady, 11:1277, 1970. [6] Dinic, Efim A.: [7] Edmonds, Jack und Richard M. Karp: Eciency for Network Flow Problems. Theoretical Improvements in Algorithmic Journal of the Association for Computing Machinery, 19(2):248264, 1972. [8] Elias, Peter, Amiel Feinstein und Claude E. Shannon: Flow Through a Network. Note on the Maximum Institute of Radio Engineers, Transactions on Information Theory, IT-2(December):117119, 1956. A Simple Algorithm for Finding Maximal Network Flows and an Application to the Hitchcock Problem. Canadian [9] Ford, Jr., Lester R. und Delbert R. Fulkerson: Journal of Mathematics., 9:210218, 1957. 81 Literaturverzeichnis [10] Ford, Lester R. Jr. und Delbert R. Fulkerson: work. Maximal Flow through a Net- Canadian Journal of Mathematics, 8:399404, 1956. [11] Ford, Lester R. Jr. und Delbert R. Fulkerson: Flows in Networks. Princeton University Press, Princeton, NJ, 1962. [12] Goldberg, Andrew V. und Satish Rao: Beyond the Flow Decomposition Barrier. Journal of the ACM, 45(5):783797, 1998. [13] Goldberg, Andrew V. Maximum-Flow Problem. und Robert E. Tarjan: A new Approach to the Journal of the Association for Computing Machinery, 35(4):921940, 1988. A Computational Comparison of the Dinic and Network Simplex Methods for Maximum Flow. Annals of Operations [14] Goldfarb, Donald und Michael D. Grigoriadis: Research, 13:83123, 1988. A Fast Algorithm for the Generalized Parametric Minimum Cut Problem and Applications. Algorithmica. An International [15] Gustfield, Dan und Charles Martel: Journal in Computer Science, 7(5-6):499519, 1992. A Polynomial Algorithm in Linear Programming. [16] Ha£ijan, Leonid G.: Akademii Nauk SSSR, 244(5):10931096, 1979. Doklady Englische Übersetzung: Soviet Ma- thematics Doklady, 20:191194, 1979. [17] Harris, T. E. und F. S. Ross: Capacities. Fundamentals of a Method for Evaluating Rail Net (The RAND Corporation Research Memorandum RM-1573), California, 1955. [18] Hassin, Refael: Maximum ow in (s, t) planar networks. Information Processing Letters, 13(3):107, 1981. [19] Henzinger, Monika R., Philip Klein, Satish Rao und Sairam Subramanian: Faster shortest-path algorithms for planar graphs. Journal of Computer and System Sciences, 55(1, part 1):323, 1997. 26th Annual ACM Symposium on the Theory of Computing (STOC '94) (Montreal, PQ, 1994). [20] Hoffman, Alan J.: A Generalization of Max Flow-Min Cut. Mathematical Pro- gramming, 6:352359, 1974. [21] Johnson, David S. und Catherine C. McGeoch (Herausgeber): and Matching: First DIMACS Implementation Challenge. Network Flows DIMACS Series in Discrete Mathematics and Theoretical Computer Science, 12. American Mathematical Society, Providence, RI, 1993. Papers related to the 1st DIMACS Challenge on Flows and Matching held at DIMACS October 1416, 1991. 82 Literaturverzeichnis [22] Karmarkar, Narendra B.: A New Polynomial-Time Algorithm for Linear Pro- gramming. Combinatorica. An International Journal of the János Bolyai Mathematical Society, 4(4):373395, 1984. [23] King, Valerie, Satish Rao und Robert E. Tarjan: ximum Flow Algorithm. A Faster Deterministic Ma- Journal of Algorithms, 17(3):447474, 1994. Third Annual ACM-SIAM Symposium on Discrete Algorithms (Orlando, FL, 1992). [24] Korthe, Bernhard und Jens Vygen: Combinatorial Optimization. Springer- Verlag, Berlin Heidelberg, 2008. [25] Malhotra, Vishv M., M. Pramodh Kumar und Shachindra. N. Maheshwari: An O(V 3 ) Algorithm for Finding Maximum Flows in Networks. Information Proces- sing Letters, 7(6):277278, 1978. [26] Martens, Maren und S. Thomas McCormick: Weighted Abstract Flow. In: [27] McCormick, S. Thomas: A Polynomial Algorithm for IPCO, Seiten 97111, 2008. A Polynomial Algorithm for Abstract Maximum Flow. UBC Faculty of commerce Working Paper 95-MSC-001, 1998. [28] Mehrotra, Sanjay: thod. On the Implementation of a Primal-Dual Interior Point Me- SIAM Journal on Optimization, 2(4):575601, 1992. [29] Monge, Gaspard: Mémoire sur la théorie des déblais et de remblais. Histoire de l'Académie Royale des Sciences, Année M. DCCLXXXI, avec les Mémoires de Mathématique et de Physique, pour la même année, Paris, 1781. [30] Schrijver, Alexander: Theory of Linear and Integer Programming. Wiley- Interscience Series in Discrete Mathematics and Optimization. John Wiley & Sons Ltd., Chichester, 1986. A Wiley-Interscience Publication. [31] Schrijver, Alexander: Flows in Railway Optimization. Nieuw Archief voor Wis- kunde. Vijfde Serie, 9(2):126131, 2008. An Introduction to Network Flows over Time. In: Cook, William J., László Lovász und Jens Vygen (Herausgeber): Research Trends in Combinatorial Optimization, Seiten 451482. Springer, 2009. [32] Skutella, Martin: [33] Sleator, Daniel D. und Robert E. Tarjan: A data structure for dynamic trees. Journal of Computer and System Sciences, 26(3):362391, 1983. [34] Wegener, Ingo: Komplexitätstheorie. Grenzen der Ezienz von Algorithmen. Sprin- ger, Berlin Heidelberg New-York, 2003. 83 Literaturverzeichnis The smallest networks on which the Ford-Fulkerson maximum ow procedure may fail to terminate. Theoretical Computer Science, 148, 1995. [35] Zwick, Uri: 84 Sachverzeichnis Augmentieren, 9 Orakel, 29 dual zulässige Lösung, siehe duales Pro- Pfad, 9, 16 augmentierend, 9 gramm negativ, 50 duales Programm, 6 Endknoten, siehe positiv, 50 Pfad Startknoten, 9 verletzend, 34 Fluss-Dekomposition, 11 Pfad-Dekomposition, 12 Graph, 7 abstrakter, 16 Kante, 7 ausgehende, 7 eingehende, 7 links, 9 rechts, 9 Quelle, 7 Rückwärtskante, 22 rechts, 16 Residualnetzwerk, 22 Restkapazität, 22 RMFGEN, 69 Kapazität, 7, 17 Schnitt, 13 Kn , Senke, 7 68 Knoten, 7 Startknoten, siehe Pfad Kreis, 9 Kreuzungsmenge, 16 lineares Programm, 5 links, 16 Mehrfachkante, 7 Multigraph, 7 trennende Menge, 13 v+, 7 v−, 7 Washington-Mesh, 69 Weg, 9 zulässige Lösung, Netzwerk, 7 siehe lineares Programm Netzwerkuss, 8 abstrakter, 17 85 Hiermit versichere ich, dass ich die vorliegende Arbeit selbstständig verfasst habe und keine anderen als die angegebenen Quellen und Hilfsmittel verwendet sowie Zitate kenntlich gemacht habe. Herten, den 20. 07. 2009 Jan-Philipp Kappmeier