Flüsse mit minimalen Kosten - Ein paar Grundlagen ∗ Andreas. W. Günther Juni 2003 ∗ basieren auf dem Netzwerkbuch ... 1 Inhaltsverzeichnis 1 Einführung 1.1 Was ist das Problem mit dem Fluß minimaler Kosten ? 1.2 Anwendung(en) . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Planung von Versorgungsleitungen . . . . . . . 1.2.2 Transport-Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 3 2 Theorie 2.1 Vorraussetzungen, Annahmen und Schreibweisen . 2.1.1 Definitionen . . . . . . . . . . . . . . . . . 2.1.2 Annahmen . . . . . . . . . . . . . . . . . . 2.2 Optimalitätsbedingungen . . . . . . . . . . . . . . 2.2.1 Negative-Cycle-Optimalitätsbedingung . . 2.2.2 Reduzierte-Kosten-Optimalitätsbedingung 2.2.3 Komplementärer Schlupf . . . . . . . . . . 2.3 Dualität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 7 10 10 11 12 14 3 Algorithmen 3.1 Ansätze für Algorithmen . . . . . . . . . . . . . 3.1.1 Der Cycle-Cancel-Algorithmus . . . . . . 3.1.2 Wiederholte Kürzeste Wege Algorithmus 3.2 Praktischere Algorithmen . . . . . . . . . . . . 3.2.1 Capacity Scaling -Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 17 17 18 21 21 . . . . . A Anmerkungen A.1 zu den Annahmen . . . . . . . . . . . . . . . . . . . . . . . . . A.1.1 Elimination der unteren Kapazitätsschranken . . . . . A.1.2 Überprüfung, ob ein Netzwerk einen zulässigen Fluss hat 24 24 24 25 Liste der Algorithmen 3.1.1 Generischer Cycle-Canceling Algorithmus . . . . . . . . . . . . 17 3.1.2 Wiederholte-Küzeste-Wege-Alogrithmusses . . . . . . . . . . . 20 3.2.1 Capacity-Scaling-Algorithmus . . . . . . . . . . . . . . . . . . 22 2 1 Einführung 1.1 Was ist das Problem mit dem Fluß minimaler Kosten ? Die Problemstellung beim MinCostFlow-Problem ist, dass man einen Fluß über einen Graphen schicken will, aber jede Einheit Fluss auf einem Weg Kosten verursacht. Also ist man gezwungen auf der einen Seite einen Fluss fliessen zu lassen, der die Nachfrage von Knoten mit dem Angebot anderer Knoten befriedigt. Auf der anderen Seite sollen aber die Kosten minimal sein. Ausserdem wird sehr häufig noch eine Kapazitierung der Kanten bei der Modellierung benötigt, sodass dieses beim MinCostFlow-Problem durchaus mitzuberücksichtigen ist. Man sieht schnell zwei Teile in diesem Problem: 1. Das Finden kürzester (billigster) Wege von einem Knoten s zu allen anderen. 2. Das Finden von maximalen Flüsse d.h. Flüsse die die Kapazitätsschranken maximal gut ausnutzen. Diese beiden Teile lassen sich durch geeignete Wahl der Daten als MinCostFlowProblem modellieren, aber auch auf anderem Wege sehr effizient lösen. In der Kombination jedoch wird daraus ein sehr komplexes Problem, das nur bei genauer Betrachtung mit (pseudo-)polynomielle Algorithmen zu lösen ist. 1.2 1.2.1 Anwendung(en) Planung von Versorgungsleitungen Die Formulierung ”Fluss” assoziiert direkt ein mögliches Anwendungsgebiet: Modellierung von Versorgungsleitungen wie z.B. Gas- und Wasserversorgung. Hier gibt es ”Produktions”-Stätte (Wasserquelle, Aufbereitungsanlagen, u.ä.) und Verbraucher (Fabriken, Haushalte, u.ä.) und auch irgendwelche Verteiler, die nichts verbrauchen. Die Kantenkosten wären hier dann z.B. die Kosten für den Bau von neuen Leitungen verteilt auf den geschätzten Fluss bis die Leitung erneuert werden muss und der Knotenverbrauch bzw. das Knotenangebot jeweils die geschätzte Menge in der betrachteten Zeit. Das MinCostFlow-Problem löst dann die Frage, welche Leitungen man am besten bauen soll, um Angebot und Nachfrage zu befriedigen. 1.2.2 Transport-Problem Die Formulierung von Angebot und Nachfrage von Knoten impliziert ein sehr großes Anwendungsgebiet: die Wirtschaft. Tatsächlich lassen sich einige 3 wirtschaftliche Probleme als MinCostFlow-Problem modellieren. Z.B. haben alle Fabriken das Problem, das sie Produkte herstellen und diese natürlich auch verkaufen wollen wozu sie irgendwie zu dem Kunden kommen müssen. Das (einfache) Modell ist jetzt, das es einen oder mehrere Produzenten gibt und einen oder mehrere Abnehmer (Geschäfte, Endkunden, o.ä.). Die Ware muss also vom Produzenten zum Abnehmer gelangen und dieser Transport sollte möglichst wenig kosten. Da es aber normalerweise viele Wege zwischen den Lieferanten und den Abnehmern gibt, und die Wege jeweils andere Kosten haben, sieht man hier, dass man irgendwie einen kostengünstigen Warenfluss von den Lieferanten zu den Abnehmern finden muss, der dazu noch jedem Abnehmer alle geforderten Warenmengen bereitstellt und auch die Produktionskapazität der Lieferanten auslastet. Abbildung 1: Transport-Problem Erweitert wird dieses Problem, wenn z.B. Zwischenhändler ins Spiel kommen, die mehr Waren kaufen, wie sie brauchen und den Überschuss dann weiter verkaufen oder wenn es darum geht mehr als nur eine Ware zu transportieren. 4 2 2.1 Theorie Vorraussetzungen, Annahmen und Schreibweisen Zuerst einmal die Sprache für die nachfolgenden, meist mathematischen Optimalitätsbedingungen. 2.1.1 Definitionen Definition 1 (Netzwerk) Ein (ungerichter) Graph G = (V, E) mit Knotenmenge V , Kantenmenge E, den Kosten cij , den untere bzw. obere Kapazitätsschranke lij bzw. uij für jede Kante (i, j) ∈ E und für jeden Knoten i ∈ V bi die Nachfrage ( bi < 0 ) bzw. das Angebote ( bi < 0 ) heißt (ungerichtetes) Netzwerk. Abbildung 2: Definition des Netzwerks im Bild Damit kann das MinCostFlow-Problem beschrieben werden durch folgendes Minimierungsproblem: 5 LP 1 M inimiere z(x) = X cij xij (i,j)∈E s.t. X xij − {j:(i,j)∈E} X xij = bi ∀i ∈ V (1a) ∀(i, j) ∈ E (1b) {j:(j,i)∈E} lij ≤ xij ≤ uij bzw. wenn A die Knoten-Kanten-Inzidenzmatrix vom Netzwerk G ist: LP 2 min z(x) = cT x s.t. Ax = b l≤x≤u (2a) (2b) Dabei ist Teil a) der LPs die Flusserhaltungs-Gleichung und Teil b) die Kapazitätsbedingung. Als Ergebniss des MinCostFlow-Problems sind dabei nur Flüsse interessant, die beide Teile erfüllen. Genauer: Definition 2 Ein Fluss x heißt zulässig genau dann, wenn gilt X X xij − xij = bi {j:(i,j)∈E} ∀i ∈ V {j:(j,i)∈E} lij ≤ xij ≤ uij ∀(i, j) ∈ E Falls jetzt ein solcher Fluss noch minimal ist, ist er eine Lösung des Problems: Definition 3 Ein zulässiger Fluss x heißt optimal genau dann, wenn für alle zulässigen Flüsse x0 gilt cx ≤ cx0 Weiterhin ist die Änderung von Flüssen interessant: Definition 4 Eine zulässige Flusserhöhung ist eine Flusserhöhung (bzw. -änderung), die einen Fluss in einen zulässigen Fluss überführt. 6 2.1.2 Annahmen Da das allgemeine MinCostFlow-Problem sehr kompliziert ist, sollen folgende Annahmen gelten. Diese Annahmen sind aber nicht (sehr) einschränkend, da sie alle sowieso gelten bzw. sich ein allg. MinCostFlow-Problem in ein MinCostFlow-Problem transformieren lässt, in dem die Annahmen gelten. Annahme 1 Das Netzwerk ist schlicht (d.h. keine Kanten der Form (i, i) und keine parallelen Kanten) und ∀i, j ∈ V : (i, j) ∈ E ⇒ (j, i) 6∈ E. Diese Annahme lässt sich durch Einführung von künstlichen Knoten und Kanten im Netzwerk erzwingen und eliminiert die Nicht-Schlichtheit des Restnetzwerk ( denn falls für zwei Knoten i, j sowohl die Kante (i, j) wie auch die Kante (j, i) in G enthalten sind und ein Fluss x mit 0 < xij < uij bzw. 0 < xji < uji fliesst, so hat G(x) parallelen Kanten (zweimal (i, j) und zweimal (j, i) )). Annahme 2 Das Netzwerk ist schwach zusammenhängend, d.h. zwischen zwei beliebigen Knoten existiert ein ungerichteter Pfad. Falls es mehr als eine Zusammenhangskomponente gibt, so zerfällt das MinCostFlowProblem in kleinere MinCostFlow-Probleme. Annahme 3 ∀(i, j) ∈ E : lij = 0. Die unteren Kapazitätsschranken können sehr leicht eleminiert werden, indem man im Gleichungssystem (1) x = x0 + l einsetzt und das System nach x0 auflöst (siehe Abschnitt A.1.1). Annahme 4 Alle Größen sind ganzzahlig. Da die Computerarithmetik sowieso nicht reell ist (Fliesskomma-Problematik) kann man durch Skalierung der Werte mit einer genügend grossen Zahl diese ganzzahlig machen kann. Annahme 5 P i∈V b(i) = 0. P Der Fall, dassP i∈V b(i) 6= 0 lässt sich durch künstliche Kanten und Knoten auf den Fall i∈V b(i) = 0 reduzieren. 7 Annahme 6 Es existiert ein zulässiger Fluss. Der Fall, dass es keinen zulässigen Fluss gibt, ist einfach zu erkennen kann (siehe Abschnitt A.1.2) und es macht keinen Sinn, ein Netzwerk ohne zulässigen Fluss zu betrachten (denn ohne einen solchen gibt es keinen optimalen Fluss !). Annahme 7 alle Kosten sind nicht-negativ. Falls kein unkapazitierter Kreis mit negativen Kosten im Netzwerk existiert, kann man die Kosten so anpassen dass alle Kosten nicht-negativ werden; falls es aber einen solchen Kreis gibt, kann es keine Lösung des Problems geben ( das Minimum wäre dann -∞ , was nicht normalerweise nicht erwünscht ist bzw. der optimale Fluss enthält Komponenten der Größe ∞ ). Annahme 8 für jedes Paar (i, j) ∈ V × V existiert ein gerichteter Pfad von i nach j in G mit beliebig grosser Kapazität. Die Vorraussetzung lässt sich durch künstliche Kanten mit hohen/unendlichen Kosten erzwingen. Ein optimaler Fluss wird diese künstlichen Kanten nicht benutzen. Nach diesen Vereinfachungen hat das MinCostFlow-Minimierungsproblem die folgende Struktur: LP 3 min. z(x) = cT x s.t. Ax = b 0≤x≤u (3a) (3b) Für alle nachfolgenden Betrachtung ist ein besonderes Netzwerk interessant, das durch ein Netzwerk G und einen zugehörenden Fluss x erzeugt wird: Definition 5 Für ein Netzwerk G = (V, E) mit Kosten cij und Kapazitäten uij ist das Restnetzwerk G(x) definiert durch: 8 Für jede Kante (i, j) ∈ E mit uij − xij > 0 existiert eine Kante (i, j) in G(x) mit Kosten cij und Rest-Kapazität rij := uij − xij und Für jede Kante (i, j) ∈ E mit xij existiert eine Kante (j, i) in G(x) mit Kosten cji := −cij und Rest-Kapazität rji := xij . Abbildung 3: Definition des Restnetzwerkes im Bild Der Sinn eines Restnetzwerkes ist es, zu erkennen, wie man einen Fluss x ändern kann oder muss um einerseits die Flusserhaltung zu erfüllen und andererseits die Zielfunktion z zu verbessern. Wie man sehr leicht sieht bedeutet eine zulässige Flussänderung, das man Fluss über einen Kreis in G(x) schickt. 9 2.2 Optimalitätsbedingungen Die Frage ist nun, wie man erkennen kann, wann ein Fluss optimal ist. 2.2.1 Negative-Cycle-Optimalitätsbedingung Bei genauer Betrachtung des Restnetzwerkes sieht man, das eine zulässige Flussänderung nur über Kreise gehen kann und dass die Kosten einer positiven Flussänderung über einen Kreis die Zielfunktion des Problem ändert. Formalisiert man diese Beobachtung erhält man die erste Optimalitätsbedingung: Optimalitätsbedingung 1 Ein Fluss x∗ ist optimal genau dann, wenn G(x∗ ) keine negativen Kreise enthält. Beweis: ”⇒” Sei x∗ ein optimaler Fluss. Wegen der einleitenden Beobachtung sieht man, dass es in G(X ∗ ) keinen negativen Kreis geben kann, da man sonst über diesen einen positiven Fluss schicken könnte, der die Zielfunktion verringert. ”⇐” Sei x∗ ein zulässiger Fluss und G(x) enthalte keine negativen Kreise. Ausserdem sei x0 ein optimaler Fluss. Dann lassen sich Kreise in G(x) finden, die zusammen x∗ in x0 überführen. Die Kosten dieser Kreise sind cT x0 − cT x∗ . Da alle Kreise nicht-negativ sein müssen, gilt: cT x0 − cT x∗ ≥ 0 Andererseits gilt (da x0 optimal): cT x∗ ≤ cT x0 ⇔ cT x∗ − cT x0 ≤ 0 ⇒ cT x0 = cT x∗ d.h. x∗ ist bereits optimal. • 10 2.2.2 Reduzierte-Kosten-Optimalitätsbedingung Ein anderer Zugang zu einer Optimalitätsbedingung findet man in den Konzepten der reduzierten Kosten und der Knotenpotentiale. Dabei ist das Potential eines Knoten i ein Wert π(i) ∈ . Darüber definiert werden die reduzierten Kosten cπij := cij −π(i)+π(j) für jede Kante (i, j) des Netzwerkes. Die reduzierten Kosten im Restnetzwerk sind genauso definiert, wie die normalen nur mit cπij statt cij . Ein paar schöne Eigenschaften der reduzierten Kosten sind: R Theorem 1 1. für jeden gerichteten Pfad P von Knoten k zu Knoten l gilt: X (i,j)∈P X cπij = cij − π(k) + π(l) (i,j)∈P 2. für jeden gerichteten Kreis C gilt: X X cπij = cij (i,j)∈C (i,j)∈C Beweis: 1. oBdA. sei P = k, k + 1, . . . , k + |P | − 2, l X X cπij = (cij − π(i) + π(j)) (i,j)∈P (i,j)∈P =ck,k+1 − π(k) + π(k + 1) + ck+1,k+2 − π(k + 1) + π(k + 2)+ · · · + ck+|P |−2,l − π(l − 1) + π(l) X = cij − π(k) + π(l) (i,j)∈P 2. folgt direkt aus dem ersten Punkt, da dort k = l und damit π(k) = π(l) • Insbesondere folgt hieraus, dass der kürzeste Pfad zwischen zwei Knoten k und l bzgl. c auch der kürzeste Pfad bzlg. cπ ist, da jeder Pfad zwischen k und l um den konstanten Wert π(l) − π(k) erhöht wird. Mit dem Konzept der reduzierten Kosten lässt sich nun eine weitere Optimalitätsbedingung zeigen: 11 Optimalitätsbedingung 2 Ein zulässiger Fluss x∗ ist optimal genau dann, wenn es Knotenpotentiale π gibt, sodass gilt: ∀(i, j) ∈ G(x∗ ) cπij ≥ 0 Beweis: Um dieses zu beweisen, reicht es zu zeigen, dass gilt: ∃ Knotenpotentiale π : cπij ≥ 0 ∀(i, j) ∈ G(x∗ ) ⇔ G(x∗ ) enthält keinen Kreis negativer Kosten ”⇐” Sei x∗ ein Fluss und π seien Knotenpotentiale mit cπij ≥ 0 ∀(i, j) ∈ G(x∗ ). P Folglich gilt für jeden gerichteten Kreis W in G(x∗ ): (i,j)∈W ≥ 0. WeP P π ∗ gen Theorem 1.2 gilt (i,j)∈W cij = (i,j)∈W cij , d.h. G(x ) enthält keine Kreise mit negativen Kosten. ”⇒” Sei also x∗ ein Fluss und G(x∗ ) enthalte keine negativen Kreise. Dann lassen sich kürzeste Wege von Knoten 1 zu allen anderen Knoten in G(x∗ ) finden. Seien d die Distanzlabels der kürzesten Wege. Dann gilt für alle (i, j) in G(x∗ ) : ⇔ ⇔ d(j) ≤ d(i) + cij 0 ≤ cij − d(j) + d(i) 0 ≤ cij − (−d(i)) + (−d(j)) mit π = −d gilt 0 ≤ cij − π(i) + π(j) = cπij d.h. Optimatitätsbedingung 2 ist äquivalent zur Optimalitätsbedingung 1 • 2.2.3 Komplementärer Schlupf Die ersten beiden Optimalitätsbedingungen waren beide über das Restnetzwerk definiert. Die nächste Optimalitätsbedingung ist nun direkt auf dem Netzwerk definiert. 12 Optimalitätsbedingung 3 Ein zulässiger Fluss x∗ ist optimal genau dann, wenn ein Knotenpotential π existiert, sodass für jede Kante (i, j) ∈ E gilt: cπij > 0 ⇒ x∗ij = 0 0< x∗ij < uij ⇒ cπij < 0 ⇒ cπij x∗ij (4a) =0 (4b) = uij (4c) Beweis: Es reicht auch hier wieder zu zeigen, dass die Optimalitätsbedingung (3) äquivalent ist zur Optimalitätsbedingung (2). ”⇐” Sei x∗ ein zulässiger Fluss und π Knotenpotentiale mit cπij ≥ 0∀(i, j) ∈ G(x∗ ).Dann gilt für jede Kante (i, j) ∈ E: Fall 1. Sei cπij > 0. Dann kann G(x∗ ) die Kante (j, i) nicht enthalten, da für diese cπji = −cπij < 0 wäre. Daher kann kein Fluss über (i, j) fliessen, d.h. x∗ij = 0. Fall 2. Sei 0 < x∗ij < uij . Dann sind beide Kante (i, j) und (j, i) in G(x∗ ) enthalten und für beide sind die reduzierten Kosten ≥ 0. Wegen 0 ≤ cπji = −cπij ≤ 0 muss cπij = cπji = 0 gelten. Fall 3. Sei cπij < 0. Dann kann G(x∗ ) die Kante (i, j) nicht enthalten, weswegen xuj = uij sein muss. ”⇒” Sei x∗ ein zulässiger Fluss und die Bedingungen (4) gelten für ein Knotenpotential π. Dann gilt für jede Kante (i, j) ∈ E: Fall 1. Sei cπij > 0. Dann gilt nach Vorraussetzung x∗ij = 0. Nach Definition des Restnetzwerkes enthält dieses dann die Kante (i, j) mit Kosten cπij aber nicht die Kante (j, i) die Kosten −cπij < 0 hätte. Fall 2. cπij = 0 . Dann gilt sowohl cπij = 0 wie auch cπji = 0 für die Kante (i, j) bzw. (j, i) in G(x∗ ), falls diese existieren. Fall 3. Sei cπij < 0. Dann gilt nach Vorraussetzung x∗ij = uij . Folglich existiert die Kante (i, j) nicht in G(x∗ ) und für die Kante (j, i) gilt nach Def. des Restnetzwerkes cπji = −cπij > 0. Also sind die reduzierten Kosten für alle Kanten (i, j) in G(x∗ ) größer oder gleich 0, d.h. die Optimalitätsbedingung (2) gilt. • 13 2.3 Dualität Da man das MinCostFlow-Problem als Minimierungsproblem beschrieben werden kann, ist die Frage, wie die Dualitätstheorie der mathematischen Optimierung sich hier auswirkt. Zu dem Minimierungsproblem (3), was fortan als primales Problem bezeichnet wird, existiert das duale Problem LP 4 max w(π, α) = bT π − uT α s.t. AT π − α ≤ c α≥0 (5a) (5b) wobei π die duale Variable zur Flusserhaltungs-Gleichung und α die duale Variable der Kapazitätsbedingung ist. Damit lässt sich zeigen, dass für das MinCostFlow-Problem die Schwache Dualität gilt: Theorem 2 (Schwacher Dualitätssatz) Sei x ein primal zulässiger Fluss des MinCostFlow-Problems mit der Zielfunktion z(x) und sei (π, α) eine dual zulässige Lösung des dualen Problems mit Zielfunktionw(π, α). Dann gilt: w(π, α) ≤ z(x) Beweis: Multiplizieren von xT von links an die Ungleichung (5a) ergibt: x T AT π − x T α ≤ xT c = cT x= z(x) ⇔ (Ax)T π − xT α ≤ z(x) und wegen (2a) ⇔ bT π − x T α ⇔ w(π, α) ≤ z(x) ≤ z(x) • Nach dem Schwachen Dualitätssatz hat also jede dual zulässige Lösung einen größeren Zielfunktionwert als die primal zulässige Lösung. Die impliziert die 14 Frage, ob es auch ein Paar von Lösungen gibt, sodass Gleichheit gilt. In diesem Falle wären die Lösungen optimal, da es keine größere duale bzw. kleinere primale Lösung geben kann, ohne den Schwachen Dualitätssatz zu verletzen. Theorem 3 (Starker Dualitätssatz) Das primale MinCostFlow-Problem hat eine optimale Lösung x∗ genau dann, wenn das duale Problem eine optimale Lösung (π, α) hat. Beweis: Zuerst kann man die Ungleichung (5a) wie folgt umformen: AT π − α ⇔ ≤c ≤ c − AT π −α da A Knoten-Kanten-Inzidenzmatrix, gilt für jede Kante (i, j) ∈ E: ⇔ ⇔ −αij ≤ cij − (π(i) − π(j)) −αij ≤ cπij (6a) (6b) αij ≥ −cπij (6c) Wegen (5b) und (6c) muss in der optimalen dualen Lösung gelten αij = max{0, −cπij }, da dann −uT α maximal. Mit w(π) := w(π, max{0, −cπij }) kann nun der Satz bewiesen werden: ”⇒” Sei also x∗ eine optimale primale Lösung. Dann existiert nach Optimalitätsbedingung (3) eine duale Lösung π, die die Bedingungen (4) erfüllt. Damit gilt −cπij xij = max{0, −cπij }uij (7) denn Im Fall cπij > 0 und im Fall cπij = 0 sind beide Seiten von (7) gleich 0. Im Fall cπij < 0 ist xij = uij und damit sind beide Seiten von (7) gleich −cπij uij . Desweiteren gilt für bT π: bT π = (Ax)T π = xT AT π = xT (π T A) = X (i,j)∈E 15 xij (π(i) − π(j)) (8) Folglich gilt für die duale Zielfunktion: X w(π) = bT π − max{0, −cπij }uij (i,j)∈E = X xij (π(i) − π(j)) − (i,j)∈E = X X xij (π(i) − π(j)) − = X −(cij − π(i) + π(j))xij (i,j)∈E xij (π(i) − π(j)) − (i,j)∈E X −cπij xij (i,j)∈E (i,j)∈E = X X (π(i) − π(j))xij − (i,j)∈E X −(cij )xij (i,j)∈E cij xij = cT x (i,j)∈E ”⇐” Sei π eine optimale Lösung des dualen Problems. Die primale Lösung lässt sich durch das folgende Verfahren finden. Für jede Kante (i, j) ∈ E prüfe die folgenden Fälle: Im Fall cπij > 0 setze x∗ij = 0 und lösche die Kante (i, j) aus G. Im Fall cπij < 0 setze x∗ij = uij , b(i) = b(i)−uij und b(j) = b(j)+uij und lösche (i, j) aus G. Im Fall cπij = 0 lasse (i, j) in G. Im verbleibenen Graphen muss nun durch Einführung von zwei künstlichen Knoten s und t sowie künstlichen Kanten von s bzw. t zu allen Knoten i mit b(i) > 0 bzw. b(i) < 0 mit Kapazitäten b(i) bzw. −b(i) ein MaxFlow-Problem gelöst werden. Das Ergebniss des MaxFlow-Problems gibt einen zulässigen Fluss im orginal Netzwerk an. Dieses Ergebniss muss wegen der Lösbarkeitsannahme existieren. Zusammen mit dem oben gesetzten Fluss ist x∗ ein zulässiger Fluss des MinCostFlow-Problems und er ist auch optimal, da er nach Konstruktion die Optimalitätsbedingung (3) erfüllt. • Ausserdem sieht man an den Beweis der Optimalitätsbedingung (2) und dem Beweis der Starken Dualtität, dass man zu einem optimalen Fluss x∗ durch Lösen eines Kürzesten Wege Problems eine optimale duale Lösung und zu einer optimalen dualen Lösung π ∗ durch Lösen eines MaxFlow-Problem eine optimale primale Lösung finden kann. 16 3 3.1 Algorithmen Ansätze für Algorithmen Nach der Theorie ist nun die Frage, wie sich die Optimalitätsbedingungen in einem Algorithmus ausnutzen lassen. Der intuitivste soll hier auch der erste Algorithmus sein. 3.1.1 Der Cycle-Cancel-Algorithmus Die Optimalitätsbedingung (1) zwingt einem einen Algorithmus geradezu auf. Aus der Bedingung ”G(x∗ ) enthält keinen negativen Kreis ⇒ x∗ ist optimal” ergibt sich intuitiv die Algorithmenidee ”Solange G(x∗ ) negative Kreise enthält, beseitige diese”. Algorithmus 3.1.1 stellt die Basis der Algorithmen dar, die auf der Optimalitätsbedingung (1) basieren. Algorithmus 3.1.1 Generischer Cycle-Canceling Algorithmus finde einen zulässigen Fluss x im Netzwerk ; /*z.B. durch Max-Flow-Algorithmus*/ while G(x) enthält einen negativen Kreis do finde einen solchen negativen Kreis C; δ := min{rij : (i, j) ∈ C}; augmentiere δ Einheiten Fluss über den Kreis C; aktualisiere G(x); end while; Auch wenn oder gerade weil dieser Algorithmus so einfach und intuitiv ist, so zeigt die Laufzeitanalyse doch, dass er nicht zu den Besten für dieses Problem gehört. Seien C := max{cij : (i, j) ∈ E} und U := max{max{|b(i)| : i ∈ V }, max{uij : (i, j) ∈ E}} . Dann ist mCU eine obere Schranke und −mCU eine untere Schranke der Gesamtkosten. Da der Algorithmus in jeder Iteration die Kosten um einen echt-negativen Betrag reduziert und alle Daten ganzzahlig sind (nach Annahme 4), braucht der Algorithmus O(mCU ) Iterationen ( ist also insbesondere endlich, falls CU endlich). In jeder Iteration ist das Problem zu lösen, einen Kreis negativer Kosten zu finden. Dieses kann in Zeit O(mn) gelöst werden. Daraus ergibt sich eine Gesamtlaufzeit von O(nm2 CU ). Das Problem dieses Algorithmus ist also, dass er eine Laufzeit hat, die von den Eingangsdaten abhängt. Er kann also beliebigt schlecht laufen ( z.B. exponential, falls mCU = 2n und in jedem Schritt ein Kreis der Kosten −1 gefunden wird). Dieses sehr schlechte Laufzeitverhalten kommt daher, dass 17 keine zusätzliche Bedingung an die negativen Kreise gestellt wird, d.h. der Algorithmus kann in jedem Schritt beliebig wenig von den Kosten abziehen. Stellt man nun weitere Bedingungen an den Kreisfindungs-Prozess, so verbessert sich das Laufzeitverhalten. Eine Verbesserungsidee ist es, in jeder Iteration maximal viel abzuziehen. Dann kann man zeigen, dass diese Algorithmusvariante eine Laufzeit von O(mlog(mCU )) hat, also pseudo-polynomial ist. Das Problem einen Kreis zu finden, der die Kosten maximal verringert ist jedoch NP-vollständigt. Eine andere Verbesserungsidee ist es, einen Kreis zu finden, dessen gemittelten Kosten minimal sind. Die mittleren Kosten eines Kreises ist das Verhältniss Kosten zu Anzahl Kanten. Solch ein Kreis kann mit relativ geringen Laufzeit gefunden werden und es wurde gezeigt, dass der Algorithmus dann eine Laufzeit von O(min{nmlog(nC), nm2 log(n)}) hat, falls er nur über Kreise mit minimalen mittleren Kosten augmentiert. 3.1.2 Wiederholte Kürzeste Wege Algorithmus Eine weitere Idee ist es, nicht die Minimalität der Kosten anzustreben, sondern von einem Fluss minimaler Kosten ausgehen einen zulässigen Fluss minimaler Kosten zu finden. Definition 6 1. Ein Fluss x heisst Pseudofluss, falls gilt 0 ≤ x ≤ u. 2. Für einen Pseudofluss x sein die Zahl e für jeden Knoten i ∈ V definiert als: X X e(i) := b(i) + xji − xij {j:(j,i)∈E} {j:(i,j)∈E} Für ein Knoten i mit e(i) > 0 heisst e(i) Überschuss und für einen Knoten j mit e(j) < 0 heisst −e(j) Defizit. Desweiteren sei Z := {i : e(i) > 0, i ∈ V } und D := {i : e(i) < 0, i ∈ V }. Das Restnetzwerk eines Pseudoflusses sei genauso definiert wie das eines Flusses. Ein Pseudofluss erfüllt also die obere und untere Kapazitätsbedingungen, kann aber die Nachfrage bzw. das Angebot von Knoten unsaturiert lassen. ist jeder Pseudofluss. Wegen Annahme 5 ist P Insbesondere P P Fluss ein P P i∈V e(i) = i∈V b(i) + (j,i)∈E xji − (i,j)∈E xij = 0. Also ist i∈Z e(i) = P − i∈D e(i). Theorem 4 Seien x ein Pseudofluss, π Knotenpotentiale mit cπij ≥ 0 ∀(i, j) ∈ G(x) und der Vektor d sei der Vektor der kürzesten Distanzen von einem Knoten s zu allen anderen Knoten in G(x) bzgl. cπij . Dann gilt: 18 0 1. Für π 0 := π − d gilt cπij ≥ 0 ∀(i, j) ∈ G(x). 0 2. cπij = 0 entlang der kürzesten Wege von s zu allen anderen Knoten. Beweis: 1. Für den Vektor d gilt für jede Kante (i, j) ∈ G(x): d(j) ≤ d(i) + cπij ersetzt man cπij mit cij −π(i)+π(j) kann man die Ungleichung umformen zu ⇔ d(j) ≤ d(i) + cij − π(i) + π(j) ⇔ 0 ≤ cij − π(i) + d(i) + π(j) − d(j) ⇔ 0 ≤ cij − (π(i) − d(i)) + (π(j) − d(j)) mit π 0 = π − d ⇔ 0 ≤ cij − π 0 (i) + π 0 (j) ⇔ 0 ≤ cπij 0 2. Sei t ein beliebiger Knoten und sei P ein kürzester Pfad von Knoten s zu Knoten t. Dann gilt für jede Kante (i, j) auf dem Pfad P d(j) = 0 d(i) + cπij . Analog der Umformung aus Teil 1) folgt cπij = 0 • Aus dieser Beobachtung folgt direkt Theorem 5 Sei x ein Pseudofluss und π Knotenpotentiale mit cπij ≥ 0 ∀(i, j) ∈ G(x). Desweiteren sei x0 eine Pseudofluss der durch eine Flusserhöhung entlang eines kürzesten Pfades P von einem Knoten s zu einem Knoten t in G(x) ent0 standen ist. Dann existierten Knotenpotentiale π 0 , sodass cπij ≥ 0 ∀(i, j) ∈ G(x0 ) Beweis: Seien d der Distanzvektor des Pfades P und π 0 := π − d. Dann gilt nach Theorem 4 für jede Kante (i, j) auf dem Pfad von Knoten s nach Knoten t, 0 dass cπij = 0. In G(x0 ) können sich nur Kanten entlang des Pfades P ändern, d.h. für eine Kante (i, j) ∈ P kann die Kante (j, i) in G(x0 ) hinzugenommen 19 werden, die Kante (i, j) kann in G(x0 ) nicht mehr existieren oder beide Kan0 ten existierten bereits in G(x) und ändern sich nur. Da aber cπij = 0 folgt 0 0 dass auch cπji = −cπij = 0, d.h. alle Kanten entlang des durch P erzeugten ungerichteten Pfades haben keine Kosten. Für alle anderen Kanten ändert 0 sich nichts folglich gilt cπij = 0 ∀(i, j) ∈ G(x0 ). • Dieses Theorem assoziiert wieder einen Alogrithmus für das MinCostFlowProblem. Die Idee ist solange einen Pseudofluss x minimaler Kosten entlang kürzester Wege im Restnetzwerk zu erhöhen, bis dieser zu einem zulässigen Fluss x∗ wird. Dieser ist dann bereits optimal. Algorithmus 3.1.2 Wiederholte-Küzeste-Wege-Alogrithmusses x = 0; π = 0; e(i) = b(i) ∀i ∈ V ; Z = {i : e(i) > 0}; D = {i : e(i) < 0}; while E 6= ∅ do wähle einen Knoten s ∈ Z und einen Knoten t ∈ D; bestimme kürzeste-Wege-Distanzen d von Knoten s zu allen anderen Knoten in G(x) bzgl. cπ ; wähle einen solchen kürzesten Weg P von s nach t; aktualisiere π = π − d; δ = min{e(s), −e(t), min{rij : (i, j) ∈ P }}; erhöhe x um δ Einheiten Fluss entlang Pfad P ; aktualisiere x,G(x),E,D und cπ ; end while Der Algorithmus startert mit dem simpelsten Pseudofluss x = 0 und Knotenpotentialen π = 0. Hieraus folgt dass am Anfang G(x) = G und cπij = cij = 0∀(i, j) ∈ G(x), also die Bedingungen von Theorem 5 erfüllt sind. Die Schleife wird nun solange durchlaufen, bis Z = ∅, was genau dann der Fall ist, wenn xPein optimaler Fluss ist. Dann muss gelten Z = D = ∅, da P i∈Z e(i) = − i∈D e(i). Wegen Annahme 8 sind die Distanzlabels d für alle Knoten wohldefiniert und damit auch die Änderung der reduzierten Kosten. In jeder Iteration wird x echt verbessert, da δ > 0 und auch ein e(i), i ∈ Z und ein ej), j ∈ D echt vermindert. Mit U := max{b(i) : i ∈ V } sieht man jetzt, das es höchstens O(nU ) Iterationen geben kann, der Algorithmus also in endlich vielen Schritten endet. Sei S(n, m, C) die Laufzeit für das KürzesteWege-Problem und C := max{cij : (i, j) ∈ E}, dann hat der WiederholtKürzeste-Wege-Algorithmus eine Gesamtlaufzeit von O(nU S(n, m, nC)). 20 3.2 Praktischere Algorithmen Der intuitive Weg bringt also bei beiden Ansätzen nur eine Laufzeit, die stark von den benutzten Eingangsdaten abhängen. Je nach Ablauf können also beide eine beliebig schlechte Laufzeit produzieren. Es stellt sich die Frage, ob es besser geht oder nicht. Bei beiden Algorithmen war das Problem, dass sie in jeder Iteration ggf. nur sehr wenig augmentieren können. Die Grundidee ist also die Erhöhung zu verbessern. 3.2.1 Capacity Scaling -Algorithmus Der Capacity-Scaling-Algorithmus ist eine Variante des Wiederholte-KüzesteWege-Alogrithmusses. Es ändert ihn in der Weise, dass in jeder Iteration eine ausreichend große Erhöhung stattfindent, so dass die Anzahl der Iteration gesankt werden kann. Dabei wird die Technik des Skalierens eingesetzt, die nur Kanten betrachtet, die ”groß genug” sind. Dazu wird eine Größe ∆ eingeführt, die die aktuelle Skalierung darstellt. Der Algorithmus arbeitet dann in sogenannten ∆-Phasen, d.h. Phasen mit gleichem ∆. Zuerst ein paar Definitionen: Definition 7 Sei ∆ ∈ . R Für einen Fluss x sei das ∆-Restnetzwerk G(x, ∆) als Teilgraph des Restnetzwerkes G(x) definiert, sodass gilt rij ≥ ∆ ∀(i, j) ∈ G(x). S(∆) := {i ∈ V : e(i) ≥ ∆} T (∆) := {i ∈ V : e(i) ≤ −∆} U := max{max{|b(i)| : i ∈ V }, max{uij : (i, j) ∈ E}} Der Capacity-Scaling-Algorithmus 3.2.1 fängt dabei genauso wie Algorithmus 3.1.2 mit dem Null-Fluss und dem Null-Potential an und um die größten Wege zuerst zu finden fängt ∆ mit dem Wert 2blogU c an. Nun werden zwei Knoten s und t gesucht, deren Überschuss bzw. Defizit mind. ∆ beträgt und es wird ∆ Einheiten Fluss über einen kürzesten Weg geschickt. Falls kein solches Paar existiert, wird ∆ halbiert und es wird von vorne begonnen bis ∆ = 21 . Dann muss x ein zulässiger Fluss sein, denn es gilt S(1) = T (1) = ∅, d.h. es existiert kein Knoten mehr mit Überschuss oder Defizit. Da x dann ausserdem die Optimalitätsbedingung (2) für G(x, 1) = G(x) erfüllt, ist x optimale Lösung des Problems. Etwas unersichtlicher ist die Laufzeit. Die Frage ist hauptsächlich wieviele Iterationen der Algorithmus in jerer ∆-Phase maximal durchführen kann. 21 Algorithmus 3.2.1 Capacity-Scaling-Algorithmus x = 0; π = 0; ∆ = 2blogU c ; while ∆ ≥ 0 do /*∆-Skalierungsphase*/ for jeden Kante (i, j) in G(x) do if rij ≥ ∆ und cπij < 0 then erhöhe x um rij Einheiten entlang Kante (i, j) und aktualisiere x und e ; end if end for S(∆) := {i ∈ V : e(i) ≥ ∆}; T (∆) := {i ∈ V : e(i) ≤ −∆}; while S(∆) 6= ∅ und T (∆) 6= ∅ do wähle einen Knoten s ∈ S(∆) und einen Knoten t ∈ T (∆); bestimme kürzesten Wege-Labels d von Knoten s zu allen anderen Knoten in G(x, ∆) bzgl. cπ ; wähle einen solchen kürzesten Weg P von s nach t in G(x, ∆); aktualisiere π = π − d; erhöhe x um ∆ Einheiten Fluss entlang Pfad P ; aktualisiere x,G(x),G(x, ∆),S(∆),T (∆) und cπ ; end while end while Am Ende einer 2∆-Phase ist entweder S(∆) = ∅ oder T (∆) = ∅, d.h. es gilt entweder e(i) P < 2∆ für alle i ∈ V oder e(i) > −2∆ für alle i ∈ V . Folglich lässt sich i:∈S(2∆) e(i) mit 2n∆ nach oben abschätzen. Am Anfang der ∆-Phase kann es jetzt sein, dass G(x, ∆) Kanten enthält, die negative Kosten haben. Diese werden in der FOR-Schleife saturiert wodurch sie aus G(x, ∆) entfernt werden und dafür die Kante (j, i) in G(x, ∆) geändert wird bzw. aufgenommen wird. Da diese Kanten nicht in G(x, 2∆) enthalten sein konnten, gilt für jede solche Kante (i, j) dass ∆ ≤ rij < 2∆. Weiterhin ist ersichtlich, das das Saturieren einer solchen PKante (i, j) dazu führt, das e(j) um maximal 2∆ erhöht wird. Also wird i:∈S(2∆) e(i) um höchstens 2m∆ P erhöht und damit ist folglich i:∈S(∆) e(i) ≤ 2n∆ + 2m∆ = 2(n + m)∆. Da in jeder Iteration der P inneren WHILE-Schleife x um genau ∆ Einheiten Fluss erhöht wird und i:∈S(∆) e(i) < 2(n + m)∆, kann es in jeder ∆-Phase höchsten 2(n + m) Iterationen geben. Weiterhin gibt es offensichtlicht genau blogU c ∆-Phasen womit die Laufzeit durch O((n + m)logU S(n, m, nC)) = 22 O(nlog(U )S(n, m, nC)) abgeschätzt werden kann (Auch hier ist wieder O(S(n, m, nC)) die Laufzeit des Kürzeste-Wege-Problems in jeder Iteration der innenren WHILE-Schleife). 23 A A.1 A.1.1 Anmerkungen zu den Annahmen Elimination der unteren Kapazitätsschranken Das Gleichungssystem min cT x s.t. Ax = b l≤x≤u (a) (b) geht durch Ersetzen von x = x0 + l über in min cT x0 + l s.t. A(x0 + l) = b l ≤ x0 + l ≤ u (a) (b) Auflösen nach x0 liefert min cT x0 + cT l s.t. Ax0 = b − Al 0 ≤ x0 ≤ u − l (a) (b) was man mit b0 = b − Al , u0 = u − l und cT l = const schreiben kann als min cT x0 s.t. Ax0 = b0 0 ≤ x 0 ≤ u0 24 (a) (b) A.1.2 Überprüfung, ob ein Netzwerk einen zulässigen Fluss hat Um zu überprüfen, ob ein Netzwerk G = (V, E) einen zulässigen Fluss hat oder nicht, kann man das Netzwerk wie folgt transformieren: Hinzufügen zweier neuer Knoten s und t mit b0s = P 0 {i:bi ≤0} bi und bi = 0∀i 6∈ s, t P {i:bi ≥0} bi , b0t = Hinzufügen von Kanten von s zu jedem Angebotsknoten i bzw. von jedem Nachfrageknoten j zu t mit Kapazität usi = b(i) bzw. uj t = −b(j) In diesem neuen Netzwerk G0 mit Kosten c0 , Angebots- und Nachfragevektor b0 und Kapazitäten u0 kann man nun ein MaxFlow-Problem lösen. Falls der maximale Fluss alle Kanten (s, i) saturiert, gibt es einen zulässigen Fluss in G für das MinCostFlow-Problem. 25