Effiziente Algorithmen und Datenstrukturen II Sven Kosub getippt von Martin von Gagern Sommersemester 2005 2 Organisatorisches Zu dieser Mitschrift Ich kann keinerlei Garantie geben, dass diese Mitschrift korrekt ist, geschweige denn vollständig. Ich behalte mir vor, irgendwann während dem Semester die Lust am Mitschreiben zu verlieren. Wer einen Fehler irgendeiner Art findet, darf mir diesen gerne mitteilen, ich werde ihn dann vermutlich korrigieren. Martin von Gagern Literatur • M.T. Goodrich, R. Tamassia: Algorithm Design: Foundations, Analysis and Internet Examples, 2002 • T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein: Introduction to Algorithms, 2001 • K. Schöning: Algorithmik, 2001 Webseite: http://www14.in.tum.de/Lehre/2005SS/ea Inhaltsverzeichnis 1 Graphenalgorithmen 1.1 1.2 1.3 1.4 7 Datenstrukturen für Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.1.1 Kantenlisten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.1.2 Adjazenzlisten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.1.3 Adjazenzmatrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Graphentraversierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.1 Tiefensuche (depth-first search) . . . . . . . . . . . . . . . . . . . . . . . . 10 1.2.2 Breitensuche (breadth-first search) . . . . . . . . . . . . . . . . . . . . . . 11 Erreichbarkeitsprobleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.3.1 Zweifach zusammenhängender Teilgraph . . . . . . . . . . . . . . . . . . . 13 1.3.2 Starker Zusammenhang . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.3.3 Transitive Hülle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Minimale Spannbäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.4.1 Kruskal-Algorithmus (1956) . . . . . . . . . . . . . . . . . . . . . . . . . . 22 1.4.2 Prim-Jarnik-Algorithmus (1957 Prim, 1930 Jarnik) . . . . . . . . . . . . . 24 1.4.3 Algorithmus von Boruvka (Boruvka, 1926) . . . . . . . . . . . . . . . . . . 26 1.4.4 Algorithmus von Chazelle (Chazelle, 2000) . . . . . . . . . . . . . . . . . 28 2 Algorithmen für Flüsse und Matchings 41 2.1 Flüsse und Schnitte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.2 Maximaler Fluss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.2.1 46 Algorithmus von Ford und Fulkerson . . . . . . . . . . . . . . . . . . . . . 3 4 INHALTSVERZEICHNIS 2.2.2 Algorithmus von Edmonds und Karp . . . . . . . . . . . . . . . . . . . . . 48 2.3 Maximale Matchings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.4 Flüsse mit minimalen Kosten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3 Lineare Programmierung 3.1 3.2 59 Standardformulierungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.1.1 Beispiele für LP-Modellierungen . . . . . . . . . . . . . . . . . . . . . . . 63 Simplex-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.2.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.2.2 Formaler Simplex-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . 67 3.2.3 Terminierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 3.2.4 Optimalität und Dualität . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 3.2.5 Initialisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 INHALTSVERZEICHNIS 5 Algorithmen 1 DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2 BFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3 EquiClasses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4 StrongConnectivityTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5 Floyd-Warshall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 6 Kruskal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 7 Prim-Jarnik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 8 Prim-Jarnik-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 9 Boruvka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 10 Minoren-Hierarchie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 11 Chazelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 12 Ford-Fulkerson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 13 MinCostFlow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 14 Pivot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 15 Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 16 InitializeSimplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 6 INHALTSVERZEICHNIS Kapitel 1 Graphenalgorithmen 1.1 Datenstrukturen für Graphen Implementierung von Graphen Konvention: n: m: 1.1.1 Anzahl der Knoten Anzahl der Kanten Kantenlisten • Knotenobjekt für Knoten v ∈ V und Objekt o: 1. Zeiger auf o 2. Zähler für deg(v) bzw. indeg(v) und outdeg(v) • Kantenobjekt für Kante e ∈ E und Objekt o: 1. Zeiger auf o 2. Markierung für gerichtet“ oder ungerichtet“ ” ” 3. Zeiger auf die beteiligten Knoten Beispiel: A • 5 •B 0 −2 3 4 C • −1 • D V und E sind jeweils doppelt verkettete Listen; Zeiger weggelassen. 7 8 KAPITEL 1. GRAPHENALGORITHMEN Komplexitäten von Operationen auf Kantenlisten: • Bestimmung Knotenanzahl und Kantenanzahl in O(1) • Bestimmung Knotengrade in O(1) • Einfügen von Knoten in O(1) • Einfügen / Löschen von Kanten in O(1) • Bestimmung inzidenter Kanten an einem Knoten usw. in O(m) • Adjazenztest in O(m) • Löschen von Knoten (mit allen inzidenter Kanten) in O(m) 1.1.2 Adjazenzlisten Erweiterung von Kantenlisten durch Zeiger auf inzidente Kanten • Knotenobjekt für Knoten v ∈ V und Objekt o: 1. Zeiger auf o 2. Zeiger auf Listen für eingehende und ausgehende Kanten • Kantenobjekt für Kante e ∈ E und Objekt o: 1. Zeiger auf o 2. Markierung für gerichtet“ oder ungerichtet“ ” ” 3. Zeiger auf die beteiligten Knoten 4. Zeiger auf die Position in den Kantenlisten der Knoten Komplexitäten von Operationen auf Adjazenzlisten • Bestimmung Knotenanzahl und Kantenanzahl in O(1) • Bestimmung Knotengrade in O(1) • Einfügen von Knoten in O(1) • Einfügen / Löschen von Kanten in O(1) • Bestimmung inzidenter Kanten an einem Knoten usw. in O(deg(v)) • Adjazenztest in O(min{deg(v), deg(u)}) • Löschen von Knoten (mit allen inzidenter Kanten) in O(deg(v)) 1.2. GRAPHENTRAVERSIERUNG 1.1.3 9 Adjazenzmatrizen Adjazenzmatrix A(G) für Graphen G = (V, E) mit V = {0, . . . , n − 1} ist eine n × n-Matrix mit ( 1 wenn (i, j) ∈ E aij = 0 wenn (i, j) 6∈ E Datenstruktur bestehend aus • Knotenobjekt für Knoten v und Objekt o: 1. Zeiger auf o 2. Index von v; d.h. seine Nummer in V 3. Zähler für Knotengrad deg(v) bzw. indeg(v) und outdeg(v) • Kantenobjekte wie bei Kantenlisten • Matrixobjekt als n × n-Array A mit A[i, j] enthält Zeiger auf Kante e = (i, j) (für ungerichtete Graphen: A[i, j] = A[j, i]), sonst Nil Komplexitäten von Operationen auf Adjazenzmatrizen • Bestimmung Knotenanzahl und Kantenanzahl in O(1) • Bestimmung Knotengrade in O(1) • Einfügen von Knoten in O(n) amortisiert • Einfügen / Löschen von Kanten in O(1) • Löschen von Knoten in O(n) amortisiert • Bestimmung inzidenter Kanten an einem Knoten usw. in O(deg(v)) • Adjazenztest in O(min{deg(v), deg(u)}) • Löschen von Knoten (mit allen inzidenter Kanten) in O(deg(v)) Problem: Für n Knoten stets O(n2 ) Speicherplatz inabhängig von Anzahl tatsächlich vorhandener Kanten ⇒ nur für dichte Graphen sinnvoll 1.2 Graphentraversierung Traversierung = systemaitisches Ablaufen aller Knoten eines Graphen 10 KAPITEL 1. GRAPHENALGORITHMEN 1.2.1 Tiefensuche (depth-first search) Tiefensuche produziert zwei Arten von Kanten: 1. Baumkanten 2. Rückwärtskanten Algorithmus DFS(G, v) Eingabe: (ungerichteter) Graph G, Knoten v in G Ausgabe: Markierung der Kanten (in der Zusammenhangskomponente) von v als Baumkante“ ” oder Rückwärtskante“ ” 1 2 3 4 5 6 7 8 9 10 11 markiere Knoten v als besucht“ ” for jede Kante e = {u, v} do if e nicht markiert then Markiere e als Baumkante“ ” DFS(G, u) else Markiere e als Rückwärtskante“ ” fi od Algorithmus 1: DFS = Baumkanten = Rückwärtskanten A A A B C B A E B C D I D G E H F I E D F H C G B D E F G H G H I I F C Beachte: Die Reihenfolge der Knoteninspektion ist wichtig für die Höhe des DFS-Baumes. 1.2. GRAPHENTRAVERSIERUNG 11 Bemerkungen: 1. Höhe des DFS-Baumes entspricht Platzbedarf der Traversierung (bei Realisierung mit Stacks) 2. Folgendes Problem ist NP-vollständig (Hamilton-Pfad): Eingabe: G, k Frage: Gibt es einen DFS-Baum T für G mit h(T ) ≥ k? 3. Dies gilt auch für die Frage: Gibt es einen DFS-Baum T für G mit h(T ) ≤ k? Eigenschaften der Tiefensuche (beginnend bei s ∈ V ) 1. Tiefensuche besucht alle Knoten der Zusammenhangskomponente von s 2. Baumkanten bilden Spannbaum der Zusammenhangskomponente von s 3. Tiefensuche benötigt O(ms ) Schritte zur Traversierung der Zusammenhangskomponente von s Folgende Probleme können mit Tiefensuche in Zeit O(m + n) gelöst werden. 1. Test, ob G zusammenhängend ist 2. Berechnung eines Spannwaldes von G 3. Berechnung aller Zusammenhangskomponenten von G 4. Berechnung eines Pfades zwischen Knoten von G 5. Berechnung eines Kreises in G 1.2.2 Breitensuche (breadth-first search) Breitensuche produziert zwei Arten von Kanten: 1. Baumkanten 2. Querkanten 12 KAPITEL 1. GRAPHENALGORITHMEN Algorithmus BFS(G, v) Eingabe: Graph G, Knoten v in G Ausgabe: Markierung der Kanten in Zusammenhangskomponente von v als Baumkanten“ oder ” Querkanten“ ” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Initialisiere Queue Q Enqueue(Q, v) Markiere v als besucht“ ” while Q nicht leer do w := Dequeue(Q) for jede Kante e = {w, u} do if e nicht markiert then Markiere e als Baumkante“ ” Markiere u als besucht“ ” Enqueue(Q, u) else Markiere e als Querkante“ ” fi od od Algorithmus 2: BFS = Baumkanten = Querkanten A1 B4 C7 D2 E3 F9 G5 H8 I6 A D E B G I C H F Eigenschaften der Breitensuche (beginnend bei s ∈ V ) 1. Breitensuche besucht alle Knoten in der Zusammenhangskomponente von s 2. Baumkanten bilden Spannbaum in der Zusammenhangskomponente von s 3. Für alle Knoten v der Tiefe i hat Pfad in T von s nach v genau i Kanten und jeder andere Pfad in G von s nach v mindestens i Kanten. 4. Ist {u, v} Querkante, so unterscheiden sich Tiefen in T um höchstens 1. 5. Breitensuche benötigt O(ms ) Schritte zur Traversierung. 1.3. ERREICHBARKEITSPROBLEME 13 Folgende Probleme können mit Breitensuche in Zeit O(n + m) gelöst werden: 1. Test, ob G zusammenhängend ist 2. Berechnung eines Spannwaldes von G 3. Berechnung aller Zusammenhangskomponenten von G 4. Gegeben Knoten s ∈ V berechne für alle Knoten v ∈ V einen Pfad mit geringster Anzahl von Kanten 5. Berechnung eines Kreises in G 1.3 Erreichbarkeitsprobleme 1.3.1 Zweifach zusammenhängender Teilgraph Es sein G ein zusammenhängender ungerichteter Graph. Ein Artikulationsknoten ◦ ist ein Knoten, nach dessen Entfernung aus G der Graph nicht mehr zusammenhängend ist. Eine Brücke (Trennkante) nicht mehr zusammenhängend ist. • • • ◦ • • ◦ • • ist eine Kante, nach deren Entfernung aus G der Graph ◦ • Motivation: Artikulationsknoten und Brücken sind kritische Elemente für z.B. Ausfallsicherheit un Kommunikationsnetzen. Ein zusammenhängender Graph G ist zweifach zusammenhängend gdw. für alle Knoten u, v von G gibt es zwei (Knoten-)disjunkte Pfade u und v Eine zweifach zusammenhängende Komponente von G ist ein Teilgraph G′ , der eine der folgenden Eigenschaften erfüllt: 1. G′ ist zweifach zusammenhängend und Hinzufügen beliebiger Knoten und Kanten aus G zu G′ würde zweifach-Zusammenhang zerstören. 2. G′ besteht nur aus einer Brücke in G Lemma 1: Es sei G ein zusammenhängender Graph. Dann sind folgende Aussagen äquivalent: 1. G ist zweifach zusammenhängend. 2. Jeweils zwei Knoten von G liegen auf einem Kreis in G. 14 KAPITEL 1. GRAPHENALGORITHMEN 3. G besitzt keine Brücken oder Artikulationsknoten. Beweis: klar. Beispiel: Abbildung 1.1 auf Seite 16 Idee: • Bestimme alle Artikulationsknoten (in O(n2 + nm)) • Bestimme alle Zusammenhangskomponenten in Graph ohne Artikulationsknoten (in O(n+ m)) • Ergänze Knoten zu Komponente geeignet (in O(m2 )) =⇒ Damit insgesamt O((n + m)2 ) Ziel: Algorithmus, der Zweizusammenhang in O(n + m) bestimmt Definiere Relation ≡ auf Kantenmenge E von G: e ≡ f ⇔def e = f oder es gibt einen einfachen Kreis in G (d.h. Kreis ohne doppelte Knoten), der e und f enthält. Lemma 2: Es sei G = (V, E) ein zusammenhängender Graph. 1. Relation ≡ ist eine Äquivalenzrelation auf E 2. Zweizusammenhangskompnenten sind genau die Teilgraphen, die durch Äquivalenzklassen bzgl. ≡ induziert werden. 3. Kante e ∈ E ist eine Brücke gdw. {e} ist Äquivalenzklasse bzgl. ≡ 4. Knoten v ∈ V ist Artikulationsknoten gdw. es gibt zwei Kanten aus unterschiedlichen Äquivalenzklassen bzgl. ≡, die inzident an v sind. Beweis: Mit Hilfe von Lemma 1 folgen die Aussagen 2.–4. aus Aussage 1. Zu 1. Reflexivität (e ≡ e): aus Definition klar Symmetrie (e ≡ f ⇒ f ≡ e): klar, da Graph ungerichtet ist. Transitivität ((e ≡ f ∧ f ≡ g) ⇒ e ≡ g): Es gelte e ≡ f und f ≡ g. Unterscheide drei Fälle: 1. e = g, dann ist die rechte Seite der Implikation wahr, also stimmt die Implikation. 2. e 6= g ∧ (e = f ∨ f = g), dann gibt es einfachen Kreis, der e und g enthält. 3. Es seien nun e, f, g paarweise verschieden. Damit gibt es einfachen Kreis Cef mit e und f sowie einfachen Kreis Cf g mit f und g. Betrachte Graph Cef ∪ Cf g . Dieser Graph enthält Kreis mit e und g, der aber im Allgemeinen nicht einfach ist. 1.3. ERREICHBARKEITSPROBLEME 15 zu zeigen: Es gibt stets einen einfachen Kreis Ceg mit e und g. Es seien pef , qef jeweils die Halbkreise in Cef ; analog seien pgf , qgf definiert. Für Pfad p = (v0 , v1 , . . . , vk ) sei der Abstand zu Knotenmenge C definiert als d(p, C) =def min({j|vj ∈ C} ∪ {∞}) Betrachten nun Abstände d(pef , pgf ), d(pef , qgf ), d(qef , pgf ), d(qef , qgf ). O.B.d.A. sei d(pef , pgf ) minimal; sei vpp der Berührungspunkt. Sei vqq der Berührungspunkt von qef , qgf . Dann ist der Kreis Ceg bestehend aus: e, pef bis vpp , pgf bis vpp , g, qgf bis vqq , qef bis vqq einfach und enthält e und g. Damit e ≡ g Lemma 2 gibt uns einen Ansatz für die Berechnung der Zweizusammenhangskompnenten. Benötigen dazu folgenden Hilfsgraphen H basierend auf einer Tiefensuche in G: 1. V (H) =def E(G), d.h. die Knoten von H sind gerade die Kanten von G. 2. Ist e eine Rückwärtskante von G und sind f1 , . . . , fk die Bauimkanten von G, die zusammen mit e einen Kreis in G bilden, so gilt: {e, f1 }, . . . , {e, fk } ∈ E(H) Beachte: Da G genau m − n + 1 Rückwärtskanten besitzt, gilt kE(H)k = O(n · m) Beispiel: Abbildungen 1.2 bis 1.3 auf der nächsten Seite Nach Konstruktion von H(G): Die durch Zusammenhangskomponenten von H(G) induzierten Teilgraphen von G entsprechen genau den Zweizusammenhangskomponenten von G. Damit ergibt sich folgender Algorithmus für Äquivalenzklassenbestimmung: 1. Traversiere G mittels DFS 2. Berechne H(G) auf Basis der DFS 3. Berechne Zusammenhangskomponenten von H(G), z.B. mittels DFS 4. Gebe für jede Zusammenhangskomponente von H(G) die beteiligten Knoten (d.h. die Kanten von G) aus Aber: Konstruktion von H(G) benötigt O(n · m) Schritte! Idee: Berechne lediglich Spannwald von H(G)! 16 KAPITEL 1. GRAPHENALGORITHMEN • • • • • • • ◦ ◦ • • ◦ • • ◦ • • • • • • Abbildung 1.1: Zweizusammenhangskomponenten im Graphen G K1 A19 B18 C16 D15 E14 F20 G17 H7 I8 J13 L2 M21 N6 O9 P12 Q3 R4 S5 T10 U11 Abbildung 1.2: DFS im Graphen G KL LQ HI QR IO TU RS OJ UP CH SN ML JE EI NH MQ ED DH HG MR DC GM MN OT GB AG BA AF Kanten, die der Algorithmus EquiClasses nicht ermittelt. Abbildung 1.3: Hilfsgraph H PO FG 1.3. ERREICHBARKEITSPROBLEME 17 Algorithmus EquiClasses(G) Eingabe: zusammenhängender Graph G Ausgabe: Zusammenhangskomponenten von H(G) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 H sei leerer Graph DFS-Traversierung von G beginnend bei beliebigem Knoten s Füge jede Baumkante f als Knoten in H ein und markiere f als isoliert“ ” for jedes v ∈ V (G) in DFS-Reihenfolge do for Rückwärtskante e = (u, v) do Füge e als Knoten in H ein while u 6= v do sei f = (Parent(u), u), wobei Elternknoten in DFS-Baum gemeint ist Füge {e, f } als Kante in H ein if f isoliert“ ” then Markiere f als verbunden“ ” u :=Parent(u) else u := v fi od od od Bestimme Zusammenhangskomponenten von H Algorithmus 3: EquiClasses Komplexität von EquiClass: O(n + m) für DFS auf G + O(m) für Einfügen aller Baumkanten + O(m) für Spammwaldberechnung (beachte: kV (H)k = m) + O(m) für Berechnung von Zusammenhangskomponenten in H ⇒ O(n + m) Schritte zur Berechnung von Zweizusammenhangskomonenten von G, Artikulationsknoten und Brücken Zeile 2 Zeile 3 Zeilen 4-17 Zeile 18 Bemerkung: Zweifacher Zusammenhang läßt sich verallgemeinern: Es sei G(V, E) ein ungerichteter Graph, s, t ∈ V, s 6= t. λG (s, t) =def λ(G) =def κG (s, t) =def κ(G) =def minimale Anzahl von Kanten, die aus G entfernt werden müssen, damit zwischen s und t kein Pfad mehr existiert. mins,t∈V,s6=t,{s,t}6∈E λG (s, t) minimale Anzahl von Knoten, die aus G entfernt werden müssen, damit zwischen s und t kein Pfad mehr existiert. mins,t∈V,s6=t,{s,t}6∈E κG (s, t) (lokaler Kantenzusammenhang) (globaler Kantenzusammenhang) (lokaler Knotenzusammenhang) (globaler Knotenzusammenhang) 18 KAPITEL 1. GRAPHENALGORITHMEN Es gilt: 1. κ(G) ≤ λ(G) ≤ δ(G), wobei δ(G) der minimale Grad des Graphen ist. 2. Sind s, t ∈ V nicht benachbart, dann gilt λG (s, t) =maximale Anzahl Knoten-disjunkter Pfade zwischen s und t (Satz von Menger) 3. Methode zur Bestimmung von λG (st, t) und λG in Kapitel 3 auf Seite 59. 1.3.2 Starker Zusammenhang Betrachte nun Erreichbarkeit in gerichteten Graphen. Wir sagen: Knoten u erreicht Knoten v ~ falls es einen (gerichteten) Pfad von u nach v gibt. in G, ~ heißt stark zusammenhängend, falls für alle Knotenpaare u, v ∈ V Ein gerichteter Graph G mit u 6= v gilt: u erreicht v und v erreicht u. Beispiel: A C B D F E G ~ nicht stark zusammenhängend • G • Teilgraph mit {A, B, C, D, F } stark zusammenhängend Interessieren uns für folgende algorithmischen Probleme: 1. Gegeben u und v bestimme, ob u den Knoten v erreicht. ~ die ein gegebener Knoten s erreicht. 2. Finde alle Knoten von G, ~ stark zusammenhängend ist. 3. Teste, ob G Lösungsansatz: DFS auf gerichteten Graphen DFS produziert vier Arten von Kanten: 1. Baumkanten (eines gerichteten DFS-Baumes) 2. Rückwärtskanten (Nichtbaumkanten zu Vorgängern im DFS-Baum) 3. Vorwärtskanten (Nichtbaumkanten zu Nachfolgern im DFS-Baum) 4. Querkanten (Nichtbaumkanten zu Knoten in einem anderen DFS-Teilbaum) 1.3. ERREICHBARKEITSPROBLEME 19 = Baumkanten = Rückwärtskanten = Vorwärtskanten = Querkanten A4 B3 A1 G B4 A E C5 D6 C B E2 C2 D3 E A F7 G1 C F D B F F5 G D Abbildung 1.4: DFS-Traversierung eines gerichteten Graphen ~ ein gerichteter Graph. DFS-Traversierung von G ~ beginnend bei Knoten Beobachtung: Es sei G ~ s besucht alle Knoten von G, die s erreicht. Insbesondere enthält DFS-Baum einen gerichteten Pfad von s zu jedem erreichbaren Knoten. Komplexität von DFS beginnend bei s: O(ns + ms ) Schritte (bei Verwendung von Adjazenzlisten), wobei ns Anzahl der von s erreichbaren Knoten und ms Anzahl der in diesem Teilgraph enthaltenen Kanten ist. Folgende Probleme können in O(n2 + n · m) Schritten gelöst werden: • Bestimme für jeden Knoten v den induzierten Teilgraphen der erreichbaren Knoten. ~ stark zusammenhängend ist. • Teste, ob G Aber: Test auf starken Zusammenhang in O(n + m) möglich. ~ Algorithmus StrongConnectivityTest(G) 1 2 3 4 5 6 7 8 9 10 11 Führe DFS auf einem beliebigen Knoten s (z.B. erster Knoten der Knotenliste) aus if Menge nicht besuchter Knoten nicht leer then return Nicht stark zusammenhängend“ ” else ~ um Drehe Orientierung aller Kanten von G Führe DFS auf umgedrehten“ Graphen auf s aus ” if Menge nicht besuchter Knoten nicht leer then return Nicht stark zusammenhängend“ ” else return Stark zusammenhängend“ ” fi fi Algorithmus 4: StrongConnectivityTest 20 KAPITEL 1. GRAPHENALGORITHMEN 1.3.3 Transitive Hülle Ziel: Wollen Zusammenhangs- und Erreichbarkeitsinformationen nach Berechnung festhalten, d.h. berechnen transitive Hülle. ~ ist der gerichtete Graph G ~ ∗ mit Transitive Hülle eines gerichteten Graphen G ~ ∗ ) = V (G) ~ • V (G ~ ∗ ) gilt (u, v) ∈ E(G ~ ∗ ) ⇔ u erreicht v in G ~ • Für alle u, v ∈ V (G Klar: Transitive Hülle kann in O(n2 + n · m) Schritten berechnet werden (mittels wiederholter DFS) alternativ: Floyd-Warshall-Algorithmus (1962) ~ ∗ in Runden (V = {v1 , . . . , vn }) Konstruiere G ~ ~ 0 =def G G ~ ~ k−1 ∪ (V, {(vi , vj )|(vi , vk ) ∈ E(Gk−1 ) ∧ (vk , vj ) ∈ E(Gk−1 ) Gk =def G ~ Algorithmus Floyd-Warshall(G) ~ Eingabe: gerichteter Graph G ~∗ Ausgabe: transitive Hülle G 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ~ 0 := G ~ G for k := 1 to n do ~ k := G ~ k−1 G for i := 1 to n do for j := 1 to n, i 6= j, j 6= k do ~ k−1 ∧ (vk , vj ) ∈ G ~ k−1 if (vi , vk ) ∈ G ~ then if (vi , vj ) 6∈ Gk ~ k hinzu then Füge (vi , vj ) zu G fi fi od od od ~n return G Algorithmus 5: Floyd-Warshall Komplexität von Floyd-Warshall: 3 geschachtelte For-Schleifen ⇒ Θ(n3 ) Schritte (bei Verwendung von Adjazenzmatrizen) 1.4. MINIMALE SPANNBÄUME 1.4 21 Minimale Spannbäume Betrachte gewichtete ungerichtete zusammenhängende Graphen G. Es sei T ⊆ G ein Spannbaum von G. Definiere X w(e) w(T ) =def e∈E(T ) als Gewicht von G. T mit minimalem Gewicht heißt minimaler Spannbaum. Ziel: Schnelle Algorithmen zur Bestimmung minimaler Spannbäume. Motivation: Bestimme minimale Leitungslänge, um alle Rechner einer Organisationseinheit geeignet zu verbinden. Lemma 3: (blaue Regel) Es sei G = (V, E, w) ein gewichteter zusammenhängender Graph. Sei V ′ nicht-leere Teilmenge von V . 1. Ist e ∈ E die einzige Kante mit minimalem Gewicht unter allen Kanten aus {u, v} ∈ E | u ∈ V ′ , v 6∈ V ′ , so ist e in jedem minimalen Spannbaum enthalten. 2. Ist e ∈ E eine Kante mit minimalem Gewicht unter allen Kanten aus {u, v} ∈ E | u ∈ V ′ , v 6∈ V ′ , so gibt es einen minimalen Spannbaum, der e enthält. Beweis: 1. Übungsaufgabe 2. Sei e ∈ E gewichtsminimale Kante von V ′ nach V \ V ′ . Angenommen e kommt in keinem minimalen Spannbaum vor. Sei T ein beliebiger minimaler Spannbaum von (V, E, w). Dann besitzt (V, E(T ) ∪ {e}) einen Kreis C, d.h. es gibt e′ ∈ E(T ) ∩ C von V ′ nach V \ V ′ . Es gilt jedoch w(e) ≤ w(e′ ). Dann gilt für den Spannbaum T ′ =def (V, E(T ) \ {e′ } ∪ {e}). w(T ′ ) ≤ w(T ), d.h. T ′ minimaler Spannbaum mit e. Folgerung 4: Es sei G ein gewichteter zusammenhängender Graph. Sind die Kantengewichte von G alle verschieden, so ist der minimale Spannbaum eindeutig. Lemma 5: (rote Regel) Es sei G = (V, E, w) ein gewichteter, zusammenhängender Graph. 1. Gibt es für eine Kante e ∈ E einen Kreis C in G, der e enthält und für den w(e) > w(e′ ) für alle Kanten e′ ∈ E(C) \ {e} gilt, so kommt e in keinem minimalen Spannbaum vor. 2. Ist C = {e1 , . . . , ek } ein Kreis in G und ist ei ∈ C eine Kante mit w(ei ) ≥ w(ej ) für 1 ≤ j ≤ k, so gibt es einen minimalen Spannbaum, der ei nicht enthält. Beweis: (Widerspruch) 1. Angenommen es gibt minimalen Spannbaum T von G mit solch einer Kante e = {u, v} ∈ E(T ). Wenn e aus T entfernt wird, entstehen zwei Teilbäume Tu , Tv mit 22 KAPITEL 1. GRAPHENALGORITHMEN u ∈ V (Tu ), v ∈ V (Tv ). Da e aber auf Kreis C in G liegt mit w(e) > w(e′ ) für alle e′ 6= e, gibt es einen Weg in G von u nach v, der e nicht enthält. Dann gibt es auch Kante e′ ∈ E, die Knoten von Tu mit Knoten von Tv verbindet. Damit ist T ′ =def (V, E(T ) \ {e} ∪ {e′ }) Spannbaum von G mit w(T ′ ) < w(T ). Minimalität von T . 2. Angenommen die beschriebene Kante ei ∈ C = {e1 , . . . , ek } liegt in jedem minimalen Spannbaum von G. Sei T ein beliebiger minimaler Spannbaum von G. Wenn ei = {u, v} aus T entfernt wird, entstehen Tu , Tv mit u ∈ V (Tu ), v ∈ V (Tv ). Analog zu 1. können wir ei durch jede Kante ej ∈ C ersetzen, die Tu mit Tv verbindet. Dann ist T ′ =def (V, E(T ) \ {ei } ∪ {ej }) Spannbaum von G ohne ei . Außerdem gilt: w(T ′ ) ≤ w(T ) wegen w(ei ) ≥ w(ej ). D.h. T ′ minimaler Spannbaum. 1.4.1 Kruskal-Algorithmus (1956) Idee: Wähle iterativ Kante mit minimalem Gewicht unter Beachtung der Kreisfreiheit. (Korrektheit folgt direkt aus der blauen Regel, Lemma 3 auf der vorherigen Seite) Verwenden zur Implementierung • Priority Queues • Union-Find-Strukturen Algorithmus Kruskal(G) Eingabe: gewichteter zusammenhängender Graph G = (V, E, w) mit n Knoten und m Kanten Ausgabe: Minimaler Spannbaum T 1 2 3 4 5 6 7 8 9 10 11 12 13 14 for v ∈ V do MakeSet(v) od Initialisiere Priority Queue Q mit allen Kanten und Kantengewichten als Schlüssel E(T ) := ∅ while kE(T )k < n − 1 do {u, v} := ExtractMin(Q) r1 := Find(u) r2 := Find(v) if r1 6= r2 then E(T ) := E(T ) ∪ {u, v} Union(r1 , r2 ) fi od Algorithmus 6: Kruskal Beispiel: Abbildung 1.5 auf der nächsten Seite 1.4. MINIMALE SPANNBÄUME 23 Kante noch in Queue r1 6= r2 , in Spannbaum r1 = r2 , nicht im Spannbaum A A 1 8 2 E 1 B 9 6 D 8 2 5 7 3 4 6 D 8 9 3 6 D 8 2 B 9 6 D 4 4 B 9 C 10 8 2 7 3 6 D 4 C 10 1 5 E B 7 A 1 5 7 3 E C 10 5 A 1 E B 9 3 8 2 7 A 2 1 5 E C 10 A 4 E B 7 9 3 C 10 5 6 D 4 C 10 Abbildung 1.5: Algorithmus von Kruskal Kante, die noch nicht betrachtet wurde Kante e, die durch ExtractMin erhalten wird Kanten, die bereits im Spannbaum sind A0 A 1 8 2 E∞ 3 1 5 B∞ 7 6 D∞ 4 E1 3 E 10 2 B6 6 10 C5 4 E 6 8 1 C5 10 8 2 5 B4 6 10 4 A 9 D B7 9 3 D2 7 3 5 7 C5 1 5 9 D 4 E A 8 7 3 B8 6 D2 8 2 9 A 1 2 1 5 7 C∞ 10 8 2 9 A C 4 E 5 B 7 3 9 D Abbildung 1.6: Algorithmus von Prim und Jarnik 6 10 C 24 KAPITEL 1. GRAPHENALGORITHMEN Komplexität von Kruskal: Zeilen 1–3: O(n) Zeile 4: O(m) Zeilen 6–14: maximal m Durchläufe der while-Schleife Zeile 7: O(log m) Zeilen 8–9: O(log∗ n) amortisiert Zeile 12: O(log∗ n) amortisiert =⇒ O(m log m) = O(m log n) Schritte 1.4.2 Prim-Jarnik-Algorithmus (1957 Prim, 1930 Jarnik) Dijkstra-ähnliche“ Idee: Beginne mit einer leeren Knotenmenge und ziehe dann stets den Kno” ten in die Menge, der leichteste Kante zu irgendeinem Knoten der Menge hat. (Korrektheit folgt aus der blauen Regel, Lemma 3 auf Seite 21) Algorithmus Prim-Jarnik(G) Eingabe: gewichteter zusammenhängender Graph G = (V, E, w) mit n Knoten und m Kanten Ausgabe: Minimaler Spannbaum T 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 D[v] := 0 (für gewähltes v ∈ V ) for u ∈ V \ {v} do D[u] := +∞ od T := (∅, ∅) Initialisiere Priority Queue Q mit Objekten ((u, Nil), D[u]) für alle u ∈ V und Schlüssel D[u] while Q nicht leer do (u, e) := ExtractMin(Q) T := T ∪ {(u, e)} ; e ist Kante for Nachbar z von u mit z ∈ Q do if w(u, z) < D[z] then D[z] := w(u, z) Aktualisiere D[z] in Q (DecreaseKey) Aktualisiere (z, (u, z)) für z ∈ Q fi od od return T Algorithmus 7: Prim-Jarnik Komplexität von Prim-Jarnik (mit Fibonacci-Heaps): 1.4. MINIMALE SPANNBÄUME Zeilen 1–6: Zeilen 7–17: 25 O(n) Für jeden Knoten u ∈ V ein Durchlauf der while-Schleife Zeile 8: O(log n) amortisiert Zeilen 10–16: O(deg(u)) amortisiert ! X ⇒ O (log n + deg(u)) = O(n log n + m) u∈V ⇒ O(n log n + m) Schritte Zweiter Algorithmus von Prim-Jarnik (nach Fredman, Tarjan, 1987) Idee: Beschränkiung der Größe der Priority Queues Algorithmus Prim-Jarnik-2(G) Eingabe: gewichteter zusammenhängender Graph G = (V, E, w) Ausgabe: Minimaler Spannbaum T 1 2 3 4 5 6 7 8 9 10 11 12 13 while kV k > 1 do t := 0 T := ∅ while V 6= T t := t + 1 Wähle zt aus V \ T Baue Baum Tt mit Hilfe von Prim-Jarnik nur mit Knoten aus V \ T auf, so lange bis Priority Queue Qt mehr als r Elemente enthält (beachte: Element wird erst in Qt eingefügt, wenn Schlüssel verschieden von ∞ ist) T := T ∪ Tt od V := {1, . . . , t} E := {i, j}|1 ≤ i, j ≤ t, i 6= j und es gibt Kante von Knoten aus Ti zu Knoten aus Tj w(i, j) := min w(u, v) für {i, j} ∈ E, u ∈ T, v ∈ Tj , u, v benachbart od Algorithmus 8: Prim-Jarnik-2 Komplexität einer möglichen Implementierung: Zeilen 2–9: O(t · log r + m) bei Realisierung mit Fibonacci-Heaps; t Anzahl der Knoten vor Durchlauf Zeilen 10–12: O(m) mit baumbasierten Union-Find-Strukturen (Union-Operationen vor Find-Operationen) Problem: Wie ist r zu wählen? • Ist r klein, dann Zeit pro Durchlauf klein • Ist r groß, dann Anzahl der Durchläufe klein Setze r =def 2 2m/t , t Anzahl der Knoten vor Durchlauf 26 KAPITEL 1. GRAPHENALGORITHMEN • T1 • • • • • • • T3 • 1 • • T2 2 3 • • • 7 • 6 • 5 4 • 1 T1 3 T3 T2 1 • • T2 2 3 • • • • 7 • • • • • T4 6 T3 • T1 • • • • • 4 6 T4 T4 5 4 Abbildung 1.7: Algorithmus von Prim und Jarnik nach Fredman und Tarjan =⇒ O(m) Schritte pro Durchlauf Bestimmen Anzahl t′ der Bäume, die nach einem Durchlauf verbleiben auf Graphen mit t Knoten und m′ Kanten: t′ ≤ 2m′ r Begründung: • Jeder Baum Ti ist mit mindestens r Kanten inzident, die einen Knoten in Ti haben. • Jede Kante verbindet genau zwei Knoten. 2m t′ 2m ≥ 2 2m′ ·r ≥ 2r 2m Zu Beginn: kV k = n ≥ n =⇒ Anzahl Durchläufe (while-Schleife in Zeile 1) ≤ min{i | log log . . . log n ≤ 1} = log∗ n {z } | Damit: r′ = 2 =⇒ Prim-Jarnik-2 läuft in O(m · log∗ n) 1.4.3 i Algorithmus von Boruvka (Boruvka, 1926) Idee: Verteilte Version von Prim-Jarnik; lasse viele Bäume (Cluster, Superknoten) gleichzeitig wachsen (bis sie sich berühren). 1.4. MINIMALE SPANNBÄUME 27 Kante, die noch nicht betrachtet wurde Kante, die gerade betrachtet wird Kanten, die bereits im Spannbaum sind A A 1 E 3 5 B 9 6 10 E 4 C 3 5 B 9 6 10 8 2 7 D 1 8 2 7 D 1 8 2 A C 4 E 3 5 B 7 9 D 6 10 4 C Abbildung 1.8: Algorithmus von Boruvka Algorithmus Boruvka(G) Eingabe: gewichteter zusammenhängender Graph G = (V, E, w) Ausgabe: Minimaler Spannbaum T 1 2 3 4 5 6 7 8 T := (V, ∅) while kE(T )k < n − 1 do for Zusammenhangskomponente Ci von T do Bestimme leichteste Kante e = {u, v} ∈ E mit u ∈ Ci , v 6∈ Ci E(T ) := E(T ) ∪ {e} od od return T Algorithmus 9: Boruvka Korrektheit des Algorithmus folgt aus der blauen Regel, Lemma 3 auf Seite 21 (bis auf Behandlung von Tie-Breaks). Implementierungsaspekte: • Datenstruktur für Verwaltung des Waldes T unter Kanteneinfügung (⇒ O(1) Schritte pro Einfügung) • Nach jedem Durchlauf von Zeilen 3–6 folgt Traversierung von T mittels Tiefensuche (⇒ O(n) Schritte) • Zur Bestimmung leichtester Kanten Adjazenzliste 28 KAPITEL 1. GRAPHENALGORITHMEN Komplexität einer möglichen Implementierung: Zeilen 3–6: Traversierung von T in O(n) Bestimmung leichtester Kanten in O(m) ⇒ O(n + m) = O(m) Schritte Anzahl Durchläufe: Jede neue Kante vereinigt zwei Zusammenhangskomponenten. D.h. nach jedem Durchlauf höchstens Hälfte der Komponenten noch vorhanden ⇒ O(log n) Durchläufe Damit O(m log n) Schritte für Boruvka 1.4.4 Algorithmus von Chazelle (Chazelle, 2000) Betrachten noch einmal einen Boruvka zu unserem Beispiel: A ABCDE 1 8 2 E 3 5 5 1 9 6 10 C BC ADE B 7 D 5 2 1 1 4 4 A D E B C Boruvka-Algorithmus produziert Hierarchie bei Berechnung des minimalen Spannbaums bottom” up“. Beobachtung: Wenn wir Hierarchie wüssten, dann könnten wir auch Spannbaum leicht berechnen. Idee: Berechne Hierarchie top-down“! ” Es sei G = (V, E, w) ein gewichteter, ungerichteter zusammenhängender Graph. Vereinfachung: Alle Kantengwichte verschieden. MST(G) bezeichne eindeutigen minimalen Spannbaum von G. Eine Knotenmenge U ⊆ V heißt kontrahierbar gdw. G[U ] ∩ MST(G) zusammenhängend. (G[U ] = b durch U induzierter Teilgraph von G) Es sei e = {x, y} ∈ E. Dann heißt der Graph G/e = (V ′ , E ′ ) Kontraktion von G nach e, falls V ′ =V \ {x, y} ∪ {ve } E ′ = {u, v} ∈ E | {u, v} ∩ {x, y} = ∅ ∪ {u, ve } | {x, u} ∈ E \ {e} oder {y, u} ∈ E \ {e} Es sei[X ein weiterer ungerichteter Graph und {Vx | x ∈ V (X)} eine Partition von V , d.h. V = Vx und Vx ∩ Vy = ∅ für x 6= y, mit folgender Eigenschaft: G[Vx ] zusammenhängend für x alle x ∈ V (X). G heißt Minor von X ged. für alle x, y ∈ V (X) gilt: {x, y} ∈ E(X) ⇔es gibt u ∈ Vx , v ∈ Vy mit 1.4. MINIMALE SPANNBÄUME 29 {u, v} ∈ E Beispiel: X: Minor von X: 1 2 kein Minor von X: • 1 257 6 7 3 5 4 34 • 6 • • • G heißt zulässiger Minor von X falls Vx kontrahierbar für alle x ∈ V (X) Proposition 6: Es seien G und X ungerichtete zusammenhängende Graphen. G ist Minor von X gdw. X kann durch Kantenkontraktion aus G gewonnen werden. Beweis: klar Betrachten Minoren-Hierarchie H, d.h. Graphenfolge (X0 , X1 , . . . , Xα ) mit X0 = G, Xi ist zulässiger echter Minor von Xi+1 für 0 ≤ i ≤ α − 1 und Xd besteht nur aus einzelnem Knoten. H kann aufgefasst werden als balancierter Baum, d.h. Blätter liegen auf gleichem Level. Höhe von H ist d. Es sei z ∈ V (Xi ). Zu z korrespondiert in H eine Menge Vz ⊆ V (Xi−1 ). Insbesondere hat z in H genau kVz k Kinder. Zur Berechnung von MST(G) berechne rekursiv beginnend bei Wurzel von H für alle Knoten z in H MST(G[Vz ]) und vereinige“ alle Minimalen Spannbäume. ” 1 2 A B C D 4 3 7 E 9 F I 15 M 16 22 H 13 12 J 6 8 G 11 10 14 5 K 19 L 18 17 21 20 N 23 O 24 P X4 A...P X3 CDGHKLOP ABEF IJM N X2 IM ABEF X1 AB X0 A EF B E F JN CDGH I M J N CD I M J N C KP GH D G H LO K P L O K P L O 30 KAPITEL 1. GRAPHENALGORITHMEN 1 A B 4 3 7 E I 15 M A K N 23 B 7 E 15 M 14 11 K D A N 23 L X4 16 15 M P 24 14 22 A...P X3 ABEF IJM N X2 ABEF 9 IM 4 4 10 CDGH 13 12 18 JN 14 CDGHKLOP 21 KP LO 22 X1 AB CD 4 3 EF 9 I 15 M 14 16 22 10 GH 11 J 17 N 5 13 12 K 19 L 18 21 20 23 O 24 P 6 H 13 12 K L 19 21 20 23 O C 24 2 4 11 P D 5 G J N 8 18 F 17 D 5 G 11 B 10 I 21 O 7 E 9 20 N 3 H 19 22 1 2 4 J 17 6 18 17 22 M 13 12 J 16 8 15 P 5 G 10 I 24 2 C F 9 O 16 C F 10 14 I 21 4 3 E L 20 B 3 7 9 18 17 22 1 6 H 19 1 A 13 12 J 16 8 G 11 10 14 D 5 F 9 2 C 8 6 H 13 12 K 19 L 18 21 20 23 O 24 P 1.4. MINIMALE SPANNBÄUME 31 Problem: Wie können wir kontrahierbare Teilmengen entdecken, ohne MST zu berechnen? vorläufige Antworten: • Verwende Soft Heaps • Verwende rote Regel (Lemma 5 auf Seite 21) • Traversiere H in Postorder (berechne dafür Hierarchien für Graphen G[Vz ] rekursiv neu) Werden zeigen: (*) Für Graphen mit n Knoten und m Kanten kann eine Hierarchie der Höhe d in O(m+d3 ·n) Schritten berechnet werden. Wir können Höhe selbst wählen (keine Konstante!) • d groß ⇒ nz klein (nz = kVz k) • d klein ⇒ nz groß Geschickte Wahl: Es sei dz die Tiefe von z in H, d.h. die Anzahl der Kanten auf Pfad in H bis Blatt unterhalb von z. Definiere die Anzahl der Verzweigungen eines Knotens als 3 für dz = 1 s(t, 1) nz =def s(t − 1, s(t, dz − 1))3 für dz > 1 0 für dz = 0 mit t = min{i > 0 | n ≤ s(i, d)3 } 1 m /3 d=c n und s(1, j) = 2j für i > 0 s(i, 1) = 2 für i > 0 s(i, j) = s(i, j − 1) · s(i − 1, s(i, j − 1)) s(i, 0) = 0 für i, j > 1 für i > 0 Für Knoten z in H sei die Expansion von z in H, bezeichnet mit ξ(z), die Anzahl der Blätter in H unterhalb von z, d.h. die Anzahl der Knoten in G, die zu z kontrahiert werden. Proposition 7: Es gilt ξ(z) = s(t, dz )3 für alle z in H (falls n = s(t, d)3 ) 32 KAPITEL 1. GRAPHENALGORITHMEN Beweis: Induktion über dz Induktionsannahme: Fall dz = 0 klar. Für dz = 1 gilt ξ(z) = nz = s(t, 1)3 Induktionsschritt: Es sei dz > 1. Dann gilt ξ(z) = X ξ(z ′ ) z ′ Kind von z in H = nz · s(t, dz − 1)3 = s(t − 1, s(t, dz − 1))3 · s(t, dz − 1)3 = s(t, dz )3 Komplexität von Algorithmus“ von Chazelle mit (*) auf der vorherigen Seite: ” Vereinfachung: n = s(t, d)3 Zu zeigen: Algorithmus von Chazelle benötigt B · t · (m + d3 n) Schritte zur MST-Berechnung in Graphen mit m Kanten und n Knoten (B groß genug). Induktion über t. Induktionsannahme: t = 1: D.h. n = s(1, d)3 = (2d)3 = 8d3 ≤ 8c̃ · 2 2 m n 1/3 3 Damit gilt n ≤ 8 · c̃ · m. Verwende Boruvka-Algorithmus in der O(n ) Version (Übung) um den MST zu berechnen. Damit A · n2 ≤ 8| · {z c̃ · A} ·m ≤ B · t · (m + d3 n) Schritte. ≤B Induktionsschritt: Es sei t > 1. Damit nimmt die Induktionsvoraussetzung folgende Gestalt an (z innerer Knoten in H unterhalb der Wurzel): Induktionsvoraussetzung: MST für mz Kanten, nz Knoten und Tiefe dz benötigt B · (t − 1) · (mz + s(t, dz − 1)3 · nz ) Schritte wegen nz = s(t − 1, s(t, dz − 1))3 (dz > 2) Für die Berechnung von MST(G) benötigen wir dann höchstens (ohne Vorberechnung von H) ≤ X z∈H B · (t − 1) · (mz + s(t, dz − 1)3 · nz ) =B · (t − 1) · =B · (t − 1) · =B · (t − 1) · Prop. 7 Jedes Blatt höchstens in d Expansionen =B · (t − 1) · m+ X z m+ X z m+ X 3 s(t, dz − 1) nz 3 m+ 3 s(t, dz − 1) s(t − 1, s(t, dz − 1)) 3 s(t, dz ) z X ! ! ξ(z) z =B · (t − 1) · (m + d · n) ! ! 1.4. MINIMALE SPANNBÄUME 33 Inklusive Vorberechnung ergeben sich damit höchstens B · (t − 1)(m + dn) + B(m + d3 n) ≤ B · t(m + d3 n) Schritte Wie groß ist O(t · (m + d3 · n)) gemessen an n und m? Definieren Ackermann-Funktion und ihr Inverses: 2j A(i, j) =def 2 A(i − 1, A(i, j − 1)) für i = 0, j ≥ 0 für i > 0, j = 1 für i > 0, j > 1 Es gilt: • A(0, n) = 2n • A(1, n) = A(0, A(1, n − 1)) = 2 · A(1, n − 1) = 2n o ···2 n • A(2, n) = A(1, A(2, n − 1)) = 2A(2,n−1) = 22 ···2 • A(3, n) = A(2, A(3, n − 1)) = 22 o A(3, n − 1) Inverse“ Ackermann-Funktion nach Tarjan: ” i α(i, j) =def min k ≥ 1 | A k, 4 > log j j Lemma 8: l Es sei G ein Graph mit m Kanten und n Knoten. Für d = c· gilt t = O(α(m, n)). m n 1/3 m und t = min i > 0 | n ≤ S(i, d)3 Beweis: Mit A(i, j) ≥ 2j+1 für i ≥ 2, j ≥ 3 gilt für i ≥ 1, j ≥ 4: A(3i, j) = A(3i − 1, A(3i, j − 1)) ≥ A(3i − 1, 2j ) ≥ A(i, 2j ) (1.1) Außerdem gilt für i ≥ 1, j ≥ 4: A(3i, j) = A(3i − 1, A(3i, j − 1)) ≥ 2A(3i,j−1) = 2A(3i−1,A(3i,j−2)) ≥ 2A(i,j) (1.2) Damit: (1.2) (1.1) d S(9α(m, n) + 1, d) ≥ A(9α(m, n), d) ≥ 2A(3α(m,n),d) ≥ 2A(α(m,n),2 c groß ) ≥ 2A(α(m,n),4·⌈ n ⌉) > 2log n = n m D.h. kleinstes t mit n ≤ S(t, d)3 erfüllt auch t ≤ 9α(m, n) + 1 Jetzt: Hierarchie-Berechnung Berechne Hierarchie der Höhe d mit den spezifizierten Parametern n, nz usw. in PostorderReihenfolge über den Graphen G. Zunächst noch ohne Soft-Heaps. 34 KAPITEL 1. GRAPHENALGORITHMEN Algorithmus Minoren-Hierarchie(z, az ) Eingabe: Knoten z in H mit Tiefe dz Ausgabe: Knotenmenge Vz und Priority Queue aller Schnittkanten 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 if dz = 0 then Vz := {z} Initialisiere Priority Queue Qz aller zu z inzidenten Kanten in X0 = G return (Vz , Qz ) else while kVz k < nz do if kVz k = 0 . . . fi in Vorlesung nicht weiter erklärt {u, v} := ExtractMin(Qz ) (o.B.d.A. u ∈ Vz ; beachte: {u, v} ∈ E(Xdz )) (Vv , Qv ) := Minoren-Hierarchie(v, dz − 1) Kontrahiere Vv in Xdz −1 → Xdz Vz := Vz ∪ {v} Entferne aus Qv alle Kanten, die inzident zu Vz sind Qz := Qz ∪ Qv od return (Vz , Qz ) fi Algorithmus 10: Minoren-Hierarchie Erinnerung: 1. Soft Heap ist Datenstruktur, die Operationen • Insert(o, k), Merge(Q1 , Q2 ), Delete(k) amortisiert in O(1) Schritten • ExtractMin amortisiert in O(log 1ε ) Schritten unterstützt und zu jedem Zeitpunkt höchstens ε · n verdorbene Schlüssel enthält, wibei n die Gesamtzahl der Einfügungen ist. 2. verdorbene Schlüssel haben einen höheren Schlüsselwert als ursprünglich. Problem bei Verwendung von Soft Heaps: Es können die falschen Kanten aus Priority Queue herausgezogen werden, d.h. Kanten müssen nicht minimale Gewichte besitzen. Damit ist blaue Regel (Lemma 3 auf Seite 21) nicht mehr anwendbar für Korrektheit. Sei H die zu traversierende Minorenhierarchie. Es sei z der aktuell besuchte Knoten in H. Ein Pfad (z1 , . . . , zk ) in H heißt aktiv gdw. z1 ist Wurzel (dz1 = d) und zk = z. (Vz1 , . . . , Vzk ) sind die zugehörigen Knotenmengen; ist zi+1 linkes Kind von zi in H, dann ist Vzi = ∅. Eine Kante e ∈ E(G) heißt Schnittkante bzgl. (z1 , . . . , zk ) gdw. e ist inzident zu genau einem Knoten in Vz1 ∪ · · · ∪ Vzk Klar: Status von Kanten als Schnittkanten ändert sich im Zeitlauf. Eine Kante e = {u, v} heißt kritisch, gdw. e ist Schnittkante mit verdorbenem Gewicht, d.h. e ist in einem Soft Heap H mit w(e) < key H (e), u ∈ Vz und Vz wird kontrahiert. 1.4. MINIMALE SPANNBÄUME 35 Wir halten Informationen über Beziehungen der Vz1 , . . . , Vzk entlang eines aktiven Pfades (z1 , . . . , zk ) aufrecht: Invariante 1: Für alle 1 ≤ i < k besteht Kettenlink c(Vzi , Vzi+1 ) aus Kante e, deren aktuelle Kosten wakt (e) (Schlüsselwert von e in einem Soft Heap) folgende Eigenschaften erfüllen: 1. wakt (e) ≤ wakt (f ) für alle Schnittkanten bzgl. Vz1 ∪ · · · ∪ Vzi 2. wakt (e) ≤ wwork (i, j) für alle 1 ≤ j < i mit ( wakt (f ) , f kritisch wwork (f ) = w(f ) , sonst und wwork (i, j) = min{wwork (f ) | f ∈ E(Vzi , Vzj )} Bemerkung: Invariante 1 garantiert Kontrahierbarkeit. Invariante 2: Für alle 1 ≤ j ≤ k und für alle Schnittkanten e = {u, v} mit u ∈ Vzj gilt: e ist genau in einem der Soft Heaps H(j) oder H(i, j) mit 1 ≤ i < j enthalten. Außerdem gilt: • e ∈ H(j) ⇒ es gibt w mit {v, w} ∈ H(i, j) für 1 ≤ i < j • e ∈ H(i, j) ⇒ es gibt w ∈ Vzi mit {v, w} ∈ E(G) aber für alle w ∈ Vzi+1 ∪ · · · ∪ Vzj−1 gilt {v, w} 6∈ E(G) Bemerkung: Invariante 2 wird zur Kontrolle kritischer Kanten verwendet. Betrachten nun Operationen Retraction ind Extension zur Traversierung von H. 1. Retraction (= b Pop auf Rekursionsstack) Sei (z1 , . . . , zk ) aktiver Pfad. Folgendes wird ausgeführt: (a) Kontrahiere Vzk und neuer Knoten v̂k wird in Vzk−1 aufgenommen. (b) Aktualisiere Kettenlink c(Vzk−1 , Vzk ) Invarianten: • Invariante 1: klar • Invariante 2: → O(k) Schritte (a) Soft Heaps H(k), H(k − 1, k) werden zerstört (b) alle verdorbenen Kanten werden entfernt (c) verbleibende Kanten werden entsprechend ihrer Endpunkte partitioniert, d.h. in Mengen Pv mit gleichem Endpunkt v eingeordnet. (d) für alle Pv wähle Kante e mit minimalem Gewicht und eliminiere alle anderen Kanten aus G. (e) füge Kanten ev in entsprechenden Soft Heap ein 36 KAPITEL 1. GRAPHENALGORITHMEN (f) Verschmelze H(i, k) mit H(i, k − 1) 2. Extension (= b Push auf Rekursionsstack) Sei (z1 , . . . , zk ) aktiver Pfad. Folgendes führen wir aus: (a) Führe ExtractMin auf allen Soft-Heaps aus; sei e = {u, v} Kante mit minimalem aktuellem Gewicht; e heißt Erweiterungskante. (b) Bestimme i∗ = min 1 ≤ i ≤ k es gibt i < j ≤ k mit wwork (i, j) ≤ wakt (e) ∪ {∞} Falls i∗ < ∞ führe Fusion aus: Es sei f Kante mit wwork (I ∗ , j ∗ ) = wwork (f ) ≤ wakt (e); es sei außerdem a ∈ Vzi∗ der zu f inzidente Knoten. Kontrahiere alle Knotenmengen Vzi∗ +1 , . . . , Vzk in a (wie bei Retraction, aber ohne Einfügen neuer Kanten). (c) Vzk∗ := {v} und der Kettenlink zwischen Vzk∗ −1 und Vzk∗ wird e; ( i∗ + 1 falls Fusion erforderlich beachte k ∗ := k + 1 sonst (d) Entferne alle Kanten aus Heaps 6= e inzident zu v (e) Neuer aktiver Pfad ist nun (z1 , . . . , zk∗ ) (f) Füge alle neuen Schnittkanten, die zu v inzident sind, in die entsprechenden Heaps ein. Hierarchietraversierung nun wie folgt: Für jeden Knoten zk mit dzk ≥ 1 führe Extension aus, so lange es geht (d.h. bis Größenbedingung erfüllt ist). Algorithmus Chazelle(G, t) Eingabe: ungerichteter gewichteter Graph G, Parameter t Ausgabe: Minimaler Spannwald MSF(G) 1 2 3 4 5 6 7 8 if t = 1 oder kV k ≤ N0 then Bestimme MSF(G) mittels Boruvka-Algorithmus in O(n2 )-Version fi Führe c Boruvka-Phasen aus; X Menge der kontrahierten Kanten Berechne Minorenhierarchie H mittels Retraktion und Extension Bestimme S Graph B der kritischen Kanten F := z∈H MSF(G[Vz ] \ B, t − 1) return MSF(F ∪ B, t) ∪ X Algorithmus 11: Chazelle Zur Korrektheit des Algorithmus: Es sei G = (V, E, w) zusammenhängender gewichteter Graph. Eine Knotenmenge U ⊆ V heißt streng kontrahierbar gdw. für alle Kanten e, f ∈ E(G) mit ke ∩ U k = kf ∩ U k = 1 ein Pfad (h0 , h1 , . . . , hℓ ) mit h0 = e, hℓ = f und hi ∈ E(G[U ]) für 1 ≤ i ≤ ℓ − 1 existiert, für den w(hi ) ≤ min{w(h0 = e), w(hℓ = f )} für alle 1 ≤ i ≤ ℓ − 1 gilt. Proposition 9: Es sei G = (V, E, w) zusammenhängender gewichteter Graph. Ist U ⊆ V streng kontrahierbar, so ist U kontrahierbar. 1.4. MINIMALE SPANNBÄUME 37 Beweis: Angenommen U wäre nicht kontrahierbar. D.h. G[U ] ∩ MST(G) hat mehr als eine Zusammenhangskomponente. Sei p = (e1 , . . . , eℓ ) kürzester Pfad in MST(G) zwischen zwei Zusammenhangskomponenten U1 und U2 , seien u1 und u2 die zugehörigen Knoten. Es gilt ℓ ≥ 2 und ei 6∈ E(G[U ]) für alle 1 ≤ i ≤ ℓ, da p kürzester Pfad ist. Betrachten Pfad q in G[U ], der u1 und u2 verbindet. Damit ist (p, q) Kreis in G. Nach Lemma 5 (rote regel) auf Seite 21 liegt schwerste Kante g nicht in MST(G). D.h. g ∈ E(G[U ]). Widerspruch zu U streng kontrahierbar. Lemma 10: Zum Zeitpunkt der Kontraktion ist jede Knotenmenge Vz streng kontrahierbar bezüglich wwork . Beweis: Verwende Invariante 1 auf Seite 35. Für gewichteten Graphen G sei G0 der zugehörige Graph nach Ausführung der Boruvka-Phasen. Lemma 11: Ist eine Kante e ∈ E(G) nicht kritisch und liegt e nicht in F , dann gehört e nicht zu MSF(G0 ). Beweis: Sei G∗0 der Graph, der aus G0 hervorgeht, indem alle in Schritt (5) entfernten Kanten eliminiert werden. Wir unterscheiden zwei Fälle: 1. Es gilt e ∈ E(G∗0 ). Dann gibt es maximalen“ Minor Xi , der e enthält (in Xi+1 wäre e kontrahiert). D.h. es ” gibt z mit e ∈ Vz . Da e nicht kritisch und nicht in F , folgt e nicht in MSF(G∗0 ). Damit e nicht in MSF(G0 ). 2. Es gilt e 6∈ E(G∗0 ). Verwende Lemma 10 auf dieser Seite. Es folgt (mit einigen Argumenten) e 6∈ MSF(G0 ) Zeigen mittels Induktion, dass Algorithmus von Chazelle für Graphen G den MSF(G) berechnet: Induktionsanfang: t = 1 oder n ≤ N0 : Klar wegen zeilen 1–3. Induktionsschritt: t > 1, n > N0 : Wir können annehmen, dass G zusammenhängend ist. In Zeile (4) werden nur MST-Kanten kontrahiert. Nach Induktionsvoraussetzung bestimmen Zeile (7) (für t − 1) und in Zeile (8) der Aufruf MSF(F ∪ B, t) (für n′ < n) korrekte MSF. Nach Lemma 11 folgt deshalb Korrektheit von Zeile 8. Überlegungen zur Komplexität des Algorithmus von Chazelle: Lemma 12: Für Graph G sei G0 der Graph nach den Boruvka-Phasen im Algorithmus von Chazelle, m0 sei die Anzahl der Kanten von G0 . Zum Aufbau der Hierarchie H werden maximal 4m0 Kanteneinfügungen in Soft Heaps vorgenommen. Beweis: Führen amortisierte Analys mittels Bankkontomethode durch. Kanten werden zum ersten Mal bei Extension eingefügt. Wählen: • Gehalt G = 4e(bei Ersteinfügung) • Sparstrategie: 38 KAPITEL 1. GRAPHENALGORITHMEN – Jede Kante in H(j) spart 2e. – Für alle i, j und Knoten v außerhalb Vz1 ∪· · ·∪Vzk haben die ℓ zu v inzudenten Kanten Gesamtsparvolumen von ℓ + 2e falls ℓ > 0, sonst 0e. Klar: mit 4e kann Sparstrategie bei erster Einfügung eingehalten werden; Kante kommt in Heap H(i, k). Betrachte Retraktion: Sei e = {u, v} Kkante aus H(k − 1, k) ∪ H(k), die wieder eingefügt werden soll. 1. e ∈ H(k − 1, k), d.h. v inzident zu Kante ẽ ∈ H(i, k − 1), nach Invariante 2 auf Seite 35; damit: Füge e ub H(k−1): Nach Sparstrategie ≥ 3e für e, k−1, k; bezahle 1e für Einfügen, behalte 2e für Sparstrategie. 2. e ∈ H(k) und v inzident zu Kante ẽ ∈ H(k − 1, k), so füge e in H(k − 1) ein. Nach Sparstrategie ≥ 2e+3e; bezahle 1e für Einfügen, behalte ≥ 2e für Sparstrategie. 3. e ∈ H(k), füge e in H(i, k − 1) ein. Nach Sparstrategie ≥ 2e für e; bezahle 1e für Einfügen, behalte 1e für Sparstrategie. Fusion wird analog behandelt. Wie viele kritische Kanten gibt es? Mpssen kritische Kanten in Heaps H(·) und H(·, ·) zählen. Für Knoten z und z ′ in H mit z ′ ∈ Hz (Knoten in H unterhalb von z): • C(z, z ′ ) =def Menge der kritischen Kanten im Heap H(i, j) mit zi = z und zj = z ′ auf aktivem Pfad (z1 , . . . , zi , . . . , zj , . . . , zk ) zum Zeitpunkt des Verschwindens von H(i, j) (durch Merge oder Verwerfen). • µ(z, z ′ ) =def maximake Anzahl von Kanten mit inzidentem Knoten v außerhalb Vz1 ∪ · · · ∪ Vzk in H(i, j) (mit i und j wie oben) Wollen µ beschränken: • Merge von H(i, j) und H(i, j ′ ) mit j ′ > j: µ(z, z ′ ) bleibt unverändert (nach Invariante 2 auf Seite 35) • Insert in H(i, j) bei Extension: µ(z, z ′ ) := 1 • Insert in H(i, j) bei Retraktion: µ(z, z ′ ) höchstens inkrementiert (mit sofortiger Verschmelzung nach H(i, j − 1) (?)) → µ(z, z ′ ) ≤ h(H) ≤ d. 1.4. MINIMALE SPANNBÄUME 39 Damit: sei C =def Menge aller kritischen Kanten. H(·, ·) [ [ ′′ C(z, z ′ ) \ |Ck ≤4ε · m0 + C(z, z ) z,z′ ∈H z ′′ ∈Hz ′ ′ z ∈Hz [ X ′′ C(z, z ′ ) \ C(z, z ) =4ε · m0 + z ′′ ∈Hz ′ z,z ′ ∈H H(·) z ′ ∈Hz =4ε · m0 + ≤4ε · m0 + X kC(z, z ′)k − z,z ′ ∈H z ′ ∈Hz X ′ X ′′ z ∈Hz ′ z,z ∈H z ′ ∈Hz z ′′ Kind von z ′ ≤4ε · m0 +d · X z ′′ ∈Hz ′ z ′′ Kind von z ′ µ( z, z ′′) + | {z } ≤d d+1 · n 0 + 4 · ε · m0 2 kC(z, z ′′ )k + ′ X ′ z ,z ∈H z ′ Kind von z z ′′ Anzahl kritischer KanX ten, die aus H(i, j ′ ) gelöscht werden ′′ z ∈Hz ′ während Extension Kind von z ′ kC(z, z ′)k ≤8ε · m0 +d3 · n0 = O(m0 + d3 · n0 ) Damit: Schritte 4 und 5 benötigen O(m0 + d3 · n0 ) Schritte. Gesamtkomplexität von MSF ergibt sich mittels ähnlicher Analyse wie eingangs zu O(t·(m+d3 n)) 40 KAPITEL 1. GRAPHENALGORITHMEN Kapitel 2 Algorithmen für Flüsse und Matchings 2.1 Flüsse und Schnitte Betrachten folgendes Szenario: 1/1 1 1/1 1/2 s 4 1/1 2 2/2 5 0/1 1/2 3/3 3 2/2 1/3 1/2 3/3 t 1/1 6 Frage: Sind 5 Pakete maximale Anzahl Pakete, die von s nach t gesendet werden können? Ein Flussnetzwerk N = (V, E, e, s, t) ist ein gerichteter Graph G = (V, E) mit nicht-negativen Kantengewichten, d.h. c : E → N, der zwei Knoten s, t ∈ V enthält, so dass s keine eingehenden und t keine ausgehenden Kanten besitzt. Der Knoten s ∈ V heißt Quelle von N , der Knoten t ∈ V heißt Senke von N . Für eine Kante e ∈ E heißt c(e) die Kapazität von e. 1 1 1 s 2 4 1 2 3 5 1 3 2 3 2 2 2 3 t 1 6 Es sei N = (V, E, c, s, t) ein Flussnetzwerk. Ein (zulässiger) Fluss f für N ist eine Abbildung f : E → N, die folgende Bedingungen erfüllt: 41 42 KAPITEL 2. ALGORITHMEN FÜR FLÜSSE UND MATCHINGS 1. Für alle e ∈ E gilt: 0 ≤ f (e) ≤ c(e) (Kapazitätsregel) 2. Für alle Knoten v ∈ V \ {s, t} gilt: X f (e) = X f (e) e∈E + (v) e∈E − (v) (Erhaltungsregel), wobei E − (v) =def {(u, v) ∈ E | u ∈ V } E + (v) =def {(v, u) ∈ E | u ∈ V } Für Kante e ∈ E heißt f (e) Fluss über e. Der Betrag eines Flusses f , bezeichnet mit |f |, ist definiert als X f (e) |f | =def e∈E + (s) Der maximale Fluss f ∗ für N ist Fluss mit maximalem Betrag: 1 1/1 s 2/2 1/1 4 1/1 2 3 5 1/1 1/2 3/3 1/2 2/2 1/3 2/2 3/3 t 1/1 6 Ziel: Berechne maximale Flüsse möglichst effizient. Alternativer Zugang zu Nerzwerkflüssen: Es sei N = (V, E, c, s, t) ein Flussnetzwerk. Ein Schnitt in N ist eine Partition ξ = (Vs , Vt ) mit s ∈ Vs , t ∈ Vt , Vs ∩ Vt = ∅ und Vs ∪ Vt = V . Eine Kante e ∈ E, e = (u, v) heißt bezüglich ξ 1. Vorwärtskante gdw. u ∈ Vs und v ∈ Vt 2. Rückwärtskante gdw. u ∈ Vt und v ∈ Vs Es sei f : E → N ein Fluss in N . Der Fluss über den Schnitt ξ = (Vs , Vt ), bezeichnet f (ξ), ist definiert als X X f (ξ) =def f (e) − f (e) e Vorwärtskante e Rückwärtskante 2.2. MAXIMALER FLUSS 1 1/1 s 2/2 43 1/1 4 1/1 2 3 5 1/1 1/2 3/3 1/2 2/2 1/3 2/2 3/3 t 1/1 6 Vs = {s, 1, 2, 6} Vt = {t, 3, 4, 5} Fluss über ξ = (Vs , Vt ): f (ξ) = 8 − 2 = 6 Lemma 13: Es sei N ein Flussnetzwerk und es sei f ein Fluss. Für jeden Schnitt ξ von N gilt |f | = f (ξ). Beweis: Betrachte für ξ = (Vs , Vt ) den Wert X X F =def v∈Vs e∈E + (v) f (e) − X e∈E − (v) Nach Erhaltungsregel (für alle Knoten in Vs \ {s}) gilt X f (e) = |f | F = f (e) e∈E + (s) Andererseits: Ist e weder Vorwärts- noch Rückwärtskante für ξ, so enthält F entweder f (e) und −f (e) oder nichts. D.h. F = f (ξ). Für ein Flussnetzwerk N und einen Schnitt ξ ist die Kapazität von ξ definiert als X c(ξ) =def c(e) e Vorwärtskante Lemma 14: Es sei N ein Flussnetzwerk und ξ ein Schnitt von N . Für jeden Fluss f gilt f (ξ) ≤ c(ξ). Beweis: klar wegen Kapazitätsregel. Satz 15: Es sei N ein Flussnetzwerk. Für jeden Fluss f und jeden Schnitt ξ gilt |f | ≤ c(ξ). 2.2 Maximaler Fluss Es sei N = (V, E, c, s, t) ein Flussnetzwerk. Es sei f : E → N ein Fluss in N . Für eine Kante e = (u, v) ∈ E ist die Restkapazität von u nach v bezüglich f , bezeichnet mit ∆f (u, v), definiert als ∆f (u, v) =def c(e) − f (e) ∆f (v, u) =def f (e) wenn keine bidirektionalen Kanten im Netzwerk vorkommen. 44 KAPITEL 2. ALGORITHMEN FÜR FLÜSSE UND MATCHINGS Es sei p ein Pfad in N von s nach t, wobei Kanten in beiden Richtungen traversiert werden können. Die Restkapazität von e in p ist definiert als ( c(e) − f (e) falls e Vorwärtskante in p ∆f (e) =def f (e) falls e Rückwärtskante in p Die Restkapazität eines Pfades p ist definiert als ∆f (p) =def min ∆f (e) e∈p Ein augmentierender Pfad p für den Fluss f ist ein Pfad von s nach t mit ∆f (p) > 0, d.h. 1. f (e) < c(e) für Vorwärtskante e 2. f (e) > 0 für Rückwärtskante e 1 0/1 1/2 s (1) 0/1 4 (1) 1/1 0/2 (1) (1) 2 0/1 0/2 2/3 3 |f | = 3 1 2/2 5 2/3 (2) 1/2 2/3 1/1 t s 1/2 1/1 2 0/2 2/3 6 3 1/2 0/2 1/1 (1) 0/1 4 0/1 5 2/3 1/3 2/2 t 1/1 6 |f | = 4 ∆f (p) = 1 Lemma 16: Es sei N ein Flussnetzwerk und es sei f ein Fluss in N . Für jeden augmentierenden Pfad p in N gibt es einen Fluss f ′ mit |f ′ | = |f | + ∆f (p). Beweis: Wir definieren f ′ : E → N wie folgt: falls e 6∈ p f (e) f ′ (e) = f (e) + ∆f (p) falls e Vorwärtskante in p f (e) − ∆f (p) falls e Rückwärtskante in p Es gilt: 1. f ′ (e) ≤ c(e) für alle Kanten e ∈ E 2. f ′ (e) ≥ f (e) ≥ 0 für alle Nicht-Rückwärtskanten e; für Rückwärtskante e gilt: f ′ (e) = f (e) − ∆f (p) ≥ 0 | {z } ≤f (e) 3. Erhaltungsregel gilt klarerweise. 2.2. MAXIMALER FLUSS 45 Damit: f ′ zulässiger Fluss in N mit |f ′ | = |f | + ∆f (p). Lemma 17: Es sei N ein Flussnetzwerk. Gibt es für einen Fluss f in N keinen augmentierenden Pfad bezüglich f , so ist f maimaler Fluss. Darüber hinaus gibt es einen Schnitt ξ mit |f | = c(ξ). Beweis: Angenommen es gibt keinen augmentierenden Pfad in N . Wir konstruieren einen Schnitt ξ wie folgt: Ein augmentierender Pfad von s nach v ∈ V ist ein Pfad mit echt positiven Restkapazitäten. Definiere Vs =def {v ∈ V | es gibt augmentierenden Pfad von s nach v} ∪ {s} Vt =def V \ Vs Es gilt: t 6∈ Vs , d.h. ξ = (Vs , Vt ) ist Schnitt. Es sei e eine Kante über ξ. Dann gilt ∆f (e) = 0, d.h. ( c(e) falls e Vorwärtskante in ξ f (e) = 0 falls e Rückwärtskante in ξ Dann gilt |f | = f (ξ) = c(ξ). Nach Satz 15 auf Seite 43 ist |f | maximal. Satz 18: (Max-Flow, Min-Cut Theorem) Es sei N ein Flussnetzwerk. Dann gilt max f Fluss in N |f | = min ξ Schnitt in N c(ξ) Beweis: Folgt direkt aus Satz 15 auf Seite 43 und Lemma 17. Satz 18 gibt Idee zu Algorithmen: Suche solange nach augmentierenden Pfaden und aktualisiere Flüsse, bis kein augmentierender Pfad mehr existiert. 46 KAPITEL 2. ALGORITHMEN FÜR FLÜSSE UND MATCHINGS 2.2.1 Algorithmus von Ford und Fulkerson Algorithmus Ford-Fulkerson(N ) Eingabe: Flussnetzwerk N = (V, E, c, s, t) Ausgabe: Maximaler Fluss f in N 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Stop := FALSE for e ∈ E do f (e) := 0 od while ¬Stop Traversiere (V, E, c) von s aus, um augmentierenden Pfad p für f zu finden if Pfad p existiert then ∆ := +∞ for e ∈ p do if ∆f (e) < ∆ then ∆ := ∆f (e) fi od for e ∈ p do if e Vorwärtskante in p then f (e) := f (e) + ∆ else f (e) := f (e) + ∆ fi od else Stop := TRUE fi od Algorithmus 12: Ford-Fulkerson Beispiel: Abbildung 2.1 auf der nächsten Seite Implementierungshinweise zu Zeile 5: Zum Finden eines augmentierenden Pfades betrachte Restnetzwerk Rf = (V, Ẽ) zum Fluss f , definiert als Ẽ =def {(u, v) | e = (u, v) ∈ E, f (e) < c(e)} ∪ {(v, u) | e = (u, v) ∈ E, f (e) > 0} Beispiel: Abbildung 2.2 auf der nächsten Seite Damit (für Zeile 5): • bestimme Restnetzwerk Rf zum aktuellen Fluss f • traversiere Rf mittels z.B. Tiefensuche oder Breitensuche ausgehend von s und bestimme Pfad von snach t ⇒ benörigen zur Bestimmung eines augmentierenden Pfades O(m) Schritte 2.2. MAXIMALER FLUSS 0/1 1 0/1 s 0/2 0/1 0/1 0/1 2 1/1 0/3 0/2 0/3 3 1/1 0/1 1/1 2/2 1/1 2/3 0/2 2/3 3 3/3 2/2 s t 0/1 0/3 0/2 0/1 ∆f (p) = 2 1/1 4 1/1 2 2/2 1/2 3/3 5 1/1 1/3 1/2 3 1/1 6 2/2 |f ∗ | = 6 |f | = 6 Abbildung 2.1: Algorithmus von Ford-Fulkerson s 1 4 2 5 3 6 t Abbildung 2.2: Restnetzwerk Rf für |f | = 2 • 0/k s 0/k t 0/1 0/k 0/k • • 0/k s 1/k t 1/1 0/k 1/k t 6 0/2 3/3 ∆f (p) = 1 3/3 5 1/1 1/1 6 2/2 |f | = 5 5 0/2 2/2 2 |f | = 3 2/2 4 1/1 1 0/2 2 1/1 3 4 0/1 ∆f (p) = 1 0/3 ∆f (p) = 1 1/1 1 2/2 s t t 6 0/2 1/1 6 0/2 |f | = 2 2/3 5 0/3 0/2 1 1/2 1/3 5 1/1 |f | = 1 0/2 0/2 2 3 0/2 4 0/1 0/3 4 1/1 2/2 1/2 s t ∆f (p) = 1 0/1 1 0/1 6 0/2 |f | = 0 0/2 0/3 5 0/3 0/2 0/1 1 0/2 2 3 s 4 0/1 0/3 s 47 • 1/k s t 0/1 1/k 1/k • Abbildung 2.3: Kritisches Beispiel für Ford-Fulkerson 1/k • t 48 KAPITEL 2. ALGORITHMEN FÜR FLÜSSE UND MATCHINGS Komplexität von Ford-Fulkerson: In jedem Durchlauf (Zeile 5 – 20) wird Betrag des aktuellen Flusses mindestens inkrementiert, d.h. im schlechtesten Fall |f ∗ | Durchläufe. ⇒ Algorithmus von Ford-Fulkerson benötigt O(|f ∗ | · m) Schritte In einem kritisches Beispiel für Ford-Fulkerson (Abbildung 2.3 auf der vorherigen Seite) werden 2k Iterationen ausgeführt, dabei sind zwei genug unabhängig von k! 2.2.2 Algorithmus von Edmonds und Karp Verwende Breitensuche zur Bestimmung augmentierender Pfade (im Restnetzwerk) und führe genauere Analyse durch. Es sei N = (V, E, c, s, t) ein Flussnetzwerk und es sei f ein Fluss in N . Für einen Pfad p = (e1 , . . . , eℓ ) mit ei ∈ E heißt ℓ die Länge von p. Für einen Knoten v ∈ V ist die Restdistanz df (v) von v bezüglich f definiert als df (v) =def minimale Länge eines augmentierenden Pfades in N bezüglich f von s nach v, oder +∞, falls kein solcher Pfad existiert. Lemma 19: Es sei N = (V, E, c, s, t) ein Flussnetzwerk. Es seien f, g Flüsse in N , wobei g aus f hervorgeht durch Augmentierung eines Pfades p minimaler Länge. Dann gilt für alle v ∈ V df (v) ≤ dg (v) Beweis: (Widerspruch) Angenommen es gibt Knoten, für die Restdistanzgleichung nicht gilt. Es sei v ∈ V Knoten mit dg (v) minimal unter allen diesen Knoten. D.h. es gilt 1. df (v) > dg (v) 2. dg (v) ≤ dg (w) für alle w ∈ V mit df (w) > dg (w) Es sei q ein augmentierender Pfad bezüglich g minimaler Länge von s nach v. Es sei w der Vorgängerknoten von v in q; es sei e die Kante in q, die v mit w verbindet. Damit gilt: q 3. ∆g (w, v) > 0 w s 4. dg (v) = dg (w) + 1 p t p v 5. df (w) ≤ dg (w) (wegen 1. und 2.) Zeigen zunächst ∆f (w, v) = 0. Angenommen ∆f (w, v) > 0, d.h. es gibt augmentierenden Pfad von w nach v bezüglich f . Damit 5. 4. df (v) ≤ df (w) + 1 ≤ dg (w) + 1 = dg (v) zu 1. 2.3. MAXIMALE MATCHINGS 49 D.h. obere Annahme oder ∆f (w, v) = 0. Betrachte Fall, dass ∆f (w, v) = 0. Wegen ∆f (w, v) = 0 und ∆g (w, v) > 0 (3.) muss p die Kante e von v nach w traversieren. Damit (5.) (4.) df (v) = df (w) − 1 ≤ dg (w) − 1 < dg (v) − 2 < dg (v) zu 1. Lemma 20: Algorithmus von Edmonds und Karp benötigt zur Bestimmung eines maximalen Flusses in Netzwerk mit n Knoten und m Kanten höchstens n · m Augmentierungen. Beweis: Es sei fi der aktuelle Fluss vor der i-ten Augmentierung bei Edmonds-Karp, pi sei der zugehörige augmentierende Pfad. Kante e in pi heißt Engpass von pi , falls ∆fi (e) = ∆fi (pi ). Beachte: Jeder augmentierende Pfad besitzt einen Engpass. Wir zeigen, dass jede Kante höchstens n-mal Engpass sein kann. Es seien u, v ∈ V Knoten mit inzidenter Kante e ∈ E. Seien pi und pk zwei augmentierende Pfade kürzester Länge mit i < k, so dass e Engpass ist und von u nach v traversiert wird. Damit gilt: 1. ∆fi (u, v) > 0 2. ∆fi+1 (u, v) = 0 3. ∆fk (u, v) > 0 D.h. es gibt pj mit i < j < k, so dass e von v nach u traversiert wird. Damit gilt: pj kürzester Pfad dfj (u) = dfj (v) + 1 Lemma 19 ≥ pi kürzester Pfad dfi (v) + 1 = dfi (u) + 2 Da Restdistanz höchstens n ist, kann jede Kante höchstens n-mal Engpass sein ( n2 -mal für jede Orientierung). D.h. höchstens n · m Augmentierungen. Komplexität von Edmonds-Karp: • O(n · m) Augmentierungen • O(m) pro Augmentierung für Breitensuche ⇒ O(n · m2 ) Schritte Bemerkung: Es gibt Algorithmen, die nicht auf Max-Flow, Min-Cut z.B. Theorem 2basieren, Push-Relabel-Algorithmus von Goldberg und Tarjan mit Laufzeit O n · m · log nm 2.3 Maximale Matchings Ziel: Anwendung von Flussalgorithmen auf Matching-Probleme in bipartiten Graphen. 50 KAPITEL 2. ALGORITHMEN FÜR FLÜSSE UND MATCHINGS Es sei G = (V, E) ein ungerichteter Graph. G heißt bipartit gdw. es gibt X, Y ⊆ V mit X ∩ Y = ∅, X ∪ Y = V und für alle e ∈ E gilt ke ∩ Xk = ke ∩ Y k = 1, d.h. ein Endpunkt liegt in X und einer in Y . Ein Matching in G ist eine Kantenmenge M ⊆ E mit e ∩ f = ∅ für alle e, f ∈ M, e 6= f , d.h. Kanten in M haben keine gemeinsamen Knoten. Matching maximaler Kardinalität heißt maximales Matching, bezeichnet M ∗ . Bsp.:: X =Menge der Vorlesungen; Y =Menge der Hörsäle; Kante e = {x, y} bedeutet, dass Vorlesung x in Hörsaal y gehalten werden kann (weil z.B. Projektoren, Tafeln o.ä. vorhanden sind). Maximales Matching gibt an, wie viele Vorlesungen gleichzeitig gehalten werden können. Jetzt: Formulieren Matching-Problem als Fluss-Problem. Es sei G = (V, E) ein bipartiter Graph. Definiere NG = (VG , EG , c, s, t) wie folgt: • VG =def V ∪ {s, t} (s, t 6∈ V ) • EG =def {(s, v) | v ∈ X} ∪ {(u, v) | u ∈ X, v ∈ Y, {u, v} ∈ E} ∪ {(v, t) | v ∈ Y } • c ≡ 1, d.h. für alle e ∈ EG gilt c(e) = 1 • • • • • • • • • • • • • s • • • • • t • • Proposition 21: Es sei G bipartiter Graph und NG das zugehörige Flussnetzwerk. Ist M ∗ maximales Matching in G und f ∗ maximaler Fluss in NG , so gilt kM ∗ k = |f ∗ |. Beweis: Zeigen, dass jedes Matching M einen Fluss fM definiert mit kM k = |fM |, und umgekehrt jeder Fluss f ein Matching Mf mit |f | = kMf k. 1. Es sei M ein Matching in G. Definiere fM : EG → N wie folgt für e ∈ EG : fM (e) =def 1 1 1 0 fallse ∈ M fallse = (s, v)und es gibt w mit{v, w} ∈ M fallse = (v, t)und es gibt w mit{v, w} ∈ M sonst Klar: f erfüllt Kapazitätsregel und Erhaltungsregel. Außerdem: |fM | = kM k. 2. Es sei f Fluss in NG . Definiere Menge M ⊆ E wie folgt: {u, v} ∈ M ⇔def f (e) = 1, e = (u, v) ∈ EG , {u, v} ∩ {s, t} = ∅ 2.4. FLÜSSE MIT MINIMALEN KOSTEN 51 Müssen zeigen, dass M Matching ist. Da c(e) ∈ {0, 1} für alle e ∈ EG , folgt f (e) ∈ {0, 1} − für alle e ∈ EG . Für alle x ∈ XM gilt |EG (x)k = 1, damit gibt es nach Erhaltungsregel + genau ein y ∈ Y mit e = (x, y) ∈ EG und f (e) = 1. Analog gilt kEG (y)k = 1 für alle y ∈ YM , damit existiert genau ein x ∈ X mit e = (x, y) ∈ EG und f (e) = 1. D.h. für jedes x ∈ X gibt es höchstens ein y ∈ Y mit {x, y} ∈ M und umgekehrt. D.h. M ist Matching. Außerdem: |Mf k = |f |. • • • • • • • • • • • • • s • • • • • t • • Komplexität von Ford-Fulkerson für maximales Matching: • Berechnung von NG zu gegebenem G in O(n+ m); NG hat n+ 2 Knoten und n+ m Kanten. • Es gilt |f ∗ | = kM ∗ k ≤ n2 . Damit Berechnung des maximalesn Flusses in NG in O(n(n + m)) = O(n · m), wenn G zusammenhängend. ⇒ O(n · m) Schritte zur Berechnung eines maximalen Matchings. 2.4 Flüsse mit minimalen Kosten Bisher: kein Unterschied, über welchen augmentierenden Pfad eine Flusseinheit geschickt wurde, d.h. alle Kanten gleich teuer. Jetzt: zusätzlich für jede Kante e auch Gewicht w(e) mit w : E → N. Gegeben Flussnetzwerk N = (V, E, c, s, t) mit Gewichtsfunktion w und Fluss f in N , so sind die Kosten e(f ) von f definiert als w(f ) =def X e∈E w(e) · f (e) Ein Fluss f ist Fluss mit minimalen Kosten, falls w(f ) ≤ w(f ′ ) für alle Flüsse f ′ mit |f | = |f ′ |. Ziel: Bestimme Fluss mit minimalen Kosten unter allen maximalen Flüssen. Es sei p = (e1 , . . . , ek ) augmentierender Pfad in N bezüglich Fluss f . Dann sind die Kosten w(p) von p definiert als X X w(p) =def w(e) − w(e) e Vorwärtskante in p e Rückwärtskante in p 52 KAPITEL 2. ALGORITHMEN FÜR FLÜSSE UND MATCHINGS Ein augmentierender Kreis p in N bezüglich f ist ein augmentierender Pfad, dessen erster und letzter Knoten identisch sind, d.h. p = (v0 , v1 , . . . , vk ) mit • vi ∈ V für alle 0 ≤ i ≤ k • v0 = vk und vi 6= vj für alle 0 ≤ i < j < k • (vi , vi+1 ) ∈ E oder (vi+1 , vi ) ∈ E für alle 0 ≤ i < k • ∆f (vi , vi+1 ) > 0 für alle 0 ≤ i < k Restkapazität und Kosten übertragen sich sinngemäß auf augmentierende Kreise. Beachte: Augmentierung entlang eines Kreises führt zu keiner Betragsänderung des Flusses, wohl aber zu veränderten Kosten. u u 1/2,3 1/3,2 s 0/3,1 t 2/2,3 2/4,1 v 0/2,3 1/3,2 s 1/3,1 t 2/2,3 3/4,1 v • |f | = 3 • |f | = 3 • w(f ) = 3 + 2 + 2 + 6 = 13 • w(f ) = 3 + 1 + 6 + 2 = 12 • p = (s, v, u, s) • ∆f (p) = 1 • w(p) = −1 Lemma 21: Es seien N ein Flussnetzwerk und f ein Fluss in N . Für jeden augmentierenden Kreis p in N bezüglich f gibt es einen Fluss f ′ in N mit 1. |f ′ | = |f | 2. w(f ′ ) = w(f ) + w(p) · ∆f (p) Beweis: analog zu Lemma 16 auf Seite 44. Satz 22: Es sei N ein Flussnetzwerk. Der Fluss f in N hat minimale Kosten unter allen Flüssen mit Betrag |f | in N genau dann wenn es gibt keinen augmentierenden Kreis in N bezüglich f mit negativen Kosten. Beweis: ⇒“ Folgt aus Lemma 21 (Kontraposition) ” 2.4. FLÜSSE MIT MINIMALEN KOSTEN 53 ⇐“ (Kontraposition) Es sei f Fluss in N , der nicht minimale Kosten besitzt. Sei g Fluss mit ” minimalen Kosten und |g| = |f |. Dann gibt es eine endliche Folge von augmentierungen entlang augmentierender Kreise, so dass g aus f entsteht. Da w(g) < w(f ) muss mindestens ein Kreis negative Kosten besitzen (Lemma 21 auf der vorherigen Seite). Seien f, g Flüsse in N , w(g) < w(f ). Betrachten Rg−f =def (V, Eg−f ) mit Eg−f = {(u, v) | g(u, v) > f (u, v)} ∪ {(v, u) | g(u, v) > f (u, v)} | {z } | {z } ŵ(e) = ( + Eg−f − Eg−f + w(e), e ∈ Eg−f − −w(ē), e ∈ Eg−f wobei ē die e entgegengesetzte Kante ist. g′ f u 1/2,3 u 1/3,2 s 0/3,1 t 2/2,3 2/4,1 Rg′ −f u 0/2,3 2/3,2 s 2/3,1 t 1/2,3 3/4,1 v v w(f ) = 13 w(g ′ ) = 12 1,−3 1,2 s t 2,1 1,1 1,3 v Satz 22 liefert folgenden algorithmischen Ansatz: 1. bestimme maximalen Fluss f ∗ mit Hilfe von Ford-Fulkerson oder Edmonds-Karp 2. Bestimme negative Kreise in Rf ∗ (bezüglich Gewicht w) und augmentiere diese Kreise bis kein negativer Kreis mehr existiert. Komplexität des Algorithmus: • O(|f ∗ | · m) für Ford-Fulkerson • Es sei w∗ Kosten des initialisierten maximalen Flusses f ∗ . ⇒ O(w∗ · n · m) Schritte für maximal w∗ Augmentierungen mit je O(n · m) Schritten für Bellmann-Ford. alternativer Zugang: Verwende zur Augmentierung stets augmentierenden Pfad mit minimalen Kosten. Satz 23: Es sei N ein Flussnetzwerk mit Gewichtsfunktion w. Es seien f und f ′ Flüsse in N , wobei f minimale Kosten hat und f ′ aus f durch Augmentierung des Pfades mit minimalen Kosten entsteht. Dann ist f ′ Fluss mit minimalen Kosten. Beweis: Es sei f Fluss mit minimalen Kosten. Außerdem sei p augmentierender Pfad in N bezüglich f mit minimalen Kosten. Es entstehe f ′ durch augmentierung entlang p aus f . 54 KAPITEL 2. ALGORITHMEN FÜR FLÜSSE UND MATCHINGS Angenommen f ′ hat nicht minimale Kosten. Dann gibt es augmentierenden Kreis q in N bezüglich f ′ mit negativen Kosten. Es gilt: 1. Es gibt Kante e in q, die auch zu p gehört. Begründung: Angenommen e nicht in p, dann ist q augmentierender Kreis in N bezüglich f mit negativen Kosten. D.h. f hat nicht minimale Kosten . 2. Es gibt Kante e in q und p, die in q in entgegengesetzter Richtung zu p traversiert wird. Begründung: Angenommen alle Kanten in p und q werden in p in gleiche Richtung traversiert wie in q. Dann existiert Kreis q bereits bezüglich f . D.h. f hat nicht minimale Kosten q′ Es sei e (ohne Begründung die einzige) Kante, die 2. genügt. s ′ p ′ • e ′ • p t Es sei q =def q \ {e}. Betrachte Pfad p , der aus p durch Ersetzung von e mit q entsteht. Dann ist p′ augmentierender Pfad in N bezüglich f . Außerdem: <0 z }| { w(p ) = w(p) + w(q) < w(p) | {z } | {z } ′ mit e mit ē D.h. p nicht mit minimalen Kosten. Der Beweis funktioniert nicht mehr, falls p mehr alls eine Kante mit q gemeinsam hat. Der entsprechende Abschnitt bei Goodrich und Tamassia ist falsch. Ein entsprechender Beweis wird auf der Homepage der Vorlesung verfügbar gemacht. Grundideen dazu: Sei p Pfad oder Kreis. X p : E → {−1, 0, 1} falls e Vorwärtskante in p 1 p X = −1 falls e Rückwärtskante in p 0 sonst P P Es gilt: f − g = λi X pi + µj X cj , wobei λi , µi > 0, pi , cj augmentierende Pfade bzw. Kreise in Rg . Konkret zum Beweis von Satz 23 auf der vorherigen Seite: Sei f ′′ Fluss mit |f ′′ | = |f ′ |. X X µj X cj X X X X w(f ′′ − f ) = λi w(pi ) + µj w(cj ) ≥ λj w(pj ) ≥ w(p) λj = w(p)∆p (p) f ′′ − f = λi X pi + w(f ′′ − f ) ≥ w(f ′ − f ) ⇔ w(f ′′ ) ≥ w(f ′ ) Satz 23 auf der vorherigen Seite impliziert folgendes algorithmisches Verfahren: 1. Initialisiere Nullfluss f ≡ 0 (f hat minimale Kosten) 2.4. FLÜSSE MIT MINIMALEN KOSTEN 55 2. Es sei f aktueller Fluss. Betrachte Restnetzwerk Rf = (V, Ef ) mit folgenden Gewichten w(u, v) = ( w(e) −w(e) , falls e = (u, v) ∈ Ef , falls e = (v, u) ∈ Ef Bestimmen Pfad p mit minimalem Gewicht in Rf (z.B. mit Bellmann-Ford); beachte:. Rf enthält keine negativen Kreise 3. Falls p existiert, bestimme neuen aktuellen Fluss f durch Augmentierung von p und fahre mit 2. fort; sonst: gebe f zurück f u u 0/2,3 0/3,2 s t 0/3,1 0/2,3 0/4,1 3/3,1 2,3 v s 1,1 1/2,3 4/4,1 3/3,2 s 2/3,1 t 2/2,3 4/4,1 v 3,−2 3,−1 t 3/3,1 1/2,3 v u 2,3 t 3/3,2 s u 3,1 u 0/2,3 v 3,2 4,1 t 0/2,3 3/4,1 u 2,3 s 3/3,2 s v Rf u 0/2,3 t 3,−1 2,3 v 2,3 s 3,−2 t 1,−3 3,−1 4,−1 v 1,3 Komplexität des Algorithmus: • max. |f ∗ | Iterationen • O(n · m) pro Iteration für Bellman-Ford ⇒ O(|f ∗ | · n · m) Schritte Jetzt: Ersetzung von Bellman-Ford durch Dijkstra mittels Gewichtskalibrierung. Es sei N = (V, E, c, s, t) ein Flussnetzwerk mit Gewichtsfunktion w. Es sei f ein Fluss mit minimalen Kosten. Es sei df (v) für Knoten v ∈ V der Abstand von v zur Quelle s in Rf , d.h. df (v) =def min{w(p) | p Pfad in Rf von s nach v} (Beachte: df (v) verschieden zu Abstand bei Edmonds-Karp) Es sei g Fluss in N , der aus f durch Augmentierung eines Pfades mit minimalen Kosten entsteht. Wir definieren für Rg modifizierte Gewichte ŵ wie folget: (u, v) ∈ Eg ŵ(u, v) =def w(u, v) + df (u) − df (v) 56 KAPITEL 2. ALGORITHMEN FÜR FLÜSSE UND MATCHINGS Beobachtung: Sei p ein beliebiger Pfad von s nach v ∈ V bezüglich g. Dann gilt für p = (u0 , u1 , . . . , uk ), u0 = s, uk = v: ŵ(p) = k X ŵ(ui−1 , ui ) i=1 = k X i=1 [w(ui−1 , ui ) + df (ui−1 ) − df (ui )] =w(p) + df (s) − df (v) =w(p) − df (v) Lemma 24: Für jede Kante (u, v) ∈ Eg gilt ŵ(u, v) ≥ 0. Weiterhin ist kürzester Pfad in Rg bezüglich ŵ ebenfalls kürzester Pfad in Rg bezüglich w. Beweis: Wir unterscheiden zwei Fälle für (u, v) ∈ Eg . 1. Es gilt (u, v) ∈ Rf . Dann gilt df (v) ≤ df (u) + w(u, v) Damit: ŵ(u, v) = w(u, v) + df (u) − df (v) ≥ 0 2. Es gilt (u, v) 6∈ Rf . Dann ist (v, u) Kante auf augmentierendem Pfad p, der g aus f produziert. D.h. df (u) = df (v) + w(v, u) | {z } =−w(u,v) Damit: ŵ(u, v) = w(u, v) − w(u, v) = 0 Weiterhin: Nach Beobachtung ist kürzester Pfad von s nach t in Rg bezüglich ŵ auch kürzester Pfad bezüglich w. 2.4. FLÜSSE MIT MINIMALEN KOSTEN Algorithmus MinCostFlow(N ) Eingabe: Flussnetzwerk N = (V, E, c, s, t) mit Gewichtsfunktion w : E → N Ausgabe Maximaler Fluss f mit minimalen Kosten 1 2 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 28 for e ∈ E do f (e) := 0 od for v ∈ V do d(v) := 0 od Stop := FALSE while ¬Stop do Bestimme Restnetzwerk Rf = (V, Ef ) for (u, v) ∈ Ef do ŵ(u, v) := w(u, v) + d(u) − d(v) od Bestimme kürzeste Pfade p(v) in Rf bezüglich ŵ von s zu allen Knoten v ∈ V mit Hilfe von Dijkstra for v ∈ V do d(v) := w(p(v)) od if d(t) < ∞ then ∆ := ∞ for e ∈ p(t) do if df (e) < ∆ then ∆ := df (e) fi od for e ∈ p(t) do if e Vorwärtskante in p(t) then f (e) := f (e) + ∆ else f (e) := f (e) − ∆ fi od else Stop := TRUE fi od Algorithmus 13: MinCostFlow 57 58 KAPITEL 2. ALGORITHMEN FÜR FLÜSSE UND MATCHINGS f u u 0/2,3 0/3,2 s 0/3,1 0/4,1 t 0/2,3 u 0/2,3 3/3,2 s 3/3,1 3/4,1 v t 0/2,3 0/2,3 u 3/3,2 s t 3/3,1 4/4,1 1/2,3 v 1/2,3 3/3,2 s 2/3,1 4/4,1 v t 2/2,3 v Rf , w u u 2,3 s t 3,1 2,3 4,1 u 2,3 3,2 s 3,−1 t 3,−1 2,3 1,1 v 2,3 3,−2 s u 3,−2 4,−1 v t 1,−3 3,−1 s 1,3 v t v Rf , ŵ, d(v) 0 2 2,3 3,2 0 0 3,1 4,1 2,3 2 2,1 0 3,0 2,0 1,0 0 4 3,0 3,0 2,1 0 3 3,0 3,0 1,0 4,0 1 4 0 5 1,0 1 2 Komplexität von MinCostFlow: • Zeilen 1–5: O(n + m) • Zeilen 6–23 – max. |f ∗ | Iterationen – Zeilen 7–9: O(n + m) – Zeile 10: O(n log n + m) (bei Verwendung von Fibonacci-Heaps für Dijkstra) – Zeilen 11–22: O(n) ⇒ O(|f ∗ | · (n log n + m)) Schritte für MinCostFlow Kapitel 3 Lineare Programmierung Ein Beispielproblem: Angenommen wir wollen ein neues Produkt vermarkten. Dabei bestehe folgender Zusammenhang zwischen Werbungskosten für bestimmte Medien und dabei erzielbaren Neukunden: Medien pro e 1.000 Kino Fernsehen Radio Zeitung Zielgruppe 14–29 39–49 50– 7 3 0 10 2 5 2 4 5 1 8 6 Ziel: mindestens 500.000 neue Kunden im Alter von 14–29 mindestens 200.000 neue Kunden im Alter von 30–49 mindestens 50.000 neue Kunden im Alter von 50– D.h. es muss gelten: 7x1 +10x2 +2x3 +1x4 ≥ 500 3x1 + 2x2 +4x3 +8x4 ≥ 500 0x1 + 5x2 +5x3 +6x4 ≥ 500 x1 , x2 , x3 , x4 ≥ 0 Gesamtaufgabe: 1x1 + 1x2 +1x3 +1x4 3.1 soll minimiert werden Standardformulierungen Ein Tripel (A, b, c) heißt lineares Programm (LP), falls A eine m × n-Matrix, b ein mdimensionaler Vektor und c ein n-dimensionaler Vektor sind. Matrizen und Vektoren werden über Q aufgefasst. Dimension von LP (A, b, c) ist m × n. 59 60 KAPITEL 3. LINEARE PROGRAMMIERUNG Die durch das LP (A, b, c) gegebene Optimierungsaufgabe ist wie folgt definiert: Maximiere bezüglich n X i=1 n X j=1 ci xi aij xj ≤ bi für alle i ∈ {1, . . . , m} xj ≥ 0 für alle j ∈ {1, . . . , n} oder kurz: Maximiere cT x bezüglich Ax ≤ b x≥0 Bezeichnungen: • cT x heißt Zielfunktion • Ax ≤ b heißen Nebenbedingungen • x ≥ 0 heißen Nichtnegativitätsbedingungen Es sei (A, b, c) ein LP. Ein Vektor x ∈ Rn heißt zulässige Lösung, falls Ax ≤ b und x ≥ 0; sonst unzulässige Lösung. Für zulässige Lösung x heißt cT x Zielwert. Eine zulässige Lösung x∗ mit maximalem Zielwert unter allen zulässigen Lösungen heißt optimale Lösung; cT x∗ heißt optimaler Zielwert. Ein LP ohne zulässige Lösung heißt unerfüllbar; sonst erfüllbar. Ein erfüllbares LP ohne endlichen optimalen Zielwert heißt unbeschränkt. LP-Variationen: 1. Minimierung der Zielfunktion statt Maximierung 2. Existenz von Variablen ohne Nichtnegativität 3. Gleichheiten unter Nebenbedingungen 4. entgegengesetzte Ungleichungen Es seien L1 ein m1 × n1 -dimensionales LP und L2 ein m2 × n2 -dimensionales LP. L1 ist einfacher als L2 , symbolisch L1 ≤ L2 , falls eine Funktion ϕ : Rn1 → Rn2 existiert, so dass für alle x ∈ Rn1 gilt: (i) Ist x zulässige Lösung für L1 , so ist ϕ(x) zulässige Lösung für L2 (ii) Für zulässige Lösung x von L1 gilt cT1 x = cT2 ϕ(x). Ist genau ein Problem von L1 und L2 ein Minimierungsproblem, so gilt cT1 x = −cT2 ϕ(x). 3.1. STANDARDFORMULIERUNGEN 61 L1 und L2 sind äquivalent, falls L1 ≤ L2 und L2 ≤ L1 . Jetzt: Elimination der Varianten 1. LP L1 mit Minimierung von cT x wird zu LP L2 mit Maximierung von (−c)T x Klar: L1 ≡ L2 Minimiere −2x1 +3x2 bezüglich x1 +x2 =7 Maximiere 2x1 −3x2 bezüglich x1 +x2 =7 x1 −2x2 ≤4 x1 ≥0 x1 −2x2 ≤4 x1 ≥0 2. LP L1 mit Variable xi ohne Nichtnegativität wird zu LP L2 , bei dem xi durch x′i − x′′i mit Bedingung x′i , x′′i ≥ 0 ersetzt wird. Klar: L1 ≡ L2 P P P 3. Lp L1 mit aij xj = bi wird zu LP L2 mit aij xj ≤ bi und aij xj ≥ bi . Klar: L1 ≡ L2 P P 4. LP L1 mit aij xj ≥ bi wird zu LP L2 mit (−aij )xj ≤ −bi Klar: L1 ≡ L2 Beispiel in Standardform −1 −1 1 −7 2 A= 1 1 −1 , b = 7 , c = −3 1 −2 2 4 3 Jetzt: Wichtige Normalform (für Simplex-Algorithmus). Pn Es sei (A, b, c) ein LP. Für Nebenbedingung j=1 aij xj ≤ bi führe Schlupfvariable si ein mit: si = b i − si ≥ 0 n X aij xj j=1 Beispiel: Max. 2x1 −3x2 +3x3 x4 =−7+ x1 + x2 − x3 x5 = 7− x1 − x2 + x3 x6 = 4− x1 +2x2 −2x3 x4 , x5 , x6 heißen Basisvariablen; x1 , x2 , x3 heißen Nichtbasisvariablen 62 KAPITEL 3. LINEARE PROGRAMMIERUNG In Simplexalgorithmus werden Basisvariablen durch Nichtbasisvariablen ausgetauscht. Dadurch ändert sich im Allgemeinen die Zielfunktion. LP in Simplex-Normalform wird dann geschrieben als: z = 0+2x1 −3x2 +3x3 x4 =−7+ x1 + x2 − x3 x5 = 7− x1 − x2 + x3 x6 = 4− x1 +2x2 −2x3 Ein Tupel (N, B, A, b, c, v) heißt LP in Simplex-Normalform, falls (A, b, c) ein m×n-dimensionales LP ist und N ∪ B = {1, 2, . . . , n + m}, N ∩ B = ∅, und gilt: X z=v+ cj xj j∈N xi = bi − X j∈N aij xj für i ∈ B Beachte: Elemente in A, b, c müssen so nummeriert sein, dass die beiden obigen Gleichungen wohldefiniert sind. z = 8+ x2 +7x3 −x6 x1 = 4+2x2 +2x3 −x6 x4 =−3+3x2 + x3 −x6 x5 = 3−3x2 − x3 +x6 B = {1, 4, 5} N = {2, 3, 6} 2 2 −1 a12 a13 a16 1 −1 a = a42 a43 a46 = 3 a52 a53 a56 −3 −1 1 b = (b1 , b4 , b5 )T = (4, −3, 3)T c = (c2 , c3 , c6 )T = (1, 7, −1)T v=8 Lemma 25: Es sei I ⊆ N eine nicht leere Indexmenge. Für i ∈ I seien αi , βi reelle Zahlen und xi reell-wertige Variablen. Es sei γ ∈ R. Gilt für alle xi ∈ R für alle i ∈ I, X X αi xi = γ + βi xi i∈I so gilt αi = βi für alle i ∈ I und γ = 0. i∈I 3.1. STANDARDFORMULIERUNGEN 63 Beweis: Setze xi = 0 für alle i ∈ I. Dann gilt γ = 0. Betrachte nun für jedes i ∈ I die Belegung ( 0 , falls j ∈ I \ {i} xj = 1 , falls j = i Dann gilt αi = 0 + βi = βi . Satz 26: Es sei (A, b, c) ein LP. Gegeben eine Menge B von Basisvariablen, so ist die zugehörige Simplex-Normalform eindeutig bestimmt. Beweis: Angenommen es gibt zwei Simplex-Normalformen mit gleicher Menge B. Dann haben beide auch gleiche Menge an Nichtbasisvariablen N = {1, . . . , n + m} \ B. Für erste NF gilt: X (i) z=v+ cj xj j∈N xi = bi − (ii) X aij xj für i ∈ B X c′j xj j∈N und für zweite NF gilt: z = v′ + (iii) j∈N (iv) xi = b′i − X j∈N Betrachte (ii)−(iv) für jedes i ∈ B: 0 = (bi − b′i ) − d.h. X j∈N a′ij xj für i ∈ B X j∈N (aij − a′ij )xj a′ij xj = (bi − b′i ) + X aij xj X cj xj j∈N Nach Lemma 25 gilt aij = a′ij und bi = b′i . Analog (i)−(iii) X 0 = (v − v ′ ) + (cj − c′j )xj j∈N d.h. X j∈N c′j xj = (bi − b′i ) + Damit: nach Lemma 25 gilt c′j = cj und v = v ′ . 3.1.1 j∈N Beispiele für LP-Modellierungen Kürzeste Wege: Es sei G = (V, E) gerichteter Graph mit Gewichtsfunktion w : E → R. Es seien s, t ∈ V . Suche kürzesten Weg von s nach t. LPG : Maximiere bezüglich dt dv ≤ du + w(u, v) für (u, v) ∈ E ds = 0. zu Zeigen: dG (s, t) = optimaler Zielwert von LPG . 64 KAPITEL 3. LINEARE PROGRAMMIERUNG ≤ Setze dv = dG (s, v) für alle v ∈ V . Dann gilt für (u, v) ∈ E: dv ≤ du + w(u, v). Außerdem ds = 0. D.h. Zuordnung definiert zulässige Lösung. D.h. dG (s, t) = dt ≤ d∗t ≥ Es sei d∗v optimale Lösung für LPG . Es sei (vo , v1 , . . . , vℓ ) mit s = v0 , t = vℓ kürzester Weg in G. Dann gilt für alle 1 ≤ i ≤ ℓ: (∗) dG (s, vi ) = dG (s, vi−1 ) + w(vi−1 , vi ) Zeigen d∗vi ≤ dG (s, vi ) mittels Induktion über i: (IA): Es sei i = 0. Dann d∗v0 = d∗s = 0 = dG (s, s) (IS): Es sei i > 0. Dann gilt (IV) (∗) d∗vi ≤ d∗vi−1 + w(vi−1 , vi ) ≤ dG (s, vi−1 ) + w(vi−1 , vi ) ≤ dG (s, vi ) Größe von LPG für G = (V, E): • kV k Variablen • kEk + 1 Nebenbedingungen Maximaler Fluss: Es sei N = (V, E, c, s, t) Flussnetzwerk. Suche maximalen Fluss in N . (Verwende Vereinbarung c(u, v) = 0 für (u, v) 6∈ E) X LPN : Maximiere f(s,v) v∈V bezüglich f(u,v) ≤ c(u, v) für u, v ∈ V fX (u,v) = −f(v,u) für u, v ∈ V f(u,v) = 0 für u ∈ V \ {s, t} v∈V Größe von LPN : • 2kV k2 Variablen • kV k2 + 2kV k2 + 2(kV k − 2) = 2(kV k2 + kV k + 2) Nebenbedingungen 3.2 3.2.1 Simplex-Algorithmus Grundlagen Betrachten einfaches LP: Maximiere bezüglich 2x1 + x2 x1 + x2 ≤ 7 2x1 − x2 ≤ 4 −6x1 + x2 ≤ 0 3.2. SIMPLEX-ALGORITHMUS 65 6 @ @ @ @ Bereich zulässiger Lösungen @ = Schnitt von Halbebenen @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ - Optima werden immer in Ecken (des Simplex) angenommen. Ziel: Finde richtinge Ecke. Ecken sind dadurch charakterisiert, dass die zugehörigen Ungleichungen ausgeschöpft werden, d.h. Schlupfvariable wird 0. Betrachten Beispiel in Simplex-Normalform z = 0+3x1 + x2 +2x3 x4 =30− x1 − x2 −3x3 x5 =24−2x1 −2x2 −5x3 x6 =36−4x1 − x2 −2x3 B = {4, 5, 6}, N = {1, 2, 3} Setzen x1 = 0, x2 = 0, x3 = 0. Dann x4 = 30, x5 = 24, x6 = 36. Nennen (0, 0, 0, 30, 24, 36) Basislösung. (Beachte: Diese Basislösung entspricht einer zulässigen Lösung.) Idee des Simplex-Algorithmus: Setze sukzessive Basisvariablen auf 0 durch geeigneten Variablentausch (springe zur nächsten Ecke). Wollen z erhöhen. Dazu können wir x1 , x2 , x3 erhöhen. Erhöhe x1 : • in Gleichung für x4 : maximal auf 30 • in Gleichung für x5 : maximal auf 12 • in Gleichung für x6 : maximal auf 9 66 KAPITEL 3. LINEARE PROGRAMMIERUNG 1 1 1 Vertausche x6 mit x1 : x1 = 9 − x2 − x3 − x6 . Neues LP wie folgt: 4 2 4 1 3 1 z =27+ x2 + x3 − x6 4 2 4 1 1 1 x1 = 9− x2 − x3 − x6 4 2 4 5 1 3 x4 =21− x2 − x3 + x6 4 2 4 1 3 x5 = 6− x2 − 4x3 + x6 2 2 B = {1, 4, 5}, N = {2, 3, 6} Neue Basislösung ist (9, 0, 0, 21, 6, 0) Erhöhe x3 : • in Gleichung für x1 : maximal auf 18 • in Gleichung für x4 : maximal auf 42 5 • in Gleichung für x5 : maximal auf 3 2 Vertausche x5 und x3 : x3 = 1 1 3 3 − x2 − x5 + x6 . Neues LP wie folgt: 2 8 4 8 111 1 1 11 + x2 − x5 − x6 4 16 8 16 1 5 33 1 − x2 + x5 − x6 x1 = 4 16 8 16 3 1 1 3 − x2 − x5 + x6 x3 = 2 8 4 8 5 1 69 3 + x2 + x5 − x6 x4 = 4 16 8 16 z= Erhöhe x2 : • in Gleichung für x1 : maximal auf 132 • in Gleichung für x3 : maximal auf 4 • in Gleichung für x4 : ∞ 3.2. SIMPLEX-ALGORITHMUS 67 8 2 1 Vertausche x3 und x2 : x2 = 4 − x3 − x5 − x6 Neues LP wie folgt: 3 3 3 1 2 1 z =28− x3 − x5 − x6 6 6 3 1 1 1 x1 = 8+ x3 + x5 − x6 6 6 3 8 2 1 x2 = 4− x3 − x5 + x6 3 3 3 1 1 x4 =18− x3 + x5 2 2 3.2.2 Formaler Simplex-Algorithmus Zunächst Hilfsprozedur: Algorithmus Pivot(N, B, A, b, c, v, α, η) Eingabe: Tupel (N, B, A, b, c, v, α, η) mit (N, B, A, b, c, v) Simplex-Normalform und Indizes α ∈ B, η ∈ N (xα Austrittsvariable, xη Eintrittsvariable) Ausgabe: Simplex-Normalform (N ′ , B ′ , A′ , b′ , c′ , v ′ ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 b′η := bα /aαη for j ∈ N \ {η} do a′ηj := aαj /aαη od 1 ′ aηα := aαη for i ∈ B \ {α} do b′i := bi − aiη b′η for j ∈ N \ {η} do a′ij := aij − aiη a′ηj od ′ aiα := −aiη a′ηα od v ′ := v + cη b′η for j ∈ N \ {η} do c′j := cj − cη a′ηi od ′ cα := −cη a′ηα N ′ := {α} ∪ N \ {η} B ′ := {η} ∪ B \ {α} return (N ′ , B ′ , A′ , b′ , c′ , v ′ ) Algorithmus 14: Pivot Zeilen 1– 4 Zeilen 5–10 Zeilen 11–14 Umstellung der Gleichung für xα nach xη (ausg. bzgl. A, b) Berechnung restlicher Koeffizienten (ausg. bzgl. A, b) Berechnung der Zielfunktion (ausg. bzgl. A, b, c) Algorithmus Pivot erfüllt folgende Invariante: Ist (N, B, A, b, c, v, α, η) mit aαη 6= 0 die Eingabe für Pivot und (N ′ , B ′ , A′ , b′ , c′ , v ′ ) Ausgabe von Pivot, und ist x̂ eine Basislösung nach Abarbeitung von Pivot, so gilt: 68 KAPITEL 3. LINEARE PROGRAMMIERUNG 1. x̂j = 0 für alle j ∈ N ′ 2. x̂η = bα aαη 3. x̂i = bi − aiη b′η für alle i ∈ B ′ \ {η} Mögliche Probleme für Simplex-Algorithmus: 1. Wie Erfüllbarkeit des LP testen? 2. Wie erste Basislösung finden, falls LP erfüllbar? 3. Wie Unbeschränktheit eines LP feststellen? 4. Wie Austritts- und Eintrittsvariablen bestimmen? Behandlung der ersten beiden Probleme später. Wir nehmen an, wir hätten eine Prozedur InitializeSimplex: Eingabe: LP (A, b, c) in Standardform Ausgabe: Simplex-Normalform (N, B, A, b, c, v), so dass Basislösung zulässig, wenn LP erfüllbar; sonst Fehlermeldung 3.2. SIMPLEX-ALGORITHMUS 69 Algorithmus Simplex(A, b, c) Eingabe: LP (A, b, c) in Standardform Ausgabe: optimale Lösung 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 (N, B, A, b, c, v) = InitializeSimplex(A, b, c) while es gibt j ∈ N mit cj > 0 do wähle η ∈ N mit cη > 0 for i ∈ B do if aiη > 0 then ∆i := abiηi else ∆i := ∞ fi od Bestimme α ∈ B mit ∆α minimal if ∆α = ∞ then return LP unbeschränkt“ ” else (N, B, A, b, c, v) := Pivot(N, B, A, b, c, v, α, η) fi od for i := 1 to n do if i ∈ B then x∗i := bi else x∗i := 0 fi od return (x∗1 , . . . , x∗n ) ; auf Seite 76 ; auf Seite 67 Algorithmus 15: Simplex 3.2.3 Terminierung Lemma 27: Es sei (A, b, c) ein LP. Der Algorithmus InitializeSimplex gebe SNF für (A, b, c) zurück, so dass die Basislösung zulässig ist. Wenn Algorithmus Simplex stoppt, so gibt er eine zulässige Lösung für (A, b, c) zurück oder, falls (A, b, c) unbeschränkt ist, die Ausgabe LP unbeschränkt“. ” Beweis: Wir zeigen mittels Induktion, dass vor jedem Schleifendurchlauf (Zeilen 2–15) folgende Invarianten gelten: (I1) Aktuelle SNF ist äquivalent zur initialen SNF (I2) Für i ∈ B gilt bi ≥ 0. (I3) Basislösung für aktuelle SNF ist zulässig. Induktion über Anzahl i der Schleifendurchläufe. 70 KAPITEL 3. LINEARE PROGRAMMIERUNG (IA) Es sei i = 0. D.h. Schleife wird zum ersten Mal durchlaufen. Invarianten gelten sofort wegen Annahme über InitializeSimplex. (IS) Es sei i > 0.Wir nehmen an, dass Zeile 12 nicht ausgeführt wird. (Behandlung später). Betrachten Invarianten einzeln: zu (I1): SNF wird nur in Zeile 13 verändert, mittels Vertauschung von Basis- und Bichtbasisvariablen (Koordinatentransformation). Damit wird SNF in äquivalente SNF umgeformt. Nach (IV) gilt (I1). zu (I2): Es gelte bi ≥ 0 für alle i ∈ B (vor Schleifendurchlauf) nach (IV). Veränderung erfolgt nur in Zeile 13. Es sei b̂ Vektor nach Ausführung von Zeile 13. Es gilt: α (a) b̂η ≥ 0 wegen b̂η = abαη bα ≥ 0 aαη ≥ 0 nach Zeile 1 von Pivot auf Seite 67 nach (I2) nach Zeile 5 nach Zeile 6 von Pivot (b) Für i ∈ B \ {α} gilt: b̂i = bi − aiη b̂η α = bi − aiη ( abαη nach Zeile 1 von Pivot Unterscheide zwei Fälle: α ≤ abiηi wegen Minimalität in Zeile 10. i. Es sei aiη > 0. Dann gilt für α: abαη α = bi − aiη abiηi = 0 Somit: b̂i = bi − aiη abαη ii. Es sei aiη ≤ 0. Damit b̂i ≥ 0 wegen bi ≥ 0, bα ≥ 0, aαη ≥ 0. zu (I3): Folgt aus (I2). Betrachten nun noch den Terminierungszeitpunkt: Ausgabe entweder in Zeile 22 oder in Zeile 12. 1. Ausgabe in Zeile 22. D.h. Schleifenbedingung in Zeile 2 nicht erfüllt. Zulässigkeit der ausgegebenen Lösung folgt aus (I1), (I2), (I3). 2. Ausgabe in Zeile 12. D.h. es gilt aiη ≤ 0 für alle i ∈ B. Es sei x = (x1 , . . . , xn+m ) die Basislösung. Betrachte für k ≫ 0 folgende Lösung: , falls i = η k x̂i =def 0 , falls i ∈ N \ {η} P b − j∈N aij x̂j , falls i ∈ B Zeigen, dass x̂i ≥ 0 für alle i ∈ N ∪ B. (a) Ist i ∈ N , dann x̂i ≥ 0 (b) Ist i ∈ B, dann x̂i = bi − aiη x̂η ≥ 0 wegen bi ≥ 0 (I2), aiη ≤ 0, x̂η ≥ 0 D.h. x̂ ist zulässige Lösung für alle k > 0. Für Zielfunktion gilt: z=v+ X j∈N k→∞ cj x̂j = v + cη x̂η = v + cη k → ∞ wegen cη > 0. D.h. LP unbeschränkt. 3.2. SIMPLEX-ALGORITHMUS 71 Müssen nun zeigen: Simplex terminiert. Problem dabei: Kreisvertauschungen; können auftreten bei Degenerizität, d.h. Vertauschungen lassen Zielwert unverändert. Simplex-Algorithmus zirkuliert auf LP (A, b, c), falls für zwei verschiedene Schleifendurchläufe die Mengen der Basisvariablen übereinstimmen. Lemma 28: Es sei (A, b, c) ein LP der Dimension m × n. Falls der Algorithmus Simplex in durchläufen nicht terminiert, dann zirkuliert Simplex. n+m m Schleifen- Beweis: Nach Lemma 26 auf Seite 63 ist SNF eindeutig für eine Menge von Basisvariablen. Es gilt kBk = m, kN ∪ Bk = n + m. Damit gibt es höchstens n+m verschiedene Mengen für B, m also höchstens n+m verschiedene äquivalente SNF. m Zirkulieren kann vermieden werden: 1. Störe LP geringfügig, um gleichen Zielwert zu vermeiden 2. Bland-Regel: Bei Gleichheit in Zeilen 3 unf 10 wähle stets Variable mit kleinstem Index. Lemma 29: Wird in Zeilen 3 und 10 des Algorithmus Simplex die Bland-Regel verwendet, so stoppt Simplex für alle Eingaben. Satz 30: Es sei (A, b, c) ein LP der Dimension m × n. Gibt InitializeSimplex eine SNF für (A, b, c) zurück, so dass Basislösung zulässig ist, so gibt Simplex LP unbeschränkt“ zurück, falls (A, b, c) unbe ” schränkt, oder eine zulässige Lösung in höchstens n+m Schleifendurchläufen. m Beachte: 3.2.4 n+m m 22n ≈ √ 2n Optimalität und Dualität Wollen zeigen, dass Simplex optimale Lösung bestimmt, falls eine existiert. Es sei (A, b, c) ein LP in Standardform. Dann heißt das LP Minimiere bT y bezüglich AT y ≥ c y≥ 0 Pm (bzw. Minimiere P i=1 bi yi m bezüglich i=1 aij yi ≥ cj für j ∈ {1, . . . , n}) das duale LP zu (A, b, c). Das LP (A, b, c) heißt primales LP. Lemma 31: Es sei (A, b, c) ein LP. Es seien x̄ eine zulässige Lösung für (A, b, c) und ȳ eine zulässige Lösung 72 KAPITEL 3. LINEARE PROGRAMMIERUNG für das duale LP zu (A, b, c). Dann gilt: n X j=1 m X cj x̄j ≤ Bi ȳi i=1 Beweis: Es gilt: n X cj x̄j j=1 n duales LP X ≤ j=1 = m X i=1 primales LP ≤ m X m X aij ȳi i=1 ! x̄j n X aij x̄j ȳi j=1 bi ȳi i=1 Korollar 32: Es sei (A, b, c) ein LP. Es seien x̄ zulässige Lösung für primales LP und ȳ zulässige Lösung für duales LP. Gilt m n X X bi ȳi , cj x̄j = i=1 j=1 so sind x̄ und ȳ optimale Lösungen für das primale bzw. duale LP. Simplex-Algorithmus berechnet gleichzeitig beide Lösungen! Die letzte SNF, die Simplex berechnet, sei z =v ′ + X c′j xj j∈N xi =b′i − X j∈N a′ij xj für i ∈ B Simplex bestimmt für primales LP (j ∈ {1, . . . , n}) x̄j = ( 0 bj , falls j ∈ N , falls j ∈ B Wir setzen für das duale LP an: (i ∈ {1, . . . , m}) ȳj =def ( 0 −cn+i , falls n + i ∈ N , falls n + i ∈ B (*) 3.2. SIMPLEX-ALGORITHMUS 73 Beispiel: SNF n = 3, m = 3 1 2 1 z =28− x3 − x5 − x6 6 6 3 1 1 1 x1 = 8+ x3 + x5 − x6 6 6 3 8 2 1 x2 = 4− x3 − x5 + x6 3 3 3 1 1 x4 =18− x3 + x5 2 2 c = (3, 1, 2) b = (30, 24, 36) 1 2 ȳ T = (0, , ) 6 3 x̄T = (8, 4, 0) z = cT x̄ = 28 z = bT ȳ = 30 · 0 + 24 · 1 2 + 36 · = 28 6 3 Satz 33: Es sei (A, b, c) das primale LP. Der Algorithmus Simplex gebe auf (A, b, c) die Lösung x̄ zurück. Weiterhin seien N und B die Nichtbasis- bzw. Basisvariablen der letzten SNF. Dann ist der in (∗) definierte Vektor eine zulässige Lösung für das duale LP und es gilt n X m X cj x̄j = bi ȳi i=1 j=1 D.h. x̄ ist optimale Lösung für das primale LP. Beweis: Wir nehmen an, dass Simplex in Zeile 22 Lösung zurückgibt. Dann gilt für die letzte SNF z = v′ + X j∈N c′j xj mit c′j ≤ 0 für alle j ∈ N Wir setzen c′j = 0 für alle j ∈ B. Dann gilt: ′ z=v + X c′j xj ′ =v + n+m X c′j xj j=1 j∈N Betrachten Basislösung x̄ mit x̄j = 0 für j ∈ N . Es gilt: n X cj x̄j = v ′ + n+m X c′j x̄j j=1 j=1 = v′ + X j∈N = v′ c′j · 0 + (1) X j∈B 0 · x̄j Beachte: Gleichung (1) gilt für alle Belegungen x = (x1 , . . . , xn ) wegen Äquivalenz aller SNF. 74 KAPITEL 3. LINEARE PROGRAMMIERUNG 1. Zeigen Optimalität, d.h. n X m X cj x̄j = n X bi ȳi . Es gilt für alle x = (x1 , . . . , xn ): i=1 j=1 (1) cj xj = v ′ + n+m X c′j xj j=1 j=1 =v ′ + n X c′j xj + =v ′ + c′j xj + Def. von ȳ ′ =v + c′j xj + =v + n X c′j xj + =v ′ + =v ′ + j=1 n X j=1 ′ = v − m X i=1 j=1 n X m X i=1 j=1 Def. von Schlupfvar. ′ m X i=1 j=1 n X c′j xj n+1 j=1 n X n+m X c′j xj − c′j xj − m X bi ȳi i=1 m X i=1 m X cn+i ·′ xn+i (−ȳi ) · xn+i (−ȳi ) · bi − bi ȳi + bi ȳi + + j=1 m X n X i=1 j=1 n X m X n X j=1 c′j + m X aij xj (aij xj )ȳi (aij ȳi )xj j=1 i=1 i=1 ! n X aij ȳi i=1 ! xj Nach Lemma 25 auf Seite 62 gilt somit: v′ − c′j + m X i=1 Aus (∗∗) folgt: m X bi ȳi = v ′ = bi ȳi = 0 (**) i=1 m X n X aij ȳi = cj für j ∈ {1, . . . , n} (***) cj x̄j , d.h. x̄ optimale Lösung. j=1 i=1 2. Zulässigkeit von ȳ für duales LP; d.h. müssen zeigen ȳ ≥ 0 und j ∈ {1, . . . , n}: m X i=1 aij ȳi ≥ cj für alle • ȳ ≥ 0 folgt aus c′j ≤ 0 für alle j ∈ N . • Wegen (∗ ∗ ∗) folgt: m X ′ aij ȳj = cj − cj ≥ cj für alle j ∈ {1, . . . , n} |{z} i=1 ≤0 | {z } ≥0 3.2. SIMPLEX-ALGORITHMUS 3.2.5 75 Initialisierung Ziel: Wie sieht InitializeSimplex aus? Beispiel: LP P1 (in Standardform) Maximiere 2x1 + x2 bezüglich 2x1 − x2 ≤ 2 x1 −5x2 ≤ −4 x1 , x2 ≥ 0 z = 0+2x1 + x2 x3 = 2−2x1 + x2 x4 =−4− x1 +5x2 Basislösung“ (0, 0, 2, −4) nicht zulässig! ” Ausweg: Betrachte lineares Hilfsprogramm zu gegebenem LP. Es sei P = (A, b, c) ein m × n-dimensionales LP. Dann ist das Hilfsprogramm Paux definiert wie folgt: Maximiere −x0 n X aij xj − x0 ≤ bi für alle i ∈ {1, . . . , m} bezüglich j=1 xj ≥ 0 Bemerkungen: 1. Dimension von Paux ist m × (n + 1) 2. LP Paux ist immer erfüllbar; z.B. xj = 0 für j ∈ {1, . . . , n}, x0 = |mini∈{1,...,n} bi | Lemma 34: Ein LP P (in Standardform) ist erfüllbar gdw. zugehöriges LP Paux besitzt den optimalen Zielwert 0. Beweis: Es sei P = (A, b, c) ein beliebiges LP. ⇒ Es sei x̄ = (x̄1 , . . . , x̄n ) eine zulässige Lösung für P . Dann gilt für x̄0 = 0: 1. bi ≥ n X j=1 aij x̄j = −x̄0 + 2. x̄0 , x̄1 , . . . , x̄n ≥ 0. n X aij x̄j j=1 ∗ ∗ Somit ist (0, x̄1 , . . . , x̄n ) zulässig für Paux . zaux ≤ 0 = −x̄0 ≤ zaux 76 KAPITEL 3. LINEARE PROGRAMMIERUNG ∗ ⇐ Es gelte zaux = 0. D.h. x∗0 = 0. Rest analog zu ⇒ . Algorithmus InitializeSimplex(A, b, c) Eingabe: LP (A, b, c) in Standardnormalform Ausgabe: SNF (N, B, A, b, c, v), so dass Basislösung zulässig ist, falls LP erfüllbar; sonst Fehlermeldung 1 2 3 4 5 6 7 8 9 10 11 Bestimme α mit bα minimal if bα ≥ 0 then return ({1, . . . , n}, {n + 1, . . . , n + m}, A, b, c, 0) fi Bestimme Paux (N, B, A, b, c, v) :=SNF von Paux (N, B, A, b, c, v) := Pivot(N, B, A, b, c, v, α, 0) ; auf Seite 67 Führe Zeilen 2–15 von Simplex aus, bis optimale Lösung gefunden ist ; auf Seite 69 if x∗0 = 0 in finaler Basislösung then return Finale SNF mit x0 entfernt und Zierlfunktion wieder hergestellt else return LP unerfüllbar“ ” fi Algorithmus 16: InitializeSimplex Beispiel: betrachte Hilfsprogramm zu LP P1 auf der vorherigen Seite z = 0− x0 x3 = 2+ x0 − 2x1 + x2 x4 =−4+ x0 − x1 + 5x2 Nach Aufruf von Pivot in Zeile 6 z =−4− x1 + 5x2 − x4 x0 = 4+ x1 − 5x2 + x4 x3 = 6− x1 − 4x2 + x4 Beachte: Basislösung (4, 0, 0, 6, 0) ist nun zulässig. Führe Zeilen 2–15 von Simplex aus: Vertausche x2 und x0 . Neue SNF: z = 0− x0 4 1 1 1 x2 = − x0 + x1 + x4 5 5 5 5 9 1 14 4 x3 = + x0 − x1 + x4 5 5 5 5 SNF ist auch final, d.h. Basislösung (0, 0, 54 , 14 5 , 0) ergibt optimalen Zielwert 0, d.h. InitializeSimplex 3.2. SIMPLEX-ALGORITHMUS 77 erfibt folgende SNF zurück (z = 2x1 + x2 ) 4 11 1 + x1 + x4 5 5 5 1 1 4 x2 = + x1 + x4 5 5 5 9 1 14 x3 = − x1 + x4 5 5 5 z= Lemma 35: Es sei (A, b, c) ein LP. 1. Ist (A, b, c) nicht erfüllbar, so gibt Algorithmus InitializeSimplex LP unerfüllbar“ zurück. ” 2. Ist (A, b, c) erfüllbar, so gibt Algorithmus InitializeSimplex eine SNF mit zulässiger Basislösung zurück. Beweis: zu 1. Sei (A, b, c) uunerfüllbar. Nach Lemma 34 auf Seite 75 gilt für Hilfsprogramm z ∗ < 0. Außerdem ist optimaler Zielwert endlich (Belegung aus Bemerkung 2 ergibt −|mini∈{1,...,n} bi |), d.h. Zeile 7 bestimmt negativen optimalen Zielwert, d.h. x∗0 6= 0 und InitializeSimplex gibt LP unerfüllbar“ zurück. ” zu 2. Betrachte Fall bα < 0 (anderer Fall klar). Müssen zeigen, dass nach Zeile 6 Basislösung für Hilfsprogramm zulässig ist, d.h. alle b′i sind nicht negativ nach Pivot: ( bi − aiη b′η , falls i ∈ (B \ {α}) \ {η} ′ bi = bα , falls i = η aαη Es gilt η = 0 und ai,0 = −1 für alle i ∈ B. Damit ergibt sich: (a) b′η = bα aαη > 0, da bα < 0 und aαη < 0. ′ (b) für i ∈ B \ {η}: b′i = bi − aiη b′η bα = bi − aiη aαη = bi − bα ≥0 Zeile 6 von Pivot Zeile 1 von Pivot da aiη = aαη = −1 da bα minimal Somit ist nach Ausführung von Zeile 6 Basislösung immer zulässig. Da (A, b, c) erfüllbar ist, findet Zeile 7 finale SNF mit Zielwert 0, d.h. x∗0 (da alle SNF äquivalenmt). Nach Entfernung von x0 aus SNF entsteht SNF mit zulässiger Basislösung für (A, b, c)