Minimum Cost Flow Grundlagen und erste Algorithmen Philip Ralph Weber 22.12.2005 1 1 Grundlagen 1.1 Voraussetzungen Sei G=(V,E) ein gerichteter Graph. cij bezeichne die Kosten für der Kante (i, j) ∈ E C := max(i,j)∈E cij uij bezeichne die Kapazität der Kante (i, j) ∈ E U := max(i,j)∈E uij Für jeden Knoten i ∈ V sei b(i) dessen Supply-Wert b(i) > 0 =⇒ i ist Supply-Knoten b(i) = 0 =⇒ i ist Transport-Knoten b(i) < 0 =⇒ i ist Demand-Knoten 1.2 Definition: Feasible Flow Eine Flußfunktion x : E → N heißt feasible (legal), wenn gilt • Kapazitätsbedingung 0 ≤ xij ≤ uij • Massenbalancebedingung X xij − {j:(i,j)∈E} 1.3 X ∀i ∈ V xki = b(i) {k:(k,i)∈E} Definition: Kosten einer Flußfunktion Sei x ein feasible flow, dann sind c(x) = 1.4 ∀(i, j) ∈ E P (i,j)∈E cij · xij die Kosten von x Definition: Minimum Cost Flow Problem Das Minimum Cost Flow Problem besteht darin, einen feasible flow mit minimalen Kosten zu finden. Man minimiert also die Funktion X c(x) = cij · xij (i,j)∈E unter folgenden Bedingungen: 0 ≤ xij ≤ uij X {j:(i,j)∈E} xij − ∀(i, j) ∈ E X xki = b(i) {k:(k,i)∈E} 2 ∀i ∈ V 1.5 Annahmen 1. Alle Daten sind ganzzahlig 2. Das Netzwerk (Graph) ist gerichtet P 3. Es gilt i∈V b(i) = 0 und das MCF Problem hat eine Lösung 4. Es gilt cij ≥ 0 für alle (i, j) ∈ E 5. Außerdem sollte jeder Knoten i ∈ V von einem anderen Knoten aus erreichbar sein. 1.6 Definition: Restnetzwerk Die später vorgestellten Algorithmen beziehen sich auf das Restnetzwerk G(x) von G mit dem Fluß x. Das Restnetzwerk läßt sehr leicht erkennen, über welche Kanten man noch wie viele Flußeinheiten verschieben kann. Jede Kante (i, j) ∈ E wird durch zwei Kanten (i, j), (j, i) ersetzt. (i, j) hat die Kosten cij und die Restkapazität rij = uij − xij (j, i) hat die Kosten cji = −cij und die Restkapazität rji = xij Das Restnetzwerk besteht außerdem nur aus Kanten mit positiver Restkapazität, d.h. Kanten mit Restkapazität 0 werden aus dem Restnetzwerk gelöscht. 1.6.1 Beispiel i (xij , uij ), cij j (rij , cij ) i 2 2 (1, 2) (3, 4), 2 1 j (3, −2) (0, 2), 1 (2, 1) 1 (2, −2) (2, 2), 2 3 3 (1,2) 3 von 4 möglichen Einheiten fließen von Knoten 1 nach Knoten 2. Dies hat zur Folge, daß sowohl die Kante (1,2) als auch die Kante (2,1) ins Restnetzwerk aufgenommen werden (1,3) Diese Kante ist voll saturiert, deshalb wird nur die Gegenkante ins Restnetzwerk aufgenommen 3 (2,3) Hier ist es genau umgekehrt zu (1,3). Es fließen keine Einheiten von Knoten 2 zu Knoten 3, dehalb wird nur die ursprüngliche Kante im Restnetzwerk erscheinen 2 Anwendung Bei Minimum Cost Flow Problemen geht es darum, Einheiten auf möglichst optimale Art und Weise zwischen mehreren Standorten zu verteilen. Diese Problematik gibt es in fast allen Industrien. Beispiele hierfür sind: • Kommunikation • Transport 2.1 Beispiel: Das Transportproblem Ein Autohersteller hat mehrere Produktionsstandorte und produziert an diesen unterschiedliche Modelle. Auf der anderen Seite stehen die Autohäuser, in denen die Autos verkauft werden. Diese benötigen einen ständigen Nachschub neuer Autos. Aufgabe ist es, die Nachfrage der Autohäuser zu befriedigen und dabei die Gesamtkosten (Herstellungskosten, Transportkosten, ...) zu minimieren. Ein Graph eines solchen Problems könnte beispielsweise wie folgt aussehen: Autohaus 1 Produktion 1 a 1 m1 p 1 m1 p1 a 1 m2 a1 p 1 m2 a 1 m3 Produktion 2 Autohaus 2 p 2 m1 a 2 m1 p2 p 2 m2 a2 a 2 m2 p 2 m3 4 Knotentypen 1. Produktionsknoten (p1 , p2 ): symbolisieren die Produktionsstätten 2. Produktion-Modell-Knoten (p1 m1 , p1 m2 , ...): stehen für das Modell und seinen Produktionsort 3. Autohaus-Modell-Knoten (a1 m1, ...): zeigen an, welche Modelle das Autohaus nachfragt 4. Autohausknoten (a1 , a2 ): symbolisieren die Autohäuser Kantentypen 1. Produktionskanten (Produktionsknoten – Produktion-Modell-Knoten): • Kosten: Produktionskosten eines bestimmten Modells an einem bestimmten Standort • Kapazität: Obere und untere Schranke der Produktion eines Modells an einem Standort 2. Transportkanten (Produktion-Modell-Knoten – Autohaus-Modell-Knoten): • Kosten: Transportkosten für ein Auto zu einem Autohaus • Kapazität: Obere Schranke für maximal möglichen Transportfluß. Untere Schranke aufgrund von Verträgen mit den Transportunternehmen. 3. Nachfragekanten (Autohaus-Modell-Knoten – Autohaus-Knoten): • Kosten: Die Kosten dieser Kanten sind gleich Null • Kapazität: Untere Schranke für die Nachfrage eines Autohauses nach einem bestimmten Modell 5 3 Optimalitätsbedingungen 3.1 Negative Cycle Optimality 3.1.1 Satz: Negative Cycle Optimality Ein feasible flow x ist genau dann eine optimale Lösung des MCF Problems, wenn das Restnetzwerk G(x) keinen Kreis mit negativen Kosten enthält. Beweis: “⇒“ Angenommen x ist ein feasible flow und G(x) enthält einen negativen Kreis. Dann ist x nicht optimal, da mit Flußerhöhungen entlang des negativen Kreises die Kosten gesenkt werden könnten, ohne daß x non-feasible würde.Daraus folgt: x ein optimaler Fluß ⇒ G(x) enthält keinen negativen Kreis “⇐“ Angenommen x ist ein feasible flow und enthält keinen negativen Kreis. Sei nun x∗ ein optimaler Fluß mit x 6= x∗ . Da beide Flüsse feasible sind, haben sie den gleichen Flußwert, folglich muß x∗ − x eine Flußzirkulation sein. x∗ − x kann also in Kreise zerlegt werden. Wichtig ist, daß diese Kreise auch in G(x) liegen und daß die Summe der Kosten der Flüsse auf diesen Kreisen gleich c(x∗ ) − c(x) ist. (vorige Kapitel) Da alle Kreise in G(x) nicht-negativ sind, gilt c(x∗ )−c(x) ≥ 0 oder c(x∗ ) ≥ c(x). Aus der Optimalität von x∗ folgt andererseits c(x∗ ) ≤ c(x). Insgesamt folgt c(x∗ ) = c(x) und damit ist x optimal. 3.2 3.2.1 Reduced Cost Optimality Definition: Potential, Reduzierte Kosten Die Potentialfunktion π : V → R assoziiert mit jedem Knoten i ∈ V eine Zahl π(i), das Potential von i. Die Reduzierten Kosten einer Kante (i, j) ∈ E sind dann definiert durch cπij = cij − π(i) + π(j) 3.2.2 Eigenschaften der Reduzierten Kosten • Sei P ein Pfad von v nach w, dann gilt: X X cπij = − cij (i,j)∈P (i,j)∈P | {z } Kosten des Pfades π(v) + π(w) |{z} | {z } Potential des Anfangsknotens Potential des Endknotens Die Reduzierten Kosten von P sind gleich den Kosten von P minus dem Potential des Anfangsknotens plus dem Potential des Endknotens. • Für jeden Kreis W gilt: X cπij = (i,j)∈W X (i,j)∈W 6 cij Für einen Kreis sind die Reduzierten Kosten gleich den Originalkosten. 3.2.3 Satz: Reduced Cost Optimality Sei x ein feasible flow. x ist optimal genau dann, wenn es ein Potential π gibt, so daß für alle Kanten (i, j) in G(x) gilt: cπij ≥ 0 Beweis: “⇐:“ Annahme: ∃ Potential π mit cπij ≥ 0 ∀(i, j) ∈ G(x). Daraus folgt: – alle Kreise in G(x) haben bzgl. der Reduzierten Kosten keine negativen Kosten – auch bzgl. der Originalkosten enthält G(x) keine negativen Zyklen Mit der Negative Cycle Optimality folgt die Optimalität von x. “⇒:“ Sei x eine Lösung des MCF Problems (feasible und optimal). z.z.: ∃ Potential π mit cπij ≥ 0 ∀(i, j) ∈ G(x) Sei d : V → R die Distanzlabelfunktion bzgl. der Kantenkosten c : E → R mit beliebigem Startknoten s ∈ G(x). Aus der Negative Cycle Optimality folgt, daß es keine negativen Kreise in G(x) gibt und daß die Funktion d wohldefiniert ist. Außerdem gilt für d: d(j) ≤ d(i) + cij ∀(i, j) ∈ G(x) ⇔ cij − (−d(i)) + (−d(j)) ≥ 0 ⇔ cπij ≥ 0 für π = −d Der Beweis zeigt also auch direkt eine Methode zur Bestimmung eines Potentials π für einen optimalen Fluß auf. 3.3 Complementary Slackness Optimality Die Complementary Slackness Optimality bezieht sich anders als die beiden vorangegangenen Optimalitätsbedingungen auf das Originalnetzwerk und nicht auf das Restnetzwerk. 3.3.1 Satz: Complementary Slackness Optimality Sei x ein feasible flow. x ist optimal genau dann, wenn es ein Knotenpotential π gibt, so daß für alle (i, j) ∈ E gilt: (1) cπij > 0 ⇒ (2) 0 < xij < uij (3) cπij < 0 ⇒ xij = 0 ⇒ cπij = 0 xij = uij Beweis: 7 “⇒:“ Sei x ein optimaler Fluß Aus der Reduced Cost Optimality folgt: ∃ Potential π : V → R mit cπij ≥ 0 für alle Kanten (i, j) in G(x). Hieraus folgern wir nun die drei obigen Bedingungen: / G(x), da cπji = −cπij < 0. (1) Falls cπij > 0 ⇒ (j, i) ∈ Also folgt xij = 0. (2) Falls 0 < xij < uij , dann sind (i, j) und (j, i) in G(x). Mit der Reduced Cost Optimality folgt cπij ≥ 0 und cπji ≥ 0 Zusammen mit cπij = −cπji folgt cπij = cπji = 0 (3) Falls cπij < 0 so folgt aus der Reduced Cost Optimality, daß (i, j) nicht in G(x) ist. Daraus folgt xij = uij “⇐:“ Sei π so gegeben, daß (1), (2) und (3) für alle (i, j) ∈ E erfüllt sind. Z.z.: cπij ≥ 0 ∀(i, j) ∈ G(x) (a) Sei cπij > 0 so erfüllt die Kante (i, j) die Reduced Cost Optimality falls sie überhaupt in G(x) ist. Da xij = 0, ist die Kante (j, i) nicht in G(x), also ist für sie nichts zu zeigen. (b) 0 < xij < uij und cπij = cπji = 0 ⇒ (i, j) ∈ G(x) und (j, i) ∈ G(x) erfüllen die Reduced Cost Optimality. (c) cπij < 0 und xij = uij ⇒ (i, j) ∈ / G(x) aber (j, i) ∈ G(x) cπji = −cπij > 0 ⇒ (j, i) erfüllt die Reduced Cost Optimality. 8 4 Der Cycle Canceling Algorithmus Die Negative Cycle Optimality legt einen von der Idee her simplen Algorithmus zur Lösung des Minimum Cost Flow Problems nahe, den Cycle Canceling Algorithmus. Dieser Algorithmus berechnet zuerst einen feasible flow x. Dazu wird folgendes Maximum Flow Problem gelöst: b(i1 ) b(i2 ) i1 Transport-Knoten j1 j2 i2 −b(j1 ) −b(j2 ) s t b(ip ) −b(jq ) ip jq Supply-Knoten Demand-Knoten Bevor man den Maximum Flow berechnet, muss das Netzwerk wie folgt abgeändert werden: 1. füge 2 Knoten s und t hinzu 2. füge Kanten (s, i) mit usi = b(i) für alle i ∈ V mit b(i) > 0 hinzu 3. füge Kanten (j, t) mit ujt = −b(j) für alle j ∈ V mit b(j) < 0 hinzu 4. berechne einen Max Flow von s nach t Falls der Fluss x alle ausgehenden Kanten aus s saturiert, so ist ein feasible flow x gefunden worden. Anschließend werden negative Kreise im Restnetzwerk G(x) ausfindig gemacht. Diese werden durch Flußerhöhungen eliminiert. Der Algorithmus terminiert, wenn im Restnetzwerk keine negativen Kreise mehr vorhanden sind. Nach der Negative Cycle Optimality ist also ein Minimum Cost Flow gefunden worden. 9 4.1 Implementierung Cycle Canceling Algorithmus begin erzeuge einen feasible flow x im Netzwerk; while G(x) enthält einen negativen Kreis do begin finde einen negativen Kreis W in G(x); δ = min {rij : (i, j) ∈ W }; erhöhe den Fluß entlang W um δ Einheiten; end; end; 4.2 Beispiel i (xij , uij ), cij 2 (3, 4), 2 b(1) = 4 1 j b(2) = 0 (0, 2), 1 (1, 2) 4 b(4) = −4 (2, 1) 1 (1, 2) (1, −1) b(3) = 0 3 2 (1, 2) (2, 3) (2, 2) (3, −2) (1, −3) (2, −1) (1, 2) (3, 3) (2, −2) 4 1 (2, 1) (1, −2) 4 (4, 1) (1, −2) 2 1 (3, −3) (3, −2) (1, 5), 1 3 j 2 (3, 3), 3 (1, 2), 2 (rij , cij ) i (2, −1) (1, 1) (2, −2) (3, −1) 3 (4, −1) 3 10 4 Das erste Bild zeigt das Netzwerk G mit einem feasible flow x. Im ersten Schritt wird nun das Restnetzwerk G(x) konstruiert. In diesem gibt es einen negativen Kreis W1 = {(2, 3), (3, 4), (4, 2)} mit Kosten P (i,j)∈W1 cij = −1 und δ = 2. Der Algorithmus erhöht den Fluß entlang des negativen Kreises W1 um δ Einheiten. Somit verringern sich die Gesamtkosten um 2 Einheiten. Im Restnetzwerk G(x) wird einPweiterer negativer Kreis W2 = {(1, 3), (3, 4), (4, 2), (2, 1)} gefunden. Dieser hat Kosten (i,j)∈W2 cij = −2 und δ = 1. Wieder erhöht der Algorithmus den Fluß entlang dieses Kreises um δ Einheiten, wodurch die Gesamtkosten um 2 Einheiten gesenkt werden können. Nach diesem Schritt enthält das Restnetzwerk G(x) keinen negativen Kreis mehr. Mit der Negative Cycle Optimality folgt die Optimalität des Flusses x. 4.3 Satz: Integrality Property Wenn alle Kantenkapazitäten und Supply-Werte der Knoten ganzzahlig sind, so ist der Minimum Cost Flow auch ganzzahlig. Beweis: Induktion über die Zahl der Iterationen: • Induktionsanfang: Der Algorithmus berechnet zuerst einen feasible flow, indem er das Maximum Flow Problem löst. Wichtig ist, daß es einen ganzzahligen feasible flow gibt und daß der Maximum Flow Algorithmus eine solche ganzzahlige Lösung findet. Davon kann ausgegangen werden, da alle Kantenkapazitäten und Restkapazitäten ganzzahlig sind. Somit ist der Fluß zu Beginn des Algorithmus’ ganzzahlig. • Induktionsvoraussetzung: Der Fluß ist in der n-ten Iteration ganzzahlig, folglich sind es auch die Restkapazitäten im Restnetzwerk. • Induktionsschritt: In der n-ten Iteration erhöht nun der Cycle Canceling Algorithmus den Fluß entlang eines negativen Kreises um die minimale Restkapazität in diesem Kreis. Diese ist nach Induktionsvoraussetzung ganzzahlig. Somit werden die modifizierten Restkapazitäten in der (n+1)ten Iteration wiederum ganzzahlig sein. 4.4 Laufzeitanalyse Beobachtungen: 1. Der Algorithmus erhöht den Fluß entlang eines negativen Kreises in jeder Iteration um mindestens 1 Einheit. Die Kosten des negativen Kreises sind ≤ −1. ⇒ Jede Iteration vermindert die Gesamtkosten um mindestens 1 Einheit. 2. Höhe der Gesamtkosten: (a) obere Schranke: m·C·U mit C := max(i,j)∈E |cij | und U := max(i,j)∈E uij (b) untere Schranke: −m · C · U Die Gesamtkosten haben folglich die Größe O(m · C · U ) 11 Aus den beiden Beobachtungen folgt also, daß der Cycle Canceling Algorithmus O(m · C · U ) Iterationen durchläuft. Die Laufzeit einer Iteration wird dabei von der Identifizierung eines negativen Kreises dominiert (Bellman/Ford: O(n · m)). Folglich ergibt sich für den generischen Cycle Canceling Algorithmus eine Laufzeit von O(n · m2 · C · U ). 4.4.1 Schlußbemerkung Die generische Variante des Cycle Canceling Algorithmus’ sieht keine Reihenfolge vor, in der die negativen Kreise ausgewählt werden. Durch die Vorgabe einer bestimmten Reihenfolge kann der Algorithmus abgeändert werden. Dies führt zu verschiedenen Versionen des Cycle Canceling Algorithmus’, die jeweils andere Laufzeiten haben. Ein Beispiel hierfür ist der Simplex Algorithmus. 5 Der Successive Shortest Path Algorithmus Der Cycle Canceling Algorithmus startet mit einem feasible flow x und versucht diesen zu optimieren. Im Gegensatz dazu startet der Successive Shortest Path Algorithmus mit einem sogenannten pseudo flow, der zwar optimal ist und die Kapazitätsbedingungen erfüllt, allerdings die Massenbalancebedingungen der Knoten verletzt (nicht feasible). Der Algorithmus versucht nun diesen pseudo flow so abzuändern, daß die Optimalität erhalten bleibt und die Massenbalancebedingungen nicht mehr verletzt werden. 5.1 Definition: Pseudo Flow, Excess Ein pseudo flow ist eine Funktion x : E → N , die nur die Kapazitätsbedingung erfüllt. Sie muß aber nicht die Massenbalancebedingung erfüllen. (siehe Definition: Feasible Flow). Für jeden pseudo flow x ist der Excess wie folgt definiert: e(i) = b(i) + |{z} Supply von i X xji X − {z } | Eingänge in Knoten i {z } | Ausgänge aus Knoten i • e(i) > 0 i ist ein Excess-Knoten (hat zu viel) • e(i) < 0 i ist ein Demand-Knoten (hat zu wenig) • e(i) = 0 i ist balanciert 12 xij {j:(i,j)∈E} {j:(j,i)∈E} 5.1.1 Beobachtungen Sei E = {i ∈ V |e(i) > 0} und D = {i ∈ V |e(i) < 0} P P • i∈V b(i) = 0 i∈V e(i) = P P • i∈D e(i) i∈E e(i) = − Hieraus folgt: Hat das Netzwerk einen Excess-Knoten, so muß es auch einen Demand-Knoten haben. 5.2 Lemma Sei x ein (pseudo-) flow, der die Reduced Cost Optimality bzgl. eines Potentials π erfüllt (cπij ≥ 0 für alle (i, j) ∈ G(x)). Sei d : V → N eine Shortest-Path-Distanzfunktion in G(x) von einem Knoten s aus mit den reduzierten Kosten cπij als Länge einer Kante (i, j). Dann gilt: 1. Der pseudo flow x erfüllt die Reduced Cost Optimality auch bzgl. des Potentials π 0 = π − d. 0 2. Die reduzierten Kosten cπij sind gleich Null für alle Kanten (i, j) auf einem kürzesten Pfad. Beweis: 1. Da x die Reduced Cost Optimality bzgl. des Potentials π erfüllt gilt: cπij ≥ 0 für alle (i, j) ∈ G(x) Da d die Shortest-Path-Distanzen mit cπij als Kantenlängen darstellt, gilt folgende Shortest-Path-Optimalitätsbedingung: d(j) ≤ d(i) + cπij für alle (i, j) ∈ G(x) Durch das Einsetzen der Definition cπij = cij − π(i) + πj in die obige Ungleichung erhalten wir: d(j) ≤ d(i) + cij − π(i) + π(j) ⇔ 0 ≤ cij − (π(i) − d(i)) + (π(j) − d(j)) {z } | {z } | π 0 (i) ⇔ für alle (i, j) ∈ G(x) 0 cπij ≥ 0 für alle (i, j) ∈ G(x) π 0 (j) für alle (i, j) ∈ G(x) 2. Sei nun ein Shortest Path von s zu einem Knoten l gegeben. Für jede Kante (i, j) auf diesem Pfad gilt d(j) = d(i) + cπij . Ersetzt man wie oben 0 cπij = cij − π(i) + π(j), so ergibt sich analog cπij = 0 für alle Kanten (i, j) auf diesem Pfad. 13 5.3 Lemma Angenommen ein (pseudo-) flow x erfüllt die Reduced Cost Optimality bzgl. eines Potentials π. Wenn wir nun x abändern, indem wir Fluß entlang eines Shortest Path von einem Knoten s zu einem Knoten k versenden, so erhalten wir einen neuen Fluß x0 . Dieser Fluß x0 erfüllt nun ebenfalls die Reduced Cost Optimality bzgl. des Potentials π 0 = π − d. Beweis: 0 Aus dem vorigen Lemma wissen wir, daß cπij = 0 für jede Kante (i, j) auf dem Shortest Path P von s nach k ist. Flußerhöhungen auf einer dieser Kanten können u.U. bewirken, daß die Gegen0 0 kante (j, i) in G(x) eingefügt wird. Da aber cπji = −cπij = 0 für jede Kante auf P ist, bleibt die Reduced Cost Optimality bzgl. π 0 erhalten. 5.4 Implementierung Successive Shortest Path Algorithmus begin x = 0 und π = 0; e(i) = b(i) für alle i ∈ V ; initialisiere E = {i ∈ V |e(i) > 0} und D = {i ∈ V |e(i) < 0}; while E 6= ∅ do begin wähle k ∈ E und l ∈ D; berechne Shortest-Path-Distanzen d bzgl. der red. Kosten cπij ; sei P ein Shortest Path von k nach l; π = π − d; aktualisiere die reduzierten Kosten cπij δ = min {e(k), −e(l), min {rij |(i, j) ∈ P }}; erhöhe den Fluß entlang von P um δ Einheiten; aktualisiere x, G(x), e, E, D; end; end; 14 5.5 Beispiel Wir benutzen das selbe Beispiel wie beim Cycle Canceling Algorithmus. e(i) π(i) i (rij , cπij ) 2 e(j) π(j) 0 0 (4, 2) 4 0 1 j (3, 3) (2, 1) (2, 2) • G(x) am Anfang mit x = 0 und π = 0 4 -4 0 • E = {1} und D = {4} (5, 1) • k = 1 und l = 4 • d = (0, 2, 2, 3) 0 3 0 2 0 -2 (4, 0) 4 0 1 • P = (1, 3, 4) • aktualisiere π = π − d (3, 2) (2, 1) (2, 0) • aktualisiere cπij = cπij − (d(j) − d(i)) 4 -4 -3 • δ=2 (5, 0) • erhöhe Fluß entlang P um δ Einheiten 0 3 -2 2 0 -2 (4, 0) 2 0 1 (3, 2) (2, 1) (2, 0) (3, 0) • aktualisiere G(x) und e(i) 4 -2 -3 • E = {1} und D = {4} • k = 1 und l = 4 (2, 0) • d = (0, 0, 1, 1) 0 3 -2 15 2 0 -2 (4, 0) 2 0 1 • P = (1, 2, 3, 4) • aktualisiere π = π − d (3, 1) (2, 0) (3, 0) (2, 1) • aktualisiere cπij = cπij − (d(j) − d(i)) 4 -2 -4 • δ=2 (2, 0) • erhöhe Fluß entlang P um δ Einheiten 0 3 -3 0 2 -2 (2, 0) 0 0 1 (3, 1) (2, 0) (2, 0) (2, 1) 4 0 -4 (1, 0) (4, 0) 0 3 -3 5.6 • E = ∅ und D = ∅ ⇒ Algorithmus terminiert Laufzeitanalyse Der Rumpf der Hauptschleife wird dominiert von der Berechnung der ShortestPath-Distanzen bzgl. cπij im Restnetzwerk G(x). Der Dijkstra-Algorithmus liefert hierfür eine Laufzeit von O(n · log n + m). In jeder Iteration wird mindestens 1 Einheit Fluß von einem Knoten in E zu einem Knoten in D verschoben. Folglich wird der Gesamtüberschuß mindestens um 1 Einheit vermindert. Sei U = max {|b(i)| : i ∈ V }, dann ist der Gesamtüberschuß maximal n · U . Somit ist die Laufzeit des Successive Shortest Path Algorithmus: O(n · U · (n · log n + m)) 16