Optimierung 2 Leitfaden zur Vorlesung von Anusch Taraz im Wintersemester 2007/2008 Zentrum für Mathematik Technische Universität München 17. März 2008 Inhaltsverzeichnis 1 Einführung in die Graphentheorie 2 2 Kürzeste Wege, minimal spannende Bäume, Matroide 10 2.1 Kürzeste Wege . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2 Minimal spannende Bäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3 Matroide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3 Flüsse in Netzwerken 17 4 Matchings 22 5 Ganzzahlige lineare Optimierung 28 5.1 Ganzzahlige Polyeder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.2 Unimodularität und totale Unimodularität . . . . . . . . . . . . . . . . . . . . . . . 29 6 Travelling Salesman Problem 30 1 Vorwort Dies ist ein Leitfaden durch die Vorlesung Optimierung 2“ im Wintersemester 2007/2008. Er ” enthält (im Gegensatz zur Vorlesung) keinerlei Beweise, sondern sollte lediglich als erweitertes Inhaltsverzeichnis angesehen werden. 1 Einführung in die Graphentheorie Definition 1.1 (Zahlen) Wir bezeichnen mit N := {0, 1, 2, . . . } die Menge der natürlichen Zahlen und setzen N+ := N \ {0}. Die Menge der ganzen Zahlen ist Z := {. . . , , −2, −1, 0, 1, 2, . . . }. Für i, j ∈ N mit i ≤ j sei [i, j] := {i, . . . , j} und [i] := [1, i]. Mit log bzw. ln wird der Logarithmus zur Basis 2 bzw. e bezeichnet. Reelle Zahlen runden wir mit der sogenannten oberen bzw unteren Gaußklammer. Für x ∈ R sei x := max{n ∈ Z : n ≤ x} x := min{n ∈ Z : x ≤ n}. Sei V eine Menge und k ∈ N. Dann bezeichne mit V := {W ⊆ V : |W | = k}, k (1) V k := V × · · · × V = {(v1 , . . . , vk ) : vi ∈ V }, (2) die Menge aller k-elementigen Teilmengen von V bzw das k-fache kartesische Produkt von V . Bemerkung 1.2 Offensichtlich gilt, dass V |V | k = k und k V = |V |k , wenn V endlich ist. Definition 1.3 (Graphen) Ein Graph ist ein Tupel G = (V, E), wobei V eine nicht–endliche Menge und E ⊆ V2 eine Teilmenge der zweielementigen Teilmengen von V ist.1 Die Elemente v ∈ V heißen die Knoten (auch Ecken, engl. vertices oder nodes), die Elemente aus e ∈ E die Kanten (engl. edges) von G. Ein gewichteter Graph G = (V, E, ) enthält zusätzlich eine Gewichts- oder Längenfunktion : E → R. Definition 1.4 (isomorph) Viele dieser Graphen unterscheiden sich jedoch lediglich in den Na” men“ ihrer Knoten: Zwei Graphen G1 = (V1 , E1 ) und G2 = (V2 , E2 ) heißen isomorph, in Zeichen G1 ∼ = G2 , falls es eine Bijektion f : V1 → V2 gibt, so daß gilt: {u, v} ∈ E1 ⇔ {f (u), f (v)} ∈ E2 . Definition 1.5 (spezielle Graphen) Die folgenden Graphen werden so oft benutzt, dass sie sich eigene Namen verdient haben: Pn Cn Kn En := (V, E) mit V := {0, . . . , n} und E := {{i − 1, i} : i ∈ [n]}, für n ∈ N0 := (V, E) mit V := [n] und E := {{i, i + 1} : i ∈ [n − 1]} ∪ {n, 1}, für n ∈ N, n ≥ 3 n := (V, E) mit V := [n] und E := für n ∈ N 2 := (V, E) mit V := [n] und E := ∅ für n ∈ N. Ein Graph, der isomorph zu Pn ist, heißt Pfad der Länge n. Ein Graph, der isomorph zu Cn ist, heißt Kreis der Länge n. Ein Graph, der isomorph zu Kn ist, heißt Clique auf n Knoten, oder kurz: n-Clique. Ein Graph, der isomorph zu En ist, heißt stabile Menge auf n Knoten, oder kurz: n-stabile Menge. 1 Es werden hier fast ausschließlich nur sogenannte einfache (endliche) Graphen betrachtet, d.h. Graphen ohne Schlingen (Kanten, deren Endpunkte zusammenfallen) und ohne mehrfache (parallele) Kanten zwischen zwei Knoten. 2 Wenn x und y die zwei Knoten in Pn bezeichnen, die nur in einer Kante enthalten sind, dann nennt man x und y auch Anfangs- und Endknoten und sagt, dass Pn ein x, y-Pfad ist. Achtung: ein Pfad der Länge n hat n + 1 Knoten (aber n Kanten). Manchmal spricht man auch von vollständigen Graphen statt von Cliquen, oder von unabhängigen statt von stabilen Mengen. Definition 1.6 (Subgraphen) Ein Graph H = (W, F ) heißt Subgraph eines Graphen G = . Zwei Sonderfälle verdienen eigene (V, E), in Zeichen H ⊆ G, falls W ⊆ V und F ⊆ E ∩ W 2 Namen: Falls F = E ∩ W 2 , dann heißt H induzierter Subgraph von G. In diesem Fall ist G offensichtlich durch die Auswahl der Knoten W festgelegt und wir schreiben auch H = G[W ]. Falls W = V , dann heißt H aufspannender Subgraph von G. Wenn G = (V, E, ) ein gewichteter Graph ist und H = (W, F ) ⊆ G, dann sei (H) := das Gewicht (manchmal auch die Länge) von H. e∈F (e) Definition 1.7 (zusammenhängender Graph, Baum) Ein Graph G = (V, E) heißt zusammenhängend, wenn es für alle Knoten x, y ∈ V einen x, y-Pfad als Subgraph von G gibt. Ein Graph G heißt kreisfrei, wenn es keinen Kreis als Subgraphen von G gibt. Wenn G zusammenhängend und kreisfrei ist, nennt man G einen Baum. Mit diesen Vokabeln ausgestattet können wir bereits eine Reihe von wichtigen kombinatorischen Optimimerungsproblemen präzise definieren. Definition 1.8 a) Kürzester Weg: Eingabe: G = (V, E, ) und s, t ∈ V . Gesucht: s, t-Pfad H als Subgraphen von G, der (H) minimiert. b) Minimal aufspannender Baum: Eingabe: G = (V, E, ). Gesucht: Baum H als aufspannenden Subgraphen von G, der (H) minimiert. c) Minimal aufspannender Kreis / Travelling Salesman Problem: Eingabe: G = (V, E, ). Gesucht: Kreis H als aufspannenden Subgraphen von G, der (H) minimiert. d) Größte Clique: Eingabe: G = (V, E). Gesucht: Clique H auf k Knoten als Subgraphen von G, der k maximiert. Analog kann man natürlich auch eine größte stabile Mengen suchen. Die entsprechenden Kardinalitäten der Clique bzw. der stabilen Menge heißen Cliquenzahl ω(G) und Stabilitätszahl α(G): ω(G) := max{k ∈ N : ∃k-Clique in G} α(G) := max{k ∈ N : ∃k-stabile Menge in G} Bemerkung 1.9 Wir werden im Laufe der Vorlesung sehen, dass es für die Probleme a) und b) effiziente Verfahren gibt, die eine optimale Lösung finden. Wir werden außerdem zeigen, dass dies für das Problem c) aller Voraussicht nach nicht möglich ist, es aber Verfahren gibt, die einer optimalen Lösung beweisbar nahe kommen; was wiederum für das Problem d) ebenfalls außer Reichweite zu liegen scheint. Definition 1.10 (Nachbarn) Zwei Knoten u, v ∈ V eines Graphen G = (V, E) heißen adjazent, verbunden oder benachbart, falls {u, v} ∈ E. Eine Kante e ∈ E berührt oder inzidiert mit einem Knoten v ∈ V , wenn v ∈ e. Die Nachbarschaft eines Knotens v ∈ V ist die Menge N (v) := {u ∈ V | {u, v} ∈ E} der Nachbarn von v. Der Grad deg(v) := |N (v)| eines Knotens v ∈ V zählt die Kanten, die in dem Graphen mit v inzidieren. (Manchmal schreibt man auch NG und degG , um zu betonen, um welchen Graphen es sich handelt.) Mit Δ(G) und δ(G) werden der größte und der kleinste in G auftretende Grad bezeichnet. Ist Δ(G) = δ(G) = k, dann spricht man von einem k-regulären Graphen. Sei G = (V, E) und v ∈ V . Mit G − v bezeichnet man den Graphen, den man erhält, wenn man v 3 aus V und alle Kanten aus E, die mit v inzidieren, entfernt. Sei e ∈ E. Mit G − e bezeichnet man den Graph, aus dem man lediglich die Kante e entfernt, also (V, E \ {e}). Proposition 1.11 Für jeden Graphen G = (V, E) gilt: a) v∈V d(v) = 2|E|, b) G hat eine gerade Anzahl von Knoten ungeraden Grades. Beweis. a) Wenn wir die Summe der Grade bilden, dann zählen wir jede Kante genau zweimal, nämlich von jedem ihrer zwei Endknoten aus einmal. b) Siehe Übungsaufgabe 0.2. Vorlesung 19.10.07 Proposition 1.12 a) Wenn G = (V, E) ein Baum und |V ≥ 2 dann hat G mindestens zwei Blätter, d.h. Knoten v, w mit deg(v) = deg(w) = 1. b) Sei G = (V, E) zusammenhängender Graph mit Kreis C, un es sei e eine beliebige Kante im Kreis. Dann ist G := G − e ein zusammenhängender Graph. c) Ein Graph G ist zusammenhängend genau dann wenn G einen Baum als aufspannenden Subgraphen besitzt. Beweis. ... Satz 1.13 Für einen Graphen G = (V, E) auf n = |V | Knoten sind äquivalent: a) G ist ein Baum; b) G ist zusammenhängend und hat n − 1 viele Kanten; c) G ist kreisfrei und hat n − 1 viele Kanten; d) G ist Kanten-maximal kreisfrei; e) G ist Kanten-minimal zusammenhängend; f ) Je zwei Knoten aus V sind in G durch genau einen Pfad verbunden. Beweis. Wir zeigen hier exemplarisch nur die Implikation a) ⇒ b). Der Rest folgt eventuell in den Übungen... Für die Anzahl der Bäume gibt es eine sehr schöne, kurze Formel, die wir hier ohne Beweis angeben. Satz 1.14 (Cayley, 1882) Die Anzahl der Bäume mit Knotenmenge [n] beträgt nn−2 . Definition 1.15 (Bipartite Graphen) Ein Graph G = (V, E) heißt bipartit genau dann, wenn ˙ hat, so dass A und B stabile Mengen induzieren. seine Knotenmenge V eine Partition V = A∪B Mit anderen Worten: alle Kanten verlaufen zwischen A und B, d.h. E ⊆ {{a, b} : a ∈ A, b ∈ B} . Bei Gleichheit spricht von einem vollständigen bipartiten Graphen, und bezeichnet ihn in Analogie zum K|V | mit K|A|,|B| . Bemerkung 1.16 a) Stabile Mengen, Pfade und (wie wir gleich sehen werden) Bäume im allgemeinen sind bipartit. b) Ein Kreis ist genau dann bipartit, wenn er eine gerade Anzahl von Knoten besitzt. 4 Definition 1.17 (Zusammenhangskomponente, Abstand, Sphäre) Sei G = (V, E) ein Graph. a) Eine Zusammenhangskomponente von G ist ein inklusionsmaximaler zusammenhängender Subgraph von G. b) Der Abstand zwischen zwei Knoten u, v ist definiert als: min{k ∈ N : ∃ u, v-Pfad der Länge k} : falls es einen u, v−Pfad gibt, dist(u, v) := ∞ : sonst. c) Sei u ∈ V . Für 0 ≤ i ≤ n − 1 heißt dann die Knotenmenge Si (u) := {v ∈ V : dist(u, v) = i} die i-te Sphäre um u. Offensichtlich gilt S0 (u) = {u} und S1 (u) = N (u). Mit Hilfe des Begriffs der Sphäre lässt sich zeigen, dass ungerade Kreise das einzige Hindernis für einen bipartiten Graphen darstellen. Satz 1.18 (König 1936) Sei G = (V, E) ein zusammenhängender Graph. Dann sind äquivalent: a) G ist bipartit. b) G enthält keine Kreise ungerader Länge als Subgraphen. c) Für jeden Knoten u ∈ V gilt: A := S0 (u) ∪ S2 (u) ∪ ... und B := S1 (u) ∪ S3 (u) ∪ ... bilden stabile Mengen. Beweis. Die Implikation c) ⇒ a) ist klar nach Definition, weil für die so definierten Mengen A und ˙ B gilt: V = A∪B. Die Implikation a) ⇒ b) ist auch klar, siehe auch 1.16b). Um die Implikation b) ⇒ c) zu zeigen, nehmen wir an, dass es eine Kante e = {x, y} gebe, die innerhalb von A oder B liegt. Wir unterscheiden zwei Fälle:... Damit ist insbesondere klar, dass Bäume bipartit sind (wie in Bemerkung 1.16 angekündigt). Vorlesung 25.10.07 Definition 1.19 (Färbung) Sei k ∈ N. Eine k-Färbung von G ist eine Abbildung f : V → [k] mit ∀{x, y} ∈ E : f (x) = f (y). Die chromatische Zahl von G wird bezeichnet mit χ(G) := min{k ∈ N : G hat eine k-Färbung }. Bemerkung 1.20 a) Der folgende Graph hat chromatische Zahl 3... b) G ist genau dann bipartit, wenn χ(G) ≤ 2. c) χ(C2k ) = 2 und χ(C2k+1 ) = 3. d) χ(Kn ) = n und χ(En ) = 1. e) ω(G) ≤ χ(Kn ). f ) |V |/α(G) ≤ χ(G). g) Wir werden noch sehen: es ist algorithmisch einfach, zu entscheiden, ob χ(G) ≤ 2, aber schwer zu entscheiden, ob χ(G) ≤ 3. Definition 1.21 (Laundau–Notation) Es seien f, g : N → R+ zwei Funktionen. Wir schreiben f (n) = O (g(n)) wenn es Konstanten c ∈ R+ und n0 ∈ N gibt, so daß f (n) ≤ c g(n) ∀n ≥ n0 . Wir schreiben f (n) = Ω (g(n)) , 5 wenn es Konstanten c ∈ R+ und n0 ∈ N gibt, so daß f (n) ≥ c g(n) ∀n ≥ n0 . Wir schreiben f (n) = Θ (g(n)) , wenn es Konstanten c1 , c2 ∈ R+ und n0 ∈ N gibt, so daß c1 g(n) ≤ f (n) ≤ c2 g(n) ∀n ≥ n0 . Wir schreiben f (n) = o (g(n)) , wenn es für jede Konstante c ∈ R + eine Konstante n0 ∈ N gibt, so daß f (n) ≤ c g(n) ∀n ≥ n0 . Wir schreiben f (n) = ω (g(n)) , wenn es für jede Konstante c ∈ R+ eine Konstante n0 ∈ N gibt, so daß f (n) ≥ c g(n) ∀n ≥ n0 ; Beispiel 1.22 a) 7n2 + 17n = O(n2 ), b) 17n = O(n2 ), c) 7n2 + 17n = Θ(n2 ), c) 17 n2 = o(n2 ), d) 17 n2 = o(n2.1√), e) n2 + 5n − 7 n + (−1)n ln n = Θ(n2 ). Bemerkung 1.23 a) limn→∞ f (n) g(n) =0 ⇔ f (n) = o(g(n)) b) f (n) = Θ(g(n) genau dann, wenn f (n) = O(g(n)) und f (n) = Ω(g(n)). Definition 1.24 (Repräsentationen von Graphen) Es sei G = (V, E) ein Graph. Wir wollen im Folgenden zwei Möglichkeiten der Repräsentation und Speicherung von Graphen betrachten. Ab jetzt gelte immer, falls nichts anderes gesagt wird: Für einen Graphen G = (V, E) setzen wir n := |V | und m := |E|. (1) Adjazenzliste Feld von n Listen, eine für jeden Knoten in V Für v ∈ V enthält die Liste Adj[v] Verweise auf alle Knoten, die zu v benachbart sind. Vorteil: Kompakte Darstellung (O(n + m) Speicher) Nachteil: Test, ob {v, w} Kante ist, kostet in schlechtestem Fall O(n) Zeit (2) Adjazenzmatrix n × n Matrix A = (aij ) mit 1 , falls {i, j} ∈ E aij = 0 sonst Vorteil: Test, ob {v, w} Kante ist, kostet O(1) Zeit Nachteil: Adjazenzmatrix erfordert Θ(n2 ) Speicher. Bemerkung 1.25 Falls m = O(n) ist ein Aufwand von O(n + m) natürlich viel besser als O(n2 ). Ein Verfahren mit Platz- oder Zeitkomplexität O(m+n) ist daher einem Verfahren mit Komplexität O(n2 ) vorzuziehen. Wir werden einige Beispiele für kanonische Graphenklassen sehen, für die m = O(n) gilt. 6 Wir kommen nun zu zwei für Graphenalgorithmen fundamentale Prinzipien, der Breitensuche (engl. Breadth-First-Search, kurz BFS) und der Tiefensuche (engl. Depth-First-Search, kurz DFS). Beide stellen Methoden dar, einen Graphen zu durchsuchen bzw. zu durchlaufen, um Strukturinformation über den Graphen zu gewinnen. Viele Graphenalgorithmen sind nichts anderes als eine auf das Problem abgestimmte Variante der Breiten- oder Tiefensuche. Breitensuche. Zu einem gegebenen Startknoten u ∈ V berechnet der Algorithmus Breitensuche beginnend mit i = 0 sukzessive aus der Sphäre Si (u) die Sphäre Si+1 (u) durch Untersuchung der Nachbarn der Knoten in Si - bis schließlich alle Knoten der Zusammenhangskomponente von G, die u enthält, besucht wurden. Die Knoten werden dabei in einer Warteschlange (engl. Queue) Q abgespeichert, die nach dem first-in first-out Prinzip arbeitet. Mit Enqueue (Q, u) wird das Element u am Ende von Q eingefügt, mit v := Dequeue (Q) wird das Element am Anfang von Q als v gespeichert und aus Q entfernt. Als ein Ergebnis der Breitensuche werden die Knoten nach und nach als bekannt“ markiert. ” Dazu wird ein Vektor bekannt der Länge n mitgeführt; seine i-te Komponente bekannt[i] ist gleich 0, wenn der Knoten i noch nicht bekannt ist, andernfalls ist sie gleich 1. Vorlesung 26.10 Algorithmus 1.26 Input: Graph G = (V, E), Knoten u ∈ V Output: Feld “bekannt“ BFS(G, u) (1) Enqueue (Q, u) (2) bekannt[u] := 1; foreach w ∈ V \ {u} do bekannt[w] := 0 (3) while Q = ∅ (4) v := Dequeue (Q) (5) foreach w ∈ N (v) and bekannt[w] = 0 (6) Enqueue (Q, w) (7) bekannt[w] := 1 Proposition 1.27 Sei G = (V, E) ein Graph und u ∈ V ein Knoten von G, sowie H = (W, F ) die Zusammenhangskomponente von G, die u enthält. Dann besucht BFS(G, u) alle Knoten und Kanten von G, die in H liegen, genau einmal. Das heißt: die Knoten werden genau einmal in Q aufgenommen (und dabei als bekannt markiert) und die Kanten werden genau einmal (in Schritt (5)) entlang gegangen. Die Laufzeit beträgt O(|V | + |F |). ¾ Beweis: ... Durch eine minimale Erweiterung von BFS können wir auch die Abstände von u zu allen anderen Knoten berechnen und einen aufspannenden Baum berechnen. Algorithmus 1.28 Input: Graph G = (V, E), Knoten u ∈ V Output: Felder “bekannt“, “abst“, “vor“ BFS∗ (G, u) (1) Enqueue (Q, u) (2) bekannt[u] := 1; foreach w ∈ V \ {u} do bekannt[w] := 0 (3) abst[u] := 0 (4) while Q = ∅ (5) v:= Dequeue (Q) (6) foreach w ∈ N (v) and bekannt[w] = 0 (7) Enqueue (Q, w) (8) bekannt[w] := 1 (9) abst[w] := abst[v] + 1 (10) vor[w] := v 7 Proposition 1.29 Sei G = (V, E) ein Graph und u ∈ V ein Knoten von G, sowie H = (W, F ) die Zusammenhangskomponente von G, die u enthält. Dann gilt für BFS∗ (G, u): a) Wenn w in Q aufgenommen wird, hat vor[w] Q als letzter Knoten verlassen. b) Wenn a vor b in Q aufgenommen wird, dann gilt abst[a] ≤ abst[b]. c) Zu jedem Zeitpunkt unterscheiden sich die abst[.]-Werte in Q nur um maximal 1. d) Die Folge w, vor[w], vor[vor[w]], . . . bildet einen w, u-Pfad der Länge abst[w]. e) Die Kantenmenge F := {{w, vor[w]} : w ∈ W \ {u}} bildet die Kantenmenge eines aufspannenden Baumes von H. f ) Für alle w ∈ W gilt: abst[w] = dist(u, w). Beweis: a) gilt nach Konstruktion. b) und c): diese Bedingungen gelten zu Beginn, wenn Q = (u). Jeder neue Knoten w erhält einen Wert abst[w], der um eins höher ist als der von vor[w], welcher Q gerade verlassen hat (siehe a)). Also bleiben die Bedingungen erhalten. d) Zwischen w und vor[w] ist nach Konstruktion eine Kante. Da abst[w] − 1 = abst[vor[w]] sinkt der abst[.] Wert in dieser Folge mit jedem Schritt um 1, es muss sich also um einen Pfad handeln, der bei u endet und Länge abst[w] hat. e) F enthält n − 1 Kanten. Wegen d) enthält der Graph (V, F ) für alle Knoten w einen w-u-Pfad, ist also zusammenhängend, und damit nach Satz 1.13 ein Baum. f) Wegen d) gilt abst[w] ≥ dist(u, w) für alle Knoten w. Es genügt also zu zeigen, dass auch abst[w] ≤ dist(u, w) gilt. Wir beweisen dies durch Induktion über dist(u, w). Wenn dist(u, w) = 0, dann u = w und abst[u] = 0. Gelte also die Behauptung für alle Knoten mit kleinerem Abstand zu u als w. Betrachte einen kürzesten u, w-Pfad P . Sei y der Nachbar von w auf P . Nach Induktionsannahme gilt abst[y] ≤ dist(u, y). Außerdem ist dist(u, y) + 1 = dist(u, w). Also muss wegen abst[w] ≥ dist(u, w) > dist(u, y) ≥ abst[y] und Kontraposition von b) der Knoten y vor dem Knoten w die Schlange Q verlassen haben. Entweder w ist zu dem Zeitpunkt, wo y die Schlange Q verlässt, schon in Q; dann gilt nach c) abst[w] ≤ abst[y]+1 ≤ dist(u, y)+1 = dist(u, w), was zu zeigen war. Oder w kommt jetzt in die Schlange, dann ist vor[w] = y und wiederum abst[w] = abst[y] + 1 ≤ dist(u, y) + 1 = dist(u, w), was zu zeigen war. ¾ Tiefensuche. In vielen Fällen ist es unerheblich, in welcher Reihenfolge man die Knoten und Kanten eines Graphen abläuft – entscheidend ist, daß alle Knoten und Kanten (ggf. einer Zusammenhangskomponente) besucht“ werden. Der Algorithmus Tiefensuche, den wir nun kennen” lernen werden, unterscheidet sich von Breitensuche lediglich durch die Auswahlstrategie für die zu besuchenden Knoten und ist ein repräsentatives Beispiel für den sinnvollen Einsatz rekursiver Programmierung. Ein ausgewählter Knoten u ∈ V wird der Startknoten der Tiefensuche. Wenn es einen Nachbarn w gibt, der noch unbekannt ist, dann markiere diesen Knoten als bekannt und wähle ihn als einen neuen Startknoten für einen rekursiven Aufruf der Tiefensuche. Gibt es während eines solchen Aufrufs einmal keinen unbekannten Nachbarn, dann beende diesen rekursiven Aufruf und kehre zu dem Vorgänger zurück, und betrachte dessen Nachbarn (weiter). Algorithmus 1.30 Input: Graph G = (V, E), Knoten u ∈ V Output: Felder “bekannt“, “vor“ DFS(G, u) (1) foreach v ∈ V (2) bekannt[v] := 0 (3) DFS-visit(u) DFS-visit(v) (1) bekannt[v] := 1 (2) foreach w ∈ N (v) (3) if bekannt[w] = 0 then vor[w] := v, DFS-visit(w) Vorlesung 02.11.07 8 Proposition 1.31 Sei G = (V, E) ein Graph und u ∈ V ein Knoten von G, sowie H = (W, F ) die Zusammenhangskomponente von G, die u enthält. Dann markiert DFS(G, u) alle Knoten und Kanten von G, die in H liegen, als bekannt. Die Kantenmenge F̂ := {{w, vor[w]} : w ∈ W \ {u}} bildet einen aufspannenden Baum von H. Die Laufzeit beträgt O(|V | + |F |). Beweis: Die Laufzeit der Tiefensuche kann wie folgt abgeschätzt werden: jeder Knoten wird höchstens einmal in DFS-visit aufgerufen, danach ist er bekannt und kann nicht noch einmal aufgerufen werden. Wenn DFS-visit für Knoten v aufgerufen wird, entstehen Kosten in der Höhe von maximal deg(v). Also in der Summe O(|V | + v∈W deg(w)) = O(|V | + |F |) ergibt. Ansonsten verläuft der Beweis analog zu den Beweisen von 1.27 und 1.29. 9 ¾ 2 Kürzeste Wege, minimal spannende Bäume, Matroide 2.1 Kürzeste Wege Definition 2.1 (Kürzeste Pfade Problem, vergleiche auch Definition 1.8) Gegeben ein Graph G = (V, E) mit einer Längen- (oder Gewichts-) Funktion : E → R≥0 , sowie s, t ∈ V . Gesucht ist ein s, t-Pfad P = (W, F ) ⊆ G mit minimaler Länge (e). dist(s, t) := (P ) := e∈F Lemma 2.2 Sei P = (v1 , . . . , vk ) ein kürzester v1 , vk -Pfad. Dann ist für alle 1 ≤ i ≤ j ≤ k der Pfad (vi , . . . , vj ) ein kürzester vi -vj -Pfad. Beweis: Klar durch Einsetzen eines angeblich kürzeren Pfades. ¾ Algorithmus 2.3 Input: Graph G = (V, E), Längenfunktion : E → R+ , Knoten s ∈ V Output: Feld “abst“ Dijkstra(G, , s) (1) foreach x ∈ V \ {s} do abst[x] := ∞ (2) abst[s] := 0 (3) Q := V (4) while Q = ∅ (5) x := Knoten in Q mit kleinstem abst[.]-Wert (6) Q := Q \ {x} (7) foreach y ∈ N (x) ∩ Q (8) abst[y] := min{abst[y], abst[x] + ({x, y}) Proposition 2.4 Der Algorithmus von Dijkstra hat Laufzeit O(n2 ) und berechnet abst[x] = dist(s, x) für alle x ∈ V . ¾ Beweis: . . . Bemerkung 2.5 a) Bei der Distanzberechnung in einem ungewichteten Graphen mittels Breitensuche reichte“ die ” Reihenfolge in Q. Hier muss genauer geschaut werden (und jedesmal ein neues“ Minimum gebildet ” werden, weil sich die abst[.]–Werte permanent ändern; daher auch die höhere Laufzeit. Durch die Benutzung von intelligenteren Datenstrukturen (zB sogenannten Fibonacci-Heaps) lässt sich das Verfahren auf O(m + n log n) beschleunigen. b) Der Algorithmus von Dijkstra breitet sich kreisförmig um den Startknoten aus und arbeitet nicht zielgerichtet. Dies wird im sogenannten A∗ -Algorithmus verbessert – siehe eventuell in den Übungen. c) Der Algorithmus von Dijkstra funktioniert nicht, wenn es Kanten mit negativer Länge gibt. Warum nicht? d) Der Algorithmus von Dijkstra bestimmt mit abst[x] = dist(s, x) nur die Länge von kürzesten s, x-Pfaden, nicht aber die Pfade selber. Wie kann man das leicht ändern? Vorlesung 8.11. = (V, E, ) mit endlicher KnoDefinition 2.6 Ein gerichteter, gewichteter Graph ist ein Tupel G → R. Für tenmenge V = ∅, gerichteter Kantenmenge E ⊆ V × V und Gewichtsfunktion : E s, t ∈ V definieren wir: • ein gerichteter s, t-Weg ist eine Folge von Knoten W = (v1 , . . . , vk ) mit k ≥ 1 und s = v1 , für alle i ∈ [k − 1], t = vk und (vi , vi+1 ) ∈ E 10 • ein gerichteter s, t-Pfad ist ein gerichteter s, t-Weg mit paarweise verschiedenen Knoten, d.h. vi = vj für alle i = j ∈ [k], • ein gerichteter Zyklus ist ein gerichteter Weg (v1 , . . . , vk ) mit k ≥ 1 und (vk , v1 ) ∈ E, • ein gerichteter Kreis ist ein gerichteter Pfad (v1 , . . . , vk ) mit k ≥ 2 und (vk , v1 ) ∈ E. k−1 ((vi , vi+1 )), das Gewicht eines Das Gewicht eines Weges/Pfades ist definiert durch (W ) := i=1 k−1 Zyklus/Kreises ist definiert durch (W ) := ((vk , v1 )) + i=1 ((vi , vi+1 )). heißt stark zusammenhängend, wenn für alle s, t ∈ V ein s, t-Weg in G existiert. Die Distanz von G s zu t ist definiert als min{(W ) : W ist ger. s, t−Weg} : falls es einen ger. s, t-Weg gibt, dist(s, t) := ∞ : sonst. = (V, E, ) stark zusammenhängend. Dann gilt: Proposition 2.7 Sei G a) Wenn es einen Zyklus W mit (W ) < 0 gibt, dann gilt dist(u, v) = −∞ für alle u, v ∈ V . b) Wenn es keinen solchen Zyklus gibt, dann gibt es zu jedem Paar u, v ∈ V einen u, v-Pfad W = (v1 , . . . , vk ) mit (W ) = dist(u, v) und c) für alle i ≤ j ∈ [k] ist der Pfad (vi , . . . , vj ) ein kürzester vi , vj -Weg. ¾ Beweis: ... Bemerkung 2.8 Wir treffen die folgenden Vereinbarungen. Wir schreiben abgekürzt (i, j) = ((i, j)). Außerdem setzen wir (i, j) := 0 wenn i = j, und (i, j) := ∞ wenn i = j und (i, j) ∈ E. Wir wollen nun in dem veränderten Szenario (gerichteter Graph, eventuell negative Kantenlängen) die Distanzen dist(u, v) für alle geordneten Paare u, v ∈ V bestimmen. Das folgende Lemma ist das Kernstück des Algorithmus und illustriert die Strategie der dynamischen Programmierung. = (V, E), :E → R und i, j ∈ [n] und k ∈ [0, n]. Es seien Lemma 2.9 Seien G P ki,j := {P = (v1 , . . . , vr ) : P ist gerichteter i, j-Pfad und v2 , . . . , vr−1 ∈ [k]} , dki,j := min{(P ) : P ∈ P ki,j }. Dann gilt: dki,j = (i, j) k−1 k−1 min{dk−1 i,j , di,k + dk,j } : : falls k = 0 falls k ≥ 1 ¾ Beweis: ... Algorithmus 2.10 = (V, E), Längenfunktion : E → R, Input: Graph G habe keine Kreise negativer Länge Voraussetzung: G Output: n × n Matrix D Floyd–Warshall(G, ) (1) for i = 1 to n (2) for j = 1 to n (3) d0i,j := (i, j) (4) for k = 1 to n (5) for i = 1 to n (6) for j = 1 to n k−1 k−1 (7) dki,j := min{dk−1 i,j , di,k + dk,j } n (8) return D := (di,j )1≤i,j≤n Proposition 2.11 Algorithmus 2.10 berechnet in O(n3 ) die Matrix D[i, j] = dni,j = dist(i, j) für alle Paare i, j ∈ [n]. 11 ¾ Beweis: ... Angenommen, man hat die Distanzen berechnet. Was ist zu tun, um die kürzesten Pfade zu ermitteln? Bemerkung 2.12 a) Wir illustrieren die Pfadberechnung am Beispiel des Algorithmus Floyd–Warshall. Sei dazu k k k k ∈ P ki,j mit (Pi,j ) = dki,j ; und sei πi,j der Vorgänger von j auf Pi,j . Dann gilt: Pi,j 0 = πi,j k πi,j = i N IL : : falls i = j und (i, j) ∈ E sonst k−1 πi,j k−1 πk,j : : k−1 k−1 falls dk−1 i,j ≤ di,k + dk,j k−1 k−1 falls dk−1 i,j > di,k + dk,j b) Algorithmus 2.10 setzt voraus, dass der Graph keine Kreise negativer Länge besitzt. Wie überprüft man das? Behauptung: G hat genau dann einen Zyklus negativer Länge. wenn es gibt i, k ∈ [n] mit dki,i < 0. Vorlesung 9.11. 2.2 Minimal spannende Bäume Definition 2.13 (minimal spannender Baum) Gegeben ein (ungerichteter) Graph G = (V, E) und eine Längenfunktion : E → R≥0 . Gesucht ist ein spannender Baum T = (V, F ) ⊆ G (engl: minimal spanning tree, kurz: MST), so dass (T ) := e∈F (e) minimal unter allen spannenden Bäumen von G ist. Idee: Wir bauen den Baum sukzessive auf, indem zu einem bereits konstruierten Teilbaum die kürzeste Kante zwischen Baumknoten“ und Nicht-Baumknoten“ hinzugefügt wird. ” ” Algorithmus 2.14 (Algorithmus von Prim) Input: Graph G = (V, E), Längenfunktion : E → R≥0 Output: Baum T = (V, F ) Prim(G, ) (1) Wähle beliebigen Knoten s ∈ V (2) W := {s}, F := ∅, σ[s] := 0 (3) foreach v ∈ N (s) do vor[v] := s, σ[v] := (s, v) (4) foreach v ∈ V \ (N (s) ∪ {x}) do vor[v] := N IL, σ[v] := ∞ (5) (6) (7) (8) (9) (10) while W = V y := Knoten mit minimalem σ[.]-Wert in V \ W W := W ∪ {y}, F := F ∪ {vor[y], y} foreach z ∈ N (y) ∩ (V \ W ) mit σ[z] > (y, z) σ(z) := (y, z) vor[z] := y Satz 2.15 Der Algorithmus von Prim arbeitet korrekt und kann mit Laufzeit O(n2 ) implementiert werden. Beweis. Korrektheit: Nach jedem Durchlauf der WHILE-Schleife gilt: (1) T = (W, F ) ist Baum auf W . 12 (2) Für alle v ∈ V \W gilt σ[v] = min{(x, v) | x ∈ W und {x, v} ∈ E} und σ[v] = (vor[v], v). (3) Es gibt einen minimalen spannenden Baum T ∗ mit T ⊆ T ∗ . Aus (1) und (3) folgt die Behauptung, daß der Algorithmus von Prim korrekt arbeitet. Offensichtlich gelten (1) - (3) nach der Initialisierung. Angenommen, (1) - (3) gelten zu Beginn einer WHILE-Schleife. Sei T der zu Beginn der WHILE-Schleife konstruierte Baum, sei T ∗ ein minimal spannender Baum, der T enthält, und sei y der Knoten, der im jetzt folgenden Schleifendurchlauf neu zu W hinzugefügt wird. Dann gelten nach Konstruktion (1) und (2) auch nach Beendigung der WHILESchleife (bzgl. der neuen Menge W). Es bleibt, (3) zu zeigen. Falls {y, vor[y]} ∈ E(T ∗ ), sind wir schon fertig. Angenommen, dies ist nicht der Fall. Dann existiert Pfad P ∗ in T ∗ , der vor[y] mit y verbindet. Sei {x , v } ∈ P ∗ die Kante, die W ”verläßt”, mit x ∈ W und v ∈ V \ W . Nach Wahl von y und (2) gilt (vor[y], y) = σ[y] ≤ ≤ σ[v ] (v , x ). Betrachte T̃ := (T ∗ \{v , x }) ∪ {vor[y], y} . T̃ ist spannender Baum in G (weil wieder zusammenhängend und n − 1 Kanten) der Länge (T̃ ) = (T ∗ ) − (v , x ) + (vor[y], y) ≤ (T ∗ ) Da T ∗ ein minimal spannender Baum ist, gilt (T̃ ) = (T ∗ ), und T̃ ist auch ein minimal spannender Baum, der zudem T enthält. Laufzeit: Die Initialisierung benötigt O(n) Schritte. Die WHILE-Schleife wird (n − 1)-mal durchlaufen, und in jedem Durchlauf werden höchstens O(n)-Schritte benötigt, insgesamt also O(n2 ). ¾ Bemerkung: Es ist möglich, den Algorithmus von Prim mit O(m + n log n) Laufzeit zu implementieren. Hier die Idee für einen noch einfacheren Algorithmus: Wähle in jedem Schritt die kürzeste Kante überhaupt, die keinen Kreis erzeugt. Algorithmus 2.16 (Algorithmus von Kruskal) Input: Graph G = (V, E), Längenfunktion : E → R+ Output: Baum T = (V, F ) Kruskal(G, ) (1) Sortiere alle Kanten in E so, daß (e1 ) ≤ · · · ≤ (em ); (2) F := ∅; (3) for i = 1 to m (4) if (V, F ∪ {ei }) kreisfrei then F := F ∪ {ei } Satz 2.17 Der Algorithmus von Kruskal arbeitet korrekt und kann mit Laufzeit O((m + n) log n) implementiert werden. 13 Vorlesung 15.11.07 Beweis: Die Korrektheit beweisen wir im nächsten Abschnitt in einem allgemeinen Rahmen. Zur Laufzeit: Sortieren kostet O(m log m) = O(m log n). Test auf Kreisfreiheit: wir können uns nicht n-mal einen O(m)-Test via BFS leisten. Stat dessen merken wir uns für jede Komponente einen repräsentativen Knoten (R-Knoten). Jeder Knoten zeigt auf den R-Knoten seiner Komponente (zu Beginn, beim leeren Graphen, auf sich selber). Jeder R-Knoten merkt sich außerdem noch die Größe seiner Komponente. Wenn nun eine neue Kante ei = {x, y} im Algorithmus getestet wird, brauchen wir lediglich die R-Knoten von x und y zu vergleichen: wenn sie gleich sind, liegen x und y in der gleichen Komponente und {x, y} darf nicht zu F hinzugefügt werden. Andernfalls liegt die Kante zwischen zwei Komponenten und darf hinzugefügt werden. In dem Fall wählen sich alle Knoten der kleineren Komponente den R-Knoten der größeren Komponente als neuen R-Knoten, und dieser R-Knoten merkt sich, dass seine Komponente eine neue Größe bekommen hat. Wir sagen, dass die Knoten der kleineren Komponente korrigiert werden. Ein Test (ob eine Kante eingefügt werden darf) geht mit dieser Datenstruktur in O(1). Das Update in einer Runde (in der eine Kante hinzugefügt wird) verursacht Kosten, die proportional zu der Anzahl der zu korrigierenden Knoten sind. Die Komponentengröße eines korrigierten Knoten verdoppelt sich mindestens. Das heißt, das jeder Knoten höchstens log n mal korrigiert wird, und ¾ damit sind die gesamten Update Kosten O(n log n). 2.3 Matroide Definition 2.18 (Unabhängigkeitssystem, Matroid) Ein Unabhängigkeitssystem ist ein Paar (E, I), wobei E eine endliche Menge ist und ∅ = I ⊆ P(E) und die die Bedingung B ∈ I, A ⊆ B ⇒ A ∈ I (3) erfüllt ist. E heißt Grundmenge, die Mengen A ⊆ E mit A ∈ I heißen unabhängig, und die Mengen B ⊆ E mit B ∈ I heißen abhängig. Wenn außerdem noch gilt, dass ∀A, B ∈ I mit |A| < |B| : ∃e ∈ B \ A mit (A ∪ {e}) ∈ I, (4) dann nennen wir (E, I) ein Matroid. Proposition 2.19 Sei G = (V, E) ein Graph und sei I := {F ⊆ E : (V, F ) ist kreisfreier Graph }. Dann ist (E, I) ein Matroid. ¾ Beweis: ... Proposition 2.20 Sei (E, I) ein Unabhängigkeitssystem. Dann gilt: a) ∅ ∈ I. b) (E, I) ist genau dann Matroid, wenn gilt: ∀A, C ∈ I, |A| + 1 = |C| : ∃e ∈ C \ A mit (A ∪ {e}) ∈ I. (5) ¾ Beweis: ... Proposition 2.21 Sei (E, I) ein Unabhängigkeitssystem, F ⊆ E und IF := {A ∈ I : A ⊆ F }. Dann gilt: a) (F, IF ) ist ein Unabhängigkeitssystem. b) Wenn (E, I) ein Matroid ist, dann ist auch (F, IF ) ein Matroid. (F, IF ) heißt das durch F induzierte Unabhängigkeitssystem. 14 ¾ Beweis: klar nach Definition. Definition 2.22 Sei U = (E, I) ein Unabhängigkeitssystem. Jede inklusionsmaximale unabhängige Menge von I heißt Basis. Jede inklusionsminimale abhängige Menge von I heißt Kreis. Wir definieren den oberen Rang von U := r+ (U ) := max{|B| : B Basis von U } unteren Rang von U := r− (U ) := min{|B| : B Basis von U }. Wenn R+ (U ) = r− (U ) =: r(U ), dann heißt r(U ) Rang von U . Mit dieser Definition kann man nun eine neue Charakterisierung von Matroiden angeben: Lemma 2.23 Sei U = (E, I) ein Unabhängigkeitssystem. Dann gilt: U ist genau dann ein Matroid, wenn ∀F ⊆ E und UF := (F, IF ) gilt, dass r+ (UF ) = r− (UF ). ¾ Beweis: ... Lemma 2.24 Sei M := (E, I) ein Matroid, A ∈ I, e ∈ E, A ∪ {e} ∈ I. Dann enthält A ∪ {e} genau einen Kreis. Beweis. eventuell später. Vorlesung 16.11.07 Definition 2.25 Ein Maximierungsproblem über einem Unabhängigkeitssystem E, I) ist gegeben durch eine Gewichtsfunktion : E → R≥0 (und der Vereinbraung, dass für Mengen A ∈ I wieder (A) := e∈A (e) sein soll). Gesucht ist eine Menge A∗ ∈ I mit (A∗ ) = max (A). A∈I Algorithmus 2.26 (Greedy–Algorithmus zur Maximierung über Unabh.sys.) Input: Unabhängigkeitssystem (E, I), Gewichtsfunktion : E → R+ Output: Ag ∈ I Greedy–Max(E, I, ) (1) Sortiere E = {e1 , . . . , em } so, daß (e1 ) ≥ · · · ≥ (em ); (2) Ag := ∅; (3) for i = 1 to m (4) if Ag ∪ {ei } ∈ I then Ag := Ag ∪ {ei } Dieser Algorithmus heißt Greedy–Algorithmus (engl. greedy = gierig), weil er in jedem Schritt den größtmöglichen Gewinn anstrebt. Eine von ihm gefundene Lösung Ag ∈ I wollen wir Greedy– Lösung von (E, I, ) nennen. Unser Ziel ist es nun, eine weitere Charaktersierung von Matoriden zu finden, nämlich dass der Greedy–Algorithmus genau dann das Maximierungsproblem optimal löst, wenn (E, I) ein Matroid ist. Tatsächlich werden wir noch mehr beweisen. Definition 2.27 Sei U = (E, I) ein Unabhängigkeitssystem. Für F ⊆ E setzen wir wieder UF := (F, IF ) und 1 falls r+ (UF ) = 0 κ(F ) := r− (UF ) falls r− (UF ) > 0 r+ (UF ) und nenne ρ(U ) := min{κ(F ) : F ⊆ E} den Rangquotienten von U . 15 Bemerkung 2.28 Sei U = (E, I) ein Unabhängigkeitssystem. Dann gilt: a) ρ(U ) ≤ 1. (2.23) (2.27) b) U Matroid ⇔ ∀F ⊆ E: r+ (UF ) = r− (UF ) ⇔ ρ(U ) = 1. Beispiel 2.29 Sei m ≥ 4 und E = {e1 , . . . , em }, und I := {{e1 }} ∪ P({e2 , . . . , em }). Dann ist U := (E, I) ein Unabhängigkeitssystem, aber kein Matroid. Setze außerdem γ ∈ N und : E → N definiert durch γ + 1 für e = e1 , (e) := γ für e ∈ E \ {e1 }. Dann ist Ag = {e1 }, aber die optimale Lösung A∗ des Maximierungsproblems über U ist gegeben durch A∗ = {e2 , . . . , em }. Es gilt also (Ag ) und (A∗ ) = (m − 1)γ. Außerdem ist r− (U ) = 1 und r+ (U ) = m − 1. Man beobachtet also, dass (Ag ) γ+1 1 1 r− (U ) = = (1 + ) ≈ . (A∗ ) γ(m − 1) γ m−1 r+ (U ) Das folgende technische Lemma ist lediglich eine Rechenhilfe: Lemma 2.30 Seien E = {e1 , . . . , em }, A ⊆ E, : E → R. Wir definieren für alle j = 0, . . . , m die Mengen Ej := {e1 , . . . , ej } und Aj := A ∩ Ej . Dann gilt e∈A (e) = m ((ej ) − (ej+1 ))|Aj |, j=1 wobei wir (em+1 ) := 0 setzen. Satz 2.31 Sei (E, I, ) eine Maximierungsaufgabe über dem Unabhängigkeitssystem U = (E, I) mit Greedy-Lösung Ag ⊆ E und optimaler Lösung A∗ ⊆ E. Dann gilt 1≥ (Ag ) ≥ ρ(U ), (A∗ ) und es gibt eine Gewichtsfunktion, für die die zweite Ungleichung mit Gleichheit gilt. Korollar 2.32 Sei U = (E, I) ein Unabhängigkeitssystem. Dann gilt: U ist genau dann Matroid, wenn der Greedy–Algorithmus 2.26 für jede Funktion : E → R≥0 eine optimale Lösung der Maximierungsaufgabe (E, I, ) findet. Vorlesung 22.11.07 Was hilft uns das alles bei dem Versuch, die Korrektheit von Kruskals Algorithmus (siehe 2.16 und 2.17) zu beweisen? Definition 2.33 Sei U = (E, I) ein Unabhängigkeitssystem und J := {B ∈ I : B ist Basis von I}. Dann heißt (E, J) das zu (E, I) gehörige Basissystem. Eine Minimierungsaufgabe über einem Unabhängigkeitssytem (E, I) mit Kostenfunktion : E → R besteht darin, in dem zu (E, I) gehörigen Basissytem (E, J) eine Menge B ∗ ∈ J mit (B ∗ ) = minB∈J (B) zu finden. Beispiel 2.34 Das Problem minimal spannender Baum“ (siehe Definition 2.13) in einem Gra” phen G = (V, E) mit : E → R ist eine Minimierungsaufgabe über dem Unabhängigkeitssystem (E, I) mit : E → R, wobei I := {F ⊆ E : (V, F ) ist kreisfrei}. 16 Proposition 2.35 Sei U = (E, I) ein Unabhängigkeitssystem und (E, J) das zugehörige Basissystem. Sei : E → R eine Kostenfunktion und β := max{0, max{(e) : e ∈ E}}. Definiere ψ(e) := β − (e) für e ∈ E und ψ(A) := e∈A ψ(e) für alle A ∈ I. Dann gilt: βr− (U ) − max{ψ(A) : A ∈ I} ≤ min{(B) : B ∈ J} ≤ βr+ (U ) − max{ψ(A) : A ∈ I}. ¾ Beweis: ... Korollar 2.36 Sei U = (E, I) ein Matroid, (E, J) zugehöriges Basissytem, : E → R eine Kostenfunktion und β und ψ so wie in 2.35 definiert. Wir betrachten den allgemeinen Greedy– Minimierungsalgorithmus über Unabhängigkeitssystemen, den wir aus dem Algorithmus 2.16 erhalten, in dem wir die Bedingung (V, E ∪ {ei }) kreisfrei“ durch F ∪ {ei } ∈ I“ ersetzen. Dann ” ” gilt: a) ψ(e) ≥ 0 für alle e ∈ E. b) βr(U ) − max{ψ(A) : A ∈ I} = min{(B) : B ∈ J}. c) Der Greedy–Minimierungsalgorithmus angewendet auf (E, I, ) berechnet eine Menge B ∗ ∈ J mit (B ∗ ) = min{(B) : B ∈ J}. ¾ Beweis: ... Der Trick mit dem Aufaddieren von β, um die Zielfunktion nicht-negativ zu machen, funktioniert hier, weil (anders als bei dem Problem der kürzesten Wege) im Matroid alle Basen gleich viele Elemente enthalten. Zum Abschluss noch ein kleiner Ausblick: Bemerkung 2.37 Seien M1 := (E, I1 ), . . . , MK := (E, Ik ) Matroide und : E → R≥0 . Dann ist U := (E, I) mit I := I1 ∩ · · · ∩ Ik ein Unabhängigkeitssystem und für den Rangquotienten gilt: ρ(U ) ≥ 1/k. Insbesondere liefert der Greedy–Algorithmus für das Maximierungsproblem auf (E, I, ) eine Approximation der Güte 1 (Ag ) ≥ . (A∗ ) k ¾ Beweis: ohne. 3 Flüsse in Netzwerken Vorlesung 16.11 s, t, c), wobei G = Definition 3.1 (Netzwerk, Fluss) Ein Netzwerk ist ein Tupel N = (V, E, → R≥0 (V, E) ein gerichteter Graph ist, s, t ∈ V zwei ausgezeichnetene Knoten benennen und c : E eine Kapazitätsfunktion. Die Knoten s bzw. t werden Quelle bzw. Senke genannt. Für einen Knoten v ∈ V schreiben wir N + (v) := {w ∈ V : ∃(v, w) ∈ E} N − (v) := {w ∈ V : ∃(w, v) ∈ E}. → R≥0 heisst s-t-Fluss (engl. flow) in N , wenn Eine Abbildung f : E f ((y, x)) = f ((x, y)) ∀x ∈ V \ {s, t} [Flusserhaltung] , y∈N − (x) y∈N + (x) f ((x, y)) ≤ c((x, y)) ∀(x, y) ∈ E [Zulässigkeit] , wobei wir im Folgenden der Einfachheit halber immer nur noch f (x, y) statt f ((x, y)) und c(x, y) statt c((x, y)) schreiben werden. Der Wert von f ist definiert als val(f ) := f (s, y) − f (y, s) y∈N + (s) y∈N − (s) Ein Fluss f hat maximalen Wert in N , falls val(f ) ≥ val(f ) für alle Flüsse f in N gilt. 17 Wenn es Kanten (x, y) und (y, x) mit f (x, y) ≥ f (y, x) > 0 gibt, dann erhält man einen neuen Fluss f mit val(f ) = val(f ) durch f (x, y) := f (x, y)−f (y, x), f (y, x) := 0 und f (u, v) := f (u, v) für alle anderen Kanten (u, v). Wir können also ab jetzt die folgende Vereinbarung treffen: Für jedes Knotenpaar x, y gilt: f (x, y) = 0 oder f (y, x) = 0. Proposition 3.2 Jedes Netzwerk besitzt mindestens einen Fluss maximalen Werts. ¾ Beweis: ... Definition 3.3 (Schnitt) Eine Menge X ⊆ V mit s ∈ X und t ∈ V \ X heißt s-t-Schnitt (engl. cut). Die Kapazität von X ist definiert durch c(u, v) cap(X) := u∈X,v∈N + (u)\X Vorlesung 23.11.07 Lemma 3.4 a) Wenn f ein Fluss und X ein s-t-Schnitt im Netzwerk N sind, dann gilt val(f ) ≤ cap(X). b) f (x, y) − f (y, x) val(f ) = x∈X,y∈N + (x)\X x∈X,y∈N − (x)\X ¾ Beweis: ... Bemerkung 3.5 Wir können das Flussproblem auch als LP formulieren. Dazu führen wir die folgenden Bezeichnungen ein. Sei v ∈ V . Setze δ − (v) := {(x, v) ∈ E}, n := |V |, m := |E|, δ + (v) := {(v, y) ∈ E} = {e1 , . . . , em }, E V = {s, t, v1 , . . . , vn−2 } cT = (ce1 , . . . , cem ) ∈ Rm ≥0 mit cej := c(ej ). Mit unserer Lösungsvariable x ∈ Rm ≥0 beschreiben wir die Flusswerte der einzelnen Kanten: wenn (a, b) = ej , dann soll xej = f (a, b). Unser LP lautet also maxm uT x x∈R u.d.N. Cx = 0, 0 ≤ x ≤ c, wobei uT = (ue1 , . . . , uem ) ∈ Rm definiert ist durch ⎧ + ⎪ ⎨+1 : ej ∈ δ (s) uej = −1 : ej ∈ δ − (s) ⎪ ⎩ 0 : sonst und C = (Cvi ,ej ) ∈ R(n−2)×m mit Cvi ,ej ⎧ ⎪ ⎨+1 = −1 ⎪ ⎩ 0 : ej ∈ δ − (vi ) : ej ∈ δ + (vi ) : sonst. Die Matrix C nennt man auch die (Knoten-Kanten) Inzidenzmatrix, in diesem Fall von dem gerichteten Graphen G − {s, t}. 18 s, t, c) ein Netzwerk und f ein Fluss in N . Das Definition 3.6 (Restnetzwerk) Sei N = (V, E, f , s, t, cf ), wobei wir zunächst die Restnetzwerk von N bezüglich f ist definiert als Nf := (V, E auf ganz V × V erweitern. Dann setzen wir Kapazitätsfunktion c mittels c(x, y) := 0 für (x, y) ∈ E ⎧ falls f (x, y) > 0 ⎨ c(x, y) − f (x, y) c(x, y) + f (y, x) falls f (y, x) > 0 cf (x, y) := ⎩ c(x, y) sonst f := {(x, y) : cf (x, y) > 0}. sowie E Lemma 3.7 Wenn f ein Fluss in N und W ein gerichteter Pfad im Restnetzerk Nf sind, dann sei 0 < δ := mine∈W cf (e) und definiere f wie folgt: (i) Falls (x, y) ∈ W und δ < f (y, x), setze f (x, y) := 0 und f (y, x) := f (y, x) − δ. (ii) Falls (x, y) ∈ W und δ ≥ f (y, x), setze f (x, y) := f (x, y) + δ − f (y, x) und f (y, x) := 0. (iii) Falls (x, y) ∈ W und (y, x) ∈ W , setze f (x, y) := f (x, y). Dann ist f ein Fluss in N mit val(f ) > val(f ). (Wir sagen, dass wir f aus f durch Augmentieren von f entlang von W erhalten haben.) Vorlesung 29.11 Satz 3.8 (MaxFlowMinCut-Theorem) Sei N ein Netzwerk. Dann gilt: max f : Fluss in N val(f ) = min X: s-t-Schnitt in N cap(X) Korollar 3.9 Sei f ein Fluss in N . Wenn es in Nf keine s-t-Pfade mehr gibt, dann hat f maximalen Wert. Algorithmus 3.10 s, t, c) Input: Netzwerk N = (V, E, Output: Fluss f s, t, c)) Ford-Fulkerson(N = (V, E, (1) f := 0 (2) while ∃ s-t-Pfad W in Nf (3) augmentiere f entlang von W wie in Lemma 3.7 Satz 3.11 Sei N ein Netzwerk mit Kapazitäten aus N0 . Dann terminiert Algorithmus 3.10 nach höchstens O( u,v c(u, v)) Schritten mit einem Fluss maximalen Werts. Bemerkung 3.12 Zwei Probleme bleiben: der Algorithmus ist zu langsam, und kann im Falle nicht natürlicher Kapazitäten eventuell gar nicht oder gegen einen suboptimalen Fluss konvergieren. Abhilfe: augmentiere in jeder Runde entlang mehrerer kürzester s-t-Pfade. s, t, c) ein Netzwerk und f ein Fluss in N . Der Fluss f heißt Definition 3.13 Sei N = (V, E, saturiert, wenn es im Restnetzwerk Nf keinen f -augmentierenden Pfad gibt, der nur Kanten aus N benutzt. (Bemerkung: Wenn f maximalen Wert hat, dann ist f saturiert, aber nicht notwendigerweise umgekehrt.) f , s, t, cf ) mit Das geschichtete Restnetzwerk ist definiert als GNf = (V , GE k := distNf (s, t), V := V0 ∪ · · · ∪ Vk , V0 := {s}, Vk := {t}, Vi := {x ∈ V : distNf (s, x) = i}, f := (x, y) ∈ E f : x ∈ Vi , y ∈ Vi+1 , 0 ≤ i ≤ k − 1 . GE 19 Der Durchsatz eines Knotens v ∈ {s, t} ist definiert als DS(v) := min{ cf (x, v), f (x,v)∈GE cf (v, x)}, f (v,x)∈GE für s bzw. t setzen wir DS(s) := cf (v, x), DS(t) := f (v,x)∈GE cf (x, v). f (x,v)∈GE Mit Hilfe dieser Konzepte entwickeln wir nun eine Verbesserung des Algorithmus 3.10. Die Grundidee ist dabei wie folgt: wir berechnen in jeder Runde einen saturierten Fluss im geschichteten Restnetzwerk. Vorlesung 30.11. Algorithmus 3.14 f , s, t, cf ) Input: GNf = (V , GE Output: Fluss g f , s, t, cf )) MaxFlow(GNf = (V , GE (1) g := 0 (2) while es gibt s-t-Pfad in GNf (3) v:=Knoten mit minimalem Durchsatz (4) g := PushFlow (GNf , v, g) (5) g := PullFlow (GNf , v, g) (6) aktualisiere Kapazitäten in GNf (7) entferne rekursiv Knoten von Durchsatz 0 und (8) Kanten mit Kapazitäten 0 aus GNf (9) (aber berechne kein neues Restnetzwerk) Die Routine PullFlow drückt“ dabei (mittels einer BFS–ähnlichen Vorgehensweise) eine ” Ladung der Größe DS(v) vom Knoten v bis zum Knoten t entlang der Kanten des geschichteten Restnetzwerks, siehe die folgende Psudocode–Beschreibung. Dies geht, weil v als Knoten mit minimalem Durchsatz gewählt war. Die Routine PullFlow arbeitet im kompletter Analogie und zieht“ die Ladung von s nach v. ” Algorithmus 3.15 f , s, t, cf ), Knoten v, Fluss g Input: GNf = (V , GE Output: Fluss g PushFlow(v, g) (1) Q := {v}, push[v] := DS(v) (2) foreach x ∈ V \ {v} do push[x] := 0 (3) while Q = {t} (4) v:=Dequeue (Q) (5) while push[v] = 0 f (6) wähle Kante (v, x) ∈ GE (7) if cf (v, x) ≥ push[v] then (8) push[x] := push[x] + push[v] (9) g(v, x) := g(v, x) + push[v] (10) push[v] := 0 (11) else (12) push[x] := push[x] + cf (v, x) (13) g(v, x) := g(v, x) + cf (v, x) (14) push[v] := push[v] − cf (v, x) (15) if x ∈ Q then Enqueue (Q, x) (16) return g Lemma 3.16 Algorithmus 3.14 berechnet einen saturierten Fluss g in GNf . 20 ¾ Beweis: ... Algorithmus 3.17 s, t, c)) Dinic(N = (V, E, (1) f := 0 (2) while es gibt s-t-Pfad in GNf (3) f := f + MaxFlow (GNf ) (4) berechne GNf neu Lemma 3.18 Nach jedem Aufruf von MaxFlow innerhalb von Algorithmus 3.17 vergrößert sich der s-t-Abstand in GNf . Satz 3.19 Algorithmus 3.17 findet einen Fluss maximalen Werts in O(n3 ) Schritten. Beweis: Die Korrektheit, also die Optimalität des Flusses, ist klar: Der Algorithmus terminiert erst, wenn ein Fluss f gefunden ist, so dass GNf (und damit auch Nf ) keinen s-t-Pfad mehr besitzt. Nach Korollar 3.9 hat f dann maximalen Wert. Zur Laufzeit: Wegen Lemma 3.18 kann es maximal n Durchläufe der Prozedur MaxFlow in Algorithmus 3.17 geben. Es genügt also zu zeigen, dass ein MaxFlow–Durchlauf in O(n2 ) erledigt werden kann. Betrachte einen MaxFlow–Aufruf. Da in jeder while–Schleife mindestens ein Knoten mit Durchsatz 0 gelöscht wird, kann es nur n solche Schleifendurchläufe geben. Betrachte den i-ten Durchlauf der while–Schleife, 1 ≤ i ≤ n. In den PushFlow und PullFlow Routinen werden nun Kanten bearbeitet. Wieviele? Jede bearbeitete wird anschließend entfernt (diejenigen mit Kapazität 0) oder verbleibt. Letztere wollen wir berührt nennen. Sei mi bzw. m∗i die Anzahl der im i-ten Schleifendurchlauf entfernten bzw. berührten Kanten. Es ist offensichtlich, dass jede Kante des Netzwerks nur in maximal einer der Schleifen gelöscht werden kann, also gilt i mi ≤ m. Außerdem kann in jeder der i–ten Schleife pro Knoten nur maximal eine Kante berührt werden, denn wenn sie nicht entfernt, sondern nur berührt wurde, besteht kein Bedarf, eine weitere, aus diesem Knoten ausgehende Kante zu berühren. Also gilt m∗i ≤ n. Insgesamt folgt damit: Kosten(einmal MaxFlow) ≤ n Kosten in der i-ten while–Schleife ≤ i=1 ≤ O(m) + n O(mi ) + O(m∗i ) i=1 n O(m∗i ) ≤ O(m) + i=1 n i=1 O(n) = O(m + n2 ) = O(n2 ). ¾ Korollar 3.20 a) Bei 0-1-Kantenkapazitäten hat der Algorithmus 3.17 eine Laufzeit von O(nm). b) Eine genauere Analyse zeigt: tatsächlich geht es bei 0-1-Kapazitäten sogar in O(n2/3 m) Schritten. c) Bei ganzzahligen Kantenkapazitäten berechnet der Algorithmus 3.17 einen Fluss mit ganzzahligen Flusswerten. Beweis: a) Da bei 0-1-Kapazitäten keine berührten Kanten (sondern nur entfernte) Kanten auftreten ergibt sich die Behauptung aus der vorangegangenen Laufzeitanalyse. b) ohne. c) Wenn die Kantenkapazitäten ganzzahlig sind und der Startfluss ganzzahlig ist, dann sind auch die Kapazitäten im Restnetzwerk ganzzahlig, somit auch die Durchsätze aller Knoten, und damit ist dann auch der neue Fluss wieder ganzzahlig, und alles wiederholt sich. ¾ Vorlesung 7.12. 21 4 Matchings Definition 4.1 Sei G = (V, E) ein Graph. Eine Menge M ⊆ E heißt Matching, falls für alle e, e ∈ M mit e = e gilt, dass e ∩ e = ∅. Ein Matching M heißt maximales Matching, wenn für alle e ∈ E \ M gilt, dass M + e kein Matching ist. M heißt größtes Matching, wenn für alle Matchings M gilt: |M | ≥ |M |. M heißt perfektes Matching, wenn 2|M | = |V | gilt. Offensichtlich ist ein größtes Matching maximal, aber ein maximales Matching nicht notwendigerweise ein größtes. Die Matchingzahl ν(G) := max{|M | : M ist Matching von G} ist definiert als die Kardinalität eines größten Matchings von G. Ein Knoten v heißt überdeckt von M , wenn es eine Kante e ∈ M mit v ∈ e gibt. Eine Menge S ⊆ V heißt Knotenüberdeckung von G, wenn von jeder Kante in E mindestens ein Knoten in S liegt. τ (G) := max{|S| : S ist Knotenüberdeckung von G} heißt Knotenüberdeckungszahl. Proposition 4.2 In jedem Graphen G gilt: ν(G) ≤ τ (G). ¾ Beweis: ... Satz 4.3 (Satz von König) Sei G = (A ∪ B, E) bipartit. Dann gilt: a) Ein größtes Matching von G lässt sich in O(n2/3 m) Schritten berechnen. b) ν(G) = τ (G). Beweis: a) Wir gehen zunächst alle Kanten von G durch und betrachten anschließend nur noch die Menge V der Knoten, die wenigstens einen Nachbarn haben. Dies geht in O(m) und führt zu einem Graphen G mit m Kanten und n ≤ 2m Knoten. Jetzt konstruieren wir aus G wie folgt ein s, t, c): füge eine Kante von s zu jedem Knoten in A ∩ V ein, und Netzwerk N := (V ∪ {s, t}, E, von jedem Knoten in B ∩ V zu t. Jede Kante aus E wird von ihrem Endknoten in A zu ihrem Endknoten in B orientiert. Alle Kanten erhalten Kapazität 1. Wir berechnen nun mit Hilfe von Algorithmus 3.17 einen Fluss f maximalen Werts in N und behaupten: ∩ (A × B) : f (e) = 1} ist ein Matching in G. 1) M := {e ∈ E 2) val(f ) = |M |. 3) M ist größtes Matching in G. Das sieht man wie folgt ein: Nach Korollar 3.20 gilt, dass f ganzzahlig ist, wegen der Kapazitäts Wegen Flusserhaltung ist M ein Matching in beschränkung gilt also f (e) ∈ {0, 1} für alle e ∈ E. G , also auch in G, damit ist 1) bewiesen. Außerdem gilt: val(f ) = f (x, y) = |M |, x∈A,y∈B was 2) beweist. Und schließlich zu 3): M ist ein größtes Matching in G , denn wir können zu jedem Matching M in G wie folgt einen Fluss f in N konstruieren: die Kanten aus M erhalten Flusswert 1, die sie mit s und t verbindenden Kanten auch, alle anderen Kanten erhalten Flusswert 0. Wegen der Matchingeigenschaft ist das ein Fluss, er hat Flusswert val(f ) = |M |. Damit folgt: 2) |M | = val(f ) ≤ max{val(f ) : f Fluss in N } = val(f ) = |M |, also ist M größtes Matching in G und somit auch in G. Wir können also mit Hilfe des Flusses f ein größtes Matching in G berechnen. Für die Laufzeitberechnung erinnern wir uns daran, dass N genau n + 2 Knoten und m + n Kanten hat, und dass n ≤ 2m gilt. Also können wir die Laufzeit gemäß Korollar 3.20 durch O((n + 2)2/3 (m + n ) = O(n2/3 m) abschätzen. 22 b) Wir hatten in Proposition 4.2 bereits bewiesen, dass ν(G) ≤ τ (G) gilt. Um die umgekehrte Ungleichung zu zeigen, konstruieren wir wieder ausgehend von G ein Netzwerk N : im Unterschied zum Netzwerk N aus Teil a) übernnehmen wir alle Knoten aus G (auch die ohne Nachbarn), und die Kanten zwischen A und B erhalten Kapazität ∞, ansonsten genauso wie in N . Wir berechnen wieder mit Hilfe von Algorithmus 3.17 einen Fluss f maximalen Werts in N . Wegen Flusserhaltung haben die Kanten zwischen A und B auch unter f Flusswert ≤ 1, und damit folgt, dass beide Flüsse gleichen Wert haben. Sei nun X ⊆ A ∪ B ∪ {s} ein s, t-Schnitt minimaler Kapazität in N . Dann gilt: a) 3.8 cap(X) = max{val(f ) : f Fluss in N } = val(f ) = val(f ) = ν(G). Man beachte, dass es in N keine Kanten von A ∩ X nach B \ X geben kann, weil sonst cap(X) = ∞ wäre. Daraus folgt, dass die Menge C := (A \ X) ∪ (B ∩ X) eine Knotenüberdeckung von G ist. Weiterhin gilt, dass cap(X) = cap(s, v) + cap(v, w) + cap(w, t) (s,v)∈E:v∈A\X (v,w)∈E:v∈A∩X,w∈B\X (w,t)∈E:w∈B∩X |A \ X| + 0 + |B ∩ X| = |C|. = Also ist τ (G) ≤ |C| = cap(X) = ν(G), was zu zeigen war. ¾ Vorlesung 13.12. Satz 4.4 (Heiratsatz von Hall) Sei G = (A ∪ B, E) bipartit. Dann besitzt G genau dann ein Matching, das alle Knoten in A überdeckt, wenn ∀S ⊆ A : |N (S)| ≥ |S|, wobei N (S) := {y ∈ V : ∃x ∈ S mit {x, y} ∈ E} die Nachbarschaft von S ist. ¾ Beweis: ... Aus dem Satz von Hall lässt sich das folgende Korollar leicht ableiten: Korollar 4.5 Sei G = (A ∪ B, E) bipartit. Dann gilt: G besitzt genau ein perfektes Matching, wenn |A| = |B| und für jede Menge S ⊆ A gilt: |N (S)| ≥ |S|. ¾ Beweis: ... Für allgemeine (soll heißen: nicht–notwendigerweise bipartite) Graphen gibt es die folgende Defektformel von Berge. Bezeichne mit q(G) die Anzahl Komponenten von G mit einer ungeraden Anzahl von Knoten. Definiere den Defekt von G als def (G) := max{q(G[V \ S]) − |S|}. S⊆V Satz 4.6 (Defektformel von Berge) Für jeden Graphen G = (V, E) gilt: |V |−2ν(G) = def (G). Beweis: Wir zeigen hier nur die einfache Richtung ≥: Sei S ⊆ V eine beliebige Teilmenge. Dann ist |V | − 2ν(G) = minimale Anzahl von nicht gematchten Knoten ≥ q(G[V \ S]) − |S|, denn nachdem man die Menge S entfernt hat, muss in jeder Zusammenhangskomponente mit einer ungeraden Anzahl mindestens ein Knoten ungematcht bleiben, falls er sich nicht mit einem Knoten aus S zu einer Matchingkante zusammen tut. Ein Knoten in S kann das aber höchstens einmal tun, und damit bleiben mindestens q(G[V \ S]) − |S| Knoten ungematcht. Da obige Ungleichung für jede Teilmenge S gilt, muss auch |V | − 2ν(G) ≥ def (G) sein. 23 ¾ Definition 4.7 Sei M ein Matching in G = (V, E). Ein Pfad in G heißt M -alternierend, falls er abwechselnd Kanten aus M und E \M benutzt. Ein Pfad in G der Länge ≥ 1 heißt M -augmentierend, falls er M -alternierend ist und Anfangs- und Endknoten nicht von M überdeckt sind. Proposition 4.8 Ein Matching M in G ist genau dann ein größtes Matching, wenn es keinen M -augmentierenden Pfad in G gibt. ¾ Beweis: ... Vorlesung 14.12. Korollar 4.9 Wenn es Matchings M1 und M2 in G mit |M1 | > |M2 | gibt, dann existieren |M1 | − |M2 | knotendisjunkte M2 -augmentierende Pfade in G, die nur Kanten aus M1 ΔM2 enthalten. ¾ Beweis: siehe Beweis von Proposition 4.8. Damit ist die Idee für unseren Algorithmus klar: beginnne mit dem leeren Matching, solange es noch augementierenden Pfade gibt, augmentiere das Matching entlang dieses Pfades, wenn es keine mehr gibt, ist das Matching größtmöglich. Allerdings: wie sucht man nach augmentierenden Pfaden bzw. stellt sicher, dass es keine mehr gibt? Zunächst eine Definition und ein technisches Lemma: Definition 4.10 Sei M ein Matching in G. Dann sei ∞ (M ) := min{(P ) : P ist größter M -augm. Pfad} falls M größtes Matching sonst Bemerkung 4.11 a) Seien A1 , . . . , At ⊆ A. Dann ist A1 Δ . . . ΔAt die Menge aller Elemente aus A, die in genau einer ungeraden Anzahl von Ai enthalten ist. b) Seien P1 , . . . , Pt knotendisjunkte M -augmentierende Pfade. Dann ist M := M Δ (E(P1 ) ∪ · · · ∪ E(Pt )) = M ΔE(P1 )Δ . . . ΔE(Pt ) ein Matching mit |M | = |M | + t. ¾ Beweis: ... Ähnlich wie bei den saturierten Flüssen im geschichteten Restnetzwerk ist es nun von entscheidender Bedeutung, dass nach einer gutgewählten Augmentationsrunde der Parameter (M ) um mindestens eins wächst. Lemma 4.12 Sei M Matching in G und P1 , . . . , Pt eine inklusionsmaximale Menge von knotendisjunkten M -augmentierenden Pfaden der Länge (M ). Dann ist M := M Δ (E(P1 ) ∪ · · · ∪ E(Pt )) ein Matching mit (M ) > (M ). ¾ Beweis: folgt später. Wir beschreiben nun unseren Algorithmus zunächst nur ungenau und werden später in der Laufzeitanalyse die Details nachliefern. 24 Algorithmus 4.13 Input: Graph G = (A ∪ B, E) Output: Matching M Hopcroft–Karp(G = (A ∪ B, E)) (1) M := ∅ (2) while (M ) < ∞ (3) S:= nicht von M -überdeckte Knoten in A (4) T := Knoten, die von S aus über M -augmentierende Pfade der Länge (M ) erreichbar sind. (5) bestimme mittels DFS ausgehend von den Knoten in T eine inklusionsmaximale Menge knotendisjunkter M -augmentierender Pfade der Länge (M ) (6) augmentiere diese Pfade gleichzeitig Satz 4.14 Algorithmus 4.13 findet in einem bipartiten Graphen ein größtes Matching und lässt √ sich mit einer Laufzeit von O( nm) Schritten implementieren. Beweis: Wir erläutern zunächst, wie sich ein Durchlauf der while-Schleife in O(n + m) Schritten implementieren lässt. Die Menge S ist unmittelbar gegeben. Starte nun im ersten Knoten von S eine Breitensuche. Sobald ein ungematchter Nachbar auftaucht, wird (M ) = 1 festgelegt. Sind alle Nachbarn gematcht, dann nehme – statt wie üblich die Nachbarn selber – die Matchingpartner der Nachbarn in die Queue auf. Gehe zunächst nicht weiter in die Tiefe, sondern starte nun im nächsten Knoten von S eine analoge Breitensuche. Stößt eine Breitensuche dabei auf Nachbarn, die schon von einer anderen Breitensuche entdeckt wurden, dann wird die Kante bis dahin noch erkundet, die Nachbarn dann aber nicht weiterverfolgt. Wenn alle Knoten in S nur gematchte Nachbarn haben, gehen die Breitensuchen einen Schritt weiter in die Tiefe. Die Breitensuchen verlaufen also so parallel wie möglich. Auf diese Weise wird der Parameter (M ) und die Menge T bestimmt. Wir merken uns dabei zu jedem Knoten seinen Vorgänger, der einen um eins kleineren Abstabd zu der Menge S hat. Hierbei wird jede Kante nur einmal beschritten, so dass nur der Aufwand O(n + m) anfällt. Starte nun in einem beliebigen Knoten in T eine Tiefensuche und verfolge dabei die Vorgänger zurück bis hin zu einem Knoten in S. Ein auf diese Weise einmal gefundener M –augmentierender Pfad der Länge (M ) wird als bekannt markiert. Starte nun die nächste Tiefensuche in einem neuen Knoten von T , bereits markierte Knoten werden dabei nicht wieder betrachtet. Auf diese Weise findet der Algorithmus wiederum in O(n + m) die gewünschte inklusionsmaximale Menge knotendisjunkter Pfade. √ Wir zeigen nun noch, dass es nur O( n) Aufrufe der while-Schleife gibt. Sei M ∗ ein größtes Matching. Nach jedem Durchlauf der while-Schleife erhöht sich nach Lemma 4.12 (M ) um mindes√ tens eins. Sei M das aktuelle Matching nach n Durchläufen, jetzt beträgt (M ) also mindestens √ n. ∗ Nach Korollar 4.9 knotendisjunkte (M -augmentierende) Pfade der √ existieren jetzt |M∗ | − |M | √ | − |M |) n ≤ n. Dadurch ist die Anzahl der weiteren Länge mindestens n. Also muss (|M √ √ √ Durchläufe durch (|M ∗ | − |M |) ≤ n/ n = n beschränkt, und es gibt insgesamt höchstens 2 n Durchläufe. Da wir uns auf zusammenhängende Graphen beschränken können (betrachte andernfalls die Zusammenhangskomponenten einzeln), gilt O(n+m) = O(m) und es ergibt sich somit eine Laufzeit √ √ von O( n(n + m) = O( nm). ¾ Vorlesung 20.12. Es fehlt noch der Beweis: von Lemma 4.12. ... ¾ Angenommen, wir haben einen gewichteten Graphen gegeben und wollen nun nicht ein größtes Matching berechnen, sondern ein möglichst leichtes (oder schweres) perfektes Matching. Ein erster 25 Schritt ist eine elegante Beschreibung der perfekten Matchings eines Graphens. Definition 4.15 Sei G = (V, E) ein Graph. P M (G) bezeichne die Menge der charakteristischen Vektoren der perfekten Matchings von G, das heißt: 0 e ∈ M m P M (G) := x ∈ {0, 1} : ∃ perfektes Matching M von G mit xe := 1 e∈M Proposition 4.16 Sei G = (V, E) ein Graph. ur Erinnerung: δ(v) := {e ∈ E : v ∈ e}. Dann gilt ⎧ ⎫ ⎨ ⎬ P M (G) = x ∈ Rm : ∀v ∈ V : xe = 1, ∀e ∈ E : xe ∈ {0, 1} ⎩ ⎭ e∈δ(v) ¾ Beweis: ... Natürlich stört uns an dieser Beschreibung noch die Ganzzahligkeitsbedingung. Der erste naheliegende Schritt ist die Ersetzung von xe ∈ {0, 1} durch xe ≥ 0, und das führt zu der folgenden Definition. Definition 4.17 F P M (G) = ⎧ ⎨ ⎩ x ∈ Rm : ∀v ∈ V : xe = 1, ∀e ∈ E : xe ≥ 0 e∈δ(v) ⎫ ⎬ ⎭ Man beachte: P M (G) ist eine Familie von 0, 1-Vektoren, F P M (G) ist ein Polytop. Wie verhalten sich P M (G) und F P M (G) zueinander? Offensichtlich gilt, dass P M (G) ⊆ F P M (G) gilt. Im Falle von bipartiten Graphen G können wir aber noch viel mehr sagen. Satz 4.18 Sei G ein bipartiter Graph. Dann gilt: Die Ecken von F P M (G) sind ganzzahlig. Beweis: Angenommen, x̃ sei eine nicht–ganzzahlige Ecke von F P M (G). Sei Ẽ := {e ∈ E : 0 < x̃e < 1}. Wegen e∈δ(v) xe = 1 berührt jeder Knoten, der eine Kante aus Ẽ berührt, mindestens zwei. Also enthält Ẽ einen Kreis C, und weil G bipartit ist, muss C gerade Länge haben. Setze die Komponenten in d ∈ Rm abwechselnd auf −1 und +1 für die Kanten in C, und auf 0 für alle anderen Kanten. Für > 0 klein genug liegt dann x̃ + d und x̃ − d in F P M (G), aber dann kann ¾ x̃ = 12 (x̃ + d) + 12 (x̃ − d) nicht Ecke von F P M (G) sein; Widerspruch. Vorlesung 21.12.07 Inwiefern hilft uns nun die Aussage, dass die Ecken von F P M (G) ganzzahlig sind? Proposition 4.19 Sei P ein Polytop, S Menge mit S ⊆ P ⊆ Rm , und sei S die Menge der Ecken von P . Wenn S ⊆ S gilt, dann folgt a) conv(S) = P , b) min{wT x : x ∈ S} = min{wT x : x ∈ P }. ¾ Beweis: ... Korollar 4.20 Für G bipartit gilt: conv(P M (G)) = F P M (G). ¾ Beweis: folgt sofort aus Proposition 4.19. Damit haben wir ein Beispiel für eine sehr allgemeine Strategie kennengelernt: gegeben ein diskreter Suchraum S, finde eine gute polyedrische Beschreibung P (die möglichst wenige Nebenbedingungen benötigt) mit S ⊆ P , so dass die Ecken von P in S liegen. Dies wollen wir jetzt auch noch für allgemeine (also nicht-notwenidig bipartite) Graphen G erreichen. Lassen wir die Bedingung “bipartit” aus Satz 4.18 fallen, dann sind die Ecken immer noch “fast ganzzahlig”: 26 Satz 4.21 Sei G = (V, E) ein Graph, x ∈ F P M (G). Dann gilt: x ist Ecke von F P M (G) genau dann, wenn für alle e ∈ E gilt, dass xe ∈ {0, 12 , 1} und die Menge {e ∈ E : xe = 12 } eine Familie von knotendisjunkten, ungeraden Kreisen bildet. Beweis: Angenommen, x sei von der obigen Form. Wir setzen w ∈ Rn durch −1 xe = 0 we := 0 xe > 0. Dann ist wT x̃ ≤ 0 eine gültige Ungleichung für F P M (G) und wir behaupten, dass F P M (G) ∩ {x̃ : wT x̃ = 0} = {x}, womit x tatsächlich Ecke von F P M (G) wäre. Die Aussage ⊇ in der Behauptung gilt, weil x ∈ F P M (G) nach Voraussetzung und wT x = 0 nach Konstruktion. Angenommen, die Aussage ⊆ gelte nicht, das heisst, es gebe ein x̃ ∈ F P M (G) mit wT x̃ = 0 und x̃ = x. Wegen w ≤ 0 und x̃ ≥ 0 darf x̃ nur in den Komponenten positiv sein, wo auch x positiv ist (weil w dort 0 ist). Wenn xe = 1, dann xe = 0 für alle zu e inzidenten e wegen e∈δ(v) xe = 1. Also ist auch dort x̃e = 0. Wegen e∈δ(v) x̃e = 1 dann aber wiederum x̃e = 1. x̃ könnte also von x nur in den Komponenten x̃e mit xe = 12 abweichen. Das geht aber auch nicht, da die entsprechenden Kanten ungerade Kreise bilden. Damit ist auch ⊆ in der Behauptung bewiesen. Zeigen wir nun die umgekehrte Richtung in der Aussage des Satzes: sei x eine Ecke von F P M (G). Dann existiert ein w ∈ Rm , so dass x eindeutige optimale Lösung von (P ) : max{wT x : x ∈ F P M (G)} ist. Zunächst ist zu zeigen, dass xe ∈ {0, 1, } für alle e ∈ E ist. Dazu konstruieren wir einen bipartiten Graphen G wie folgt: V (G ) := {u : u ∈ V (G)} ∪ {u : u ∈ V (G)}, E(G ) := {{u , v }, {u , v } : {u, v} ∈ E(G)}. Sei außerdem w ∈ R2m der Vektor, den man durch Verdoppelung / Hintereinanderhängen von w erhält. Betrachte nun (P ) : max{(w )T x : x ∈ F P M (G )}. Die optimale Lösung wird (u.a.) in einer Ecke x von F P M (G ) angenommen. Nach Satz 4.18 sind alle Ecken ganzzahlig, also auch x . Setze nun x̃ ∈ Rm durch x̃e = 12 (xe + xe ). Dann ist x̃ optimale Lösung von (P) (denn gäbe es eine bessere, dann auch eine bessere für (P’)), also muss x = x̃, denn x war ja eindeutige Lösung von (P). Da x ganzzahlig, muss xe = x̃e ∈ {0, 12 , 1}. 1 Bleibt zu zeigen, dass die Menge {e : xe = 2 } eine Familie von knotendisjunkten ungeraden Kreisen bildet. Es ist klar wegen e∈δ(v) xe = 1, dass diese Kanten eine Familie von Kreisen bildet. Hätte einer der Kreise eine gerade Länge, dann ergäbe sich in der gleichen Weise ein Widerspruch ¾ dazu, dass x Ecke von F P M (G) ist, wie in Satz 4.18. Mit Hilfe dieses Satzes können wir nun die Nebenbedingungen in F P M (G) so verschärfen, dass wir wieder eine Beschreibung von conv(P M (G)) erhalten. Für einen Graphen G = (V, E) und eine Menge S ⊆ V definieren wir δ(S) := {e = {x, y} ∈ E : x ∈ S, y ∈ V \ S}. Satz 4.22 Sei G = (V, E) ein Graph. Setze Q(G) = x ∈ Rm : ∀v ∈ V : xe = 1, ∀e ∈ E : xe ≥ 0, e∈δ(v) ∀S ⊆ V mit |S| ≥ 3, |S| ungerade : e∈δ(S) Dann ist conv(P M (G)) = Q(G). 27 xe ≥ 1 . Beweis: Zunächst ist klar nach Definition von Q(G), dass P M (G) ⊆ Q(G). Man kann nun zeigen, dass jede Ecke von Q(G) in conv(P M (G)) liegt – aber wir werden diesen Beweis in der Vorlesung ¾ nicht führen. Daraus folgt dann mit Proposition 4.19 die Aussage des Satzes. Vorlesung 10.1.08 5 5.1 Ganzzahlige lineare Optimierung Ganzzahlige Polyeder Definition 5.1 Sei L ⊆ Rn . L heißt Gitter (engl. lattice) des Rn , wenn es eine Basis {v1 , . . . , vn } des Rn gibt mit n L= λi vi : λ1 , . . . , λ − n ∈ Z}. i=1 n {v1 , . . . , vn } heißt Basis des Gitters. Z heißt Standardgitter im Rn . Bemerkung 5.2 Sei L ein Gitter des Rn . Dann gibt es eine reguläre Matrix T ∈ Rn×n mit L = T (Z). ¾ Beweis: ... Oft ist es von Interesse, den optimalen Punkt eines linearen Optimierungsproblems auf einem solchen Gitter zu finden. Mit Bemerkung 5.2 wissen wir, dass wir uns hierfür im Folgenden o.B.d.A. auf das Standardgitter beschränken können. Definition 5.3 Sei P ⊆ Rn ein Polyeder. Dann heißt PI := conv(Zn ∩ P ) die ganzzahlige Hülle (engl. integer hull) oder auch ganzzahliger Kern von P . Gilt P = PI , dann heißt P ganzzahlig. Bemerkung 5.4 Sei P ⊆ Rn und c ∈ Rn . Dann gilt: max cT x = n x∈Z ∩P maxn x∈conv(Z ∩P ) cT x = max cT x = max cT x x∈PI x∈P nach Definition 5.3 und den Ergebnissen der Optimierung 1. Insbesondere bedeutet dies, dass der Optimalwert eines linearen Optimierungsproblems auf einem ganzzahligen Polyeder P ⊆ Rn im Fall c ∈ Zn ganzzahlig ist. Definition 5.5 Eine H-Darstellung {x ∈ Rn : Ax ≤ b} eines Polyeders heißt ganzzahlig, falls A ∈ Zm×n und b ∈ Zm gilt. Ein Polyeder P heißt rational, falls P eine ganzzahlige H-Darstellung besitzt. Satz 5.6 Sei P = {x ∈ Rn : Ax ≤ b, A ∈ Rm×n , b ∈ Rm }. Gilt P = PI , dann hat P eine ganzzahlige H-Darstellung P = {x ∈ Rn : A x ≤ b , A ∈ Zm ×n , b ∈ Zm , m ≤ m}. ¾ Beweis: ... Satz 5.7 Sei P ein rationales Polyeder. Dann besitzt P eine V-Darstellung P = conv(V ) + cone(S) mit endlichen Teilmengen V ⊆ Qn und S ⊆ Zn . ¾ Beweis: ... Man sieht also, dass es reicht, die Frage zu klären, wann alle Ecken eines rationalen Polyeders ganzzahlig sind. Diese Frage ist aber – wie wir ja schon am Beispiel des Matching–Polytops gesehen haben – oft schwer zu beantworten. Im Folgenden beschäftigen wir uns daher mit einigen hinreichenden Bedingungen für die Ganzzahligkeit von Polyedern. 28 5.2 Unimodularität und totale Unimodularität Definition 5.8 Sei A ∈ Qm×n . Für jedes b ∈ Zm setze P (b) := {x ∈ Rn : Ax ≤ b}. Definition 5.9 Eine Matrix A ∈ Zm×n heißt unimodular, wenn rang(A) = n ist und für jede Teilmenge B ⊆ [m] mit |B| = n gilt, dass det(AB ) ∈ {−1, 0, 1}. Zunächst ein technisches Lemma. Lemma 5.10 Sei C ∈ Zn×n regulär. Dann sind folgende Aussagen äquivalent: a) |det(C)| = 1, b) für alle c ∈ Zn gilt C −1 c ∈ Zn , c) C −1 ∈ Zn×n . ¾ Beweis: ... Satz 5.11 Sei A ∈ Zm×n mit rang(A) = n. Dann sind die beiden folgenden Aussagen äquivalent: a) A ist unimodular. b) Für jedes b ∈ Zm ist jede Ecke von P (b) ganzzahlig. ¾ Beweis: ... Korollar 5.12 Seien A ∈ Zm×n unimodular und b ∈ Zm . Dann gilt P = PI . ¾ Beweis: Folgt aus Satz 5.7 und Satz 5.11. Definition 5.13 Eine Matrix A ∈ Zm×n heißt total unimodular, wenn für jede quadratische Teilmatrix C von A gilt, dass det(C) ∈ {−1, 0, 1}. Bemerkung 5.14 Sei A ∈ Zm×n total unimodular. Dann gilt A ∈ {0, ±1}m×n. Ferner ist jede Matrix A , die aus A durch Streichen von (bis zu m − 1) Zeilen und (bis zu n − 1)) Spalten entsteht, total unimodular. ¾ Beweis: klar nach Definition. Satz 5.15 Die Matrix A ∈ Zm×n ist genau dann dann total unimodular, wenn ist (wobei En hier die n × n Einheitsmatrix ist). A En unimodular ¾ Beweis: ... Satz 5.16 Sei A ∈ Zm×n und sei A eine der folgenden Matrizen: A A AT , −A, (A, Em ), , . En −A Dann ist A genau dann total unimodular, wenn A total unimodular ist. ¾ Beweis: ... Korollar 5.17 Die Matrix A ∈ Zm×n ist genau dann total unimodular, wenn für jeden Vektor b ∈ Zm alle Ecken von {x ∈ Rn : Ax ≤ b, x ≥ 0} ganzzahlig sind. ¾ Beweis: ... 29 Satz 5.18 Sei A ∈ {0, ±1}m×n. Dann sind äquivalent a) A ist total unimodular. b) J der Spalten von A besitzt eine Zerlegung J = S ∪ T , so dass j∈S Aj − Jede Teilmenge m j∈T Aj ∈ {0, ±1} , wobei Aj die j-te Spalte von A bezeichne. c) Jede quadratische reguläre Teilmatrix A von A besitzt eine Zeile mit ungerader Anzahl von Nichtnullelementen. d) Die Summe aller Elemente jeder quadratischen Teilmatrix mit geraden Zeilen- und Spaltensummen ist durch 4 teilbar. e) Keine quadratische Teilmatrix hat Determinate ±2. ¾ Beweis: ... Vorlesung 17.1.08 Korollar 5.19 a) Sei A ∈ {0, ±1}m×n mit genau zwei Nichtnull-Elementen pro Spalte. Dann ist A genau dann total unimodular, wenn es eine Aufteilung der Zeilen von A in zwei Klassen gibt, so dass für jede Spalte gilt: die zwei Nichtnull-Elemente einer Spalte gehören zu verschiedenen Klassen genau dann, wenn sie gleiche Vorzeichen haben. b) Sei A ∈ {0, ±1}m×n mit genau einer +1 und einer −1 pro Spalte. Dann ist A total unimodular. ¾ Beweis: ... Beispiel 5.20 Sei G = (V, E) ein vollständiger bipartiter Graph, also ˙ 2 , |V | = n, |P1 | = n1 , |P2 | = n2 , E = {e1 , . . . , em } mit m = n1 · n2 . V = P1 ∪P Seien w = (w1 , . . . , wm ) ∈ Rm die Kantengewichte. Gesucht ist ein schwerstes Matching in G. Sei M ein Matching in G. Dann definieren wir den für M charakteristischen Vektor x ∈ Rm durch xi := 1 genau dann, wenn ei ∈ M . Betrachte nun die Inzidenzmatrix A ∈ R(n1 +n2 )×(n1 n2 ) von G, bei der wir die Zeilen so arrangieren, dass die ersten n1 Zeilen die Knoten in P1 repräsentieren, die zweiten n2 Zeilen die Knoten aus P2 . Es gilt, dass x ∈ Rm genau dann charakteristischer Vektor eines Matchings in G ist, wenn Ax ≤ 1 und x ∈ {0, 1}m, und daher können wir unser Optimierungsproblem wie folgt als ILP formulieren: maxm {wT x : Ax ≤ 1, x ∈ {0, 1}m}. x∈R Die Matrix A hat genau zwei Nichtnull-Elemente pro Spalte. Wähle Klassen K1 = {1, . . . , n1 } und K2 = {n1 + 1, . . . , n1 + n2 }. Dann ist nach Korollar 5.19 A total unimodular, also hat P = {x ∈ Rm : Ax ≤ b, x ≥ 0} nur ganzzahlige Ecken nach Korollar 5.17. Also hat das obige ILP den gleichen Wert wie das LP maxm {wT x : Ax ≤ 1, x ≥ 0}. x∈R 6 Travelling Salesman Problem Definition 6.1 Sei G = (V, E) ein Graph. Ein Kreis in G mit |V | Knoten heißt Hamilton Kreis (HK) in G. Wir werden uns (u.a.) mit dem Problem beschäftigen, zu einem gegebenem Graph G zu entscheiden, ob G einen Hamilton Kreis hat. Für dieses Problem ist kein effizienter Algorithmus 30 bekannt, und wir werden mit Hilfe der NP-Vollständigkeitstheorie zeigen, dass es vermutlich auch keinen gibt. Dazu müssen wir zunächst einige grundlegende Begriffe aus der Vorlesung des letzten Semesters wiederholen. (Entsprechend steht z.B. Definition I.6.4 für Definition 6.4 aus Optimierung I.) Wiederholung. In Definition I.6.4 haben wir die Klasse P derjenigen Probleme eingeführt, für die es einen Algorithmus mit polynomialer Laufzeit gibt, der das Problem korrekt entscheidet. Die Klasse NP (siehe Definition I.6.7) enthält alle Probleme, die in polynomialer Zeit korrekt gelöst werden können, wenn man ein sogenanntes Zertifikat mitgeliefert bekommt. Laut Proposition I.6.9 gilt, dass P ⊆ NP. (Achtung: NP steht für Nondeterministic Polynomial, und nicht für Not Polynomial.) Hinter der Klasse NP steht eine etwas gewöhnungsbedürftige Definition – tatsächlich genügt es aber für unsere jetzigen Zwecke zu verstehen, dass NP eine sehr große Klasse ist, die nahezu alle natürlichen Optimierungsprobleme enthält. Im Gegensatz dazu müssen wir uns wieder sehr genau damit vertraut machen, wann ein Problem L1 in ein Problem L2 überführt oder transformiert werden kann. In Definition I.6.10 haben wir festgelegt, dass sich Problem L1 auf Problem L2 polynomial transformieren lässt (und schreiben L1 ≤p L2 ), wenn es ein Polynom p(n) gibt und wir zu jedem f1 ∈ Σ∗ ein f2 ∈ Σ∗ in Zeit höchstens p(|f1 |) konstruieren können, so dass f1 ∈ L1 ⇔ f2 ∈ L2 . Mit anderen Worten: L2 ist mindestens so schwer wie L1 , denn wenn wir L2 lösen könnten, dann könnten wir mit Hilfe der obigen Transformation auch L1 lösen. Und schließlich die Definition I.6.12: ein Problem L heißt NP-vollständig (englisch: NP-complete, kurz: NPC), wenn L ∈ NP und für alle L ∈ NP gilt, dass L ≤p L. Die folgende Proposition erklät, warum es unwahrscheinlich ist, dass ein Problem, das mindestens so schwer ist wie ein NP-vollständiges Problem, in polynomialer Zeit gelöst werden kann. Proposition 6.2 Wir betrachten zwei Probleme L und L∗ . Wenn L∗ ∈ NPC und L∗ ≤p L und L ∈ P, dann ist P = NP. ¾ Beweis: ... Wir üben zunächst den Begriff der Transoformation an zwei sehr einfachen Beispielen. Beispiel 6.3 a) Das Problem Clique ist wie folgt definiert. Eingabe: Graph G und k ∈ N. Frage: Hat G eine k-Clique? b) Das Problem Stabile Menge ist wie folgt definiert. Eingabe: Graph G und k ∈ N. Frage: Hat G eine k-stabile Menge? c) Das Problem Knotenüberdeckung ist wie folgt definiert. Eingabe: Graph G und k ∈ N. Frage: Hat G eine k-Knotenübderdeckung? (Zur Erinnerung: eine k-Knotenübdereckung in G = (V, E) ist eine Menge S ⊆ V mit |S| = k, so dass für alle Kanten e ∈ E gilt: e ∩ S = ∅. Offensichtlich gilt die folgende Beziehung: S ⊆ V ist -stabile Menge von G ⇔ V \ S ist (n − )-Knotenüberdeckung von G. (6) wie man mit der offensichtlichen Transformation (G, k) → Es gilt: Clique ≤p Stabile Menge, (Ḡ, k) nachweist, wobei Ḡ := (V, V2 \ E), denn G hat eine genau dann eine k-Clique, wenn Ḡ eine k-stabile Menge hat. 31 Es gilt: Stabile Menge ≤p Knotenüberdeckung, wie man mit der offensichtlichen Transformation (G, k) → (G, n − k) nachweist, denn G hat genau dann eine k-stabile Menge, wenn Ḡ eine n − k-Knotenüberdeckung hat. Vorlesung 18.01.08 Definition 6.4 Ein Problem L heißt NP-schwer, wenn für alle Probleme L ∈ NP gilt, dass L ≤p L. Proposition 6.5 Wenn L NP-schwer ist und L ∈ P, dann ist P = NP. ¾ Beweis: ... Wie zeigt man, dass ein Problem NP-schwer ist? Wegen der Transitivität der Relation ≤p genügt hier der Vergleich mit einem NP-schweren Problem. Proposition 6.6 Wenn es ein NP-schweres Problem L∗ gibt mit L∗ ≤p L, dann ist auch L auch NP-schwer. ¾ Beweis: ... Beispiel 6.7 Wir erinnern zunächst an das aussagenlogische Erfüllbarkeitsproblem (engl.: Satisfiability, kurz: SAT). Gegeben ist eine aussagenlogische Formel, z.B. (x1 ∨ x̄2 ∨ x̄3 ) ∧ (x2 ∨ x̄5 ∨ x̄2 ) ∧ (x̄7 ∨ x1 ). Hierbei sind x1 , . . . , xn Variablen, die die die Werte wahr“ oder falsch“ annehmen können, x̄i ” ” ist die Negation von xi . Ein Term der Form xi oder x̄i nennt man Literal. Eine Klammer“, wie ” sie in der obigen Formel auftritt, nennt man Klausel. Beim SAT-Problem erhält man als Eingabe die Formel, und die Frage ist, ob es eine Belegung der Variablen mit wahr oder falsch gibt, sodass die ganze Formel wahr wird. Mit k-SAT bezeichnet man den Spezialfall von SAT, bei dem jede Klausel genau k verschiedene Variablen enthält. a) Offensichtlich gilt (mit Hilfe der Identität als Transformation), dass 3-SAT ≤p SAT. b) Umgekehrt haben wir in I.6.17 bewiesen, dass auch SAT ≤p 3-SAT. c) Man kann zeigen, dass 2-SAT ∈ P gilt. d) Der Grundstein der NP-Vollständigkeitstheorie wird durch das Resultat, dass SAT NPvollständig ist, gelegt (siehe I.6.16). Damit haben wir also einen Ausgangspunkt, und somit folgt beispielsweise aus b) und Proposition 6.6 sofort, dass 3-SAT NP-schwer ist. Satz 6.8 3-SAT ≤p CLIQUE. ¾ Beweis: ... Nach diesen Vorbereitungen können wir uns nun langsam unserem Eingangs gestellten Problem nähern. Definition 6.9 Das Problem Hamiltonkreis (HK) erhält als Eingabe einen Graphen G und soll die Frage beantworten, ob G einen Hamiltonkreis enthält. Das Problem gerichteter Hamiltonkreis (GK) erhält als Eingabe einen gerichteten Graphen und soll die Frage beantworten, ob G einen gerichteten Hamiltonkreis enthält. G Satz 6.10 Knotenüberdeckung ≤p ger. Hamilton Kreis 32 ¾ Beweis: ... Mit dieser Transformation sind wir nun am Ziel. Wir haben gezeigt, dass SAT ≤p 3-SAT ≤p Clique ≤p Stabile Menge ≤p Knotenüberdeckung ≤p ger. Ham.kreis ≤p ger. Ham.pfad ≤p Ham.pfad ≤p Ham.kreis (die letzten drei Transformationen wurden in den Übungen behandelt). Damit haben wir bewiesen, dass Hamiltonkreis ein NP-schweres Problem ist, und es daher vermutlich keine schnell zu überprüfende Charakterisierung für Graphen gibt, die einen Hamilton Kreis besitzen. Im Folgenden wollen wir aber kurz einige hinreichende Bedingungen kennenlernen. Vorlesung 24.01.08 Bemerkung 6.11 Wenn G = (V, E) einen Hamilton Kreis hat, dann muss δ(G) := min{deg(v) : v ∈ V } ≥ 2. Unser Ziel ist es zu zeigen: wenn δ(G) ≥ |V |/2, dann hat G einen Hamilton Kreis. Lemma 6.12 Seien x, y zwei Knoten in G = (V, E) mit d(x) + d(y) ≥ n und {x, y} ∈ E. Dann gilt: G hat genau dann einen HK, wenn G := (V, E ∪ {x, y}) einen HK hat. ¾ Beweis: ... Korollar 6.13 Sei G = (V, E) ein Graph mit n = |V | ≥ 3. a) Wenn für alle Paare x, y mit {x, y} ∈ E gilt, dass d(x) + d(y) ≥ n, dann hat G einen HK. b) Wenn δ(G) ≥ n/2, dann hat G einen HK. ¾ Beweis: ... Definition 6.14 a) Das Travelling Salesman Problem (TSP) erhält als Eingabe einen vollständigen Graphen G = (V, V2 ) und eine Kostenfunktion c : E → R≥0 sowie eine Zahl k ∈ R≥0 . Die Frage lautet: Hat G einen HK der Länge höchstens k? (Die “Länge” eines HK ist dabei die Summe der benutzten Kantengewichte.) Jeder HK in G wird als TSP-Tour bezeichnet. Eine optimale TSP–Tour ist eine kürzest mögliche TSP-Tour. Mögliche Varianten / Spezialfälle lauten: b) Metrisches TSP: Die Kostenfuntion c erfüllt die Dreiecksungleichung, also dass ∀x, y, z ∈ V : d(x, y) + d(y, z) ≥ d(x, z). c) Euklidisches TSP: Hier liegen die Knoten von V im R2 und c(x, y) := x − y2 . d) Rektilineares TSP: Hier liegen die Knoten von V im R2 und c(x, y) := x − y1 . Satz 6.15 Alle oben genannten Varianten des TSP sind NP-vollständig. Wir werden später mit einem stärkeren Satz die NP-Vollständigkeit der allgemeinen Variante a) zeigen. Definition 6.16 Wir betrachten nun die Optimierungs– bzw. Suchvariante des TSP: Eingabe ist ein vollständiger Graph G = (V, E) mit einer Kostenfunktion c : E → R≥0 , gesucht ist eine optimale TSP–Tour, die wir mit opt(G, c) bezeichnen wollen. Mit Länge einer Tour – oder kurz, L – bezeichnen wir die Summe der Kantengewichte, die in der Tour verwendet werden. Ein Approximationsalgorithmus für das TSP mit Approximationsgüte r ∈ R≥0 ist ein Algorithmus A, der zu jeder TSP-Eingabe (G, c) eine TSP-Tour A(G, c) berechnet, so dass Länge(A(G, c)) ≤ r. Länge(opt(G, c)) 33 Vorlesung 25.01.08 Satz 6.17 Sei r beliebig, aber fest. Falls P = NP, dann existiert kein polynomialer Approximationsalgorithmus für TSP mit Güte r. ¾ Beweis: ... Wir werden nun aber sehen, dass für das metrische TSP sehr wohl Approximationsalgorithmen mit einer festen Gütegarantie existeren. Die Idee dabei ist, dass wir eine effizient berechenbare untere Schranke für die Länge von opt(G, c) brauchen. Proposition 6.18 Eine optimale TSP-Tour in (G, c) ist mindestens so lang wie ein minimal spannender Baum in (G, c). ¾ Beweis: ... Algorithmus 6.19 Input: vollständiger Graph G = (V, E), metrische Kostenfunktion c : E → R≥0 Output: TSP-Tour T MST–Heuristik(G = (V, E), c) (1) Berechne MST B in (G, c) (2) Verdoppele alle Kanten in B und erhalte Multigraph B (3) Berechne Euler Tour T in B (4) while es Knoten v gibt, der durch T mehrfach durchlaufen wird (5) ersetze konsekutive Kanten {a, v}, {v, b} durch {a, b} Satz 6.20 Algorithmus 6.19 ist ein polynomialer Approximationsalgorithmus für das metrische TSP mit Güte 2. ¾ Beweis: ... Wie können wir die Güte des Algorithmus noch verbessern? In Zeile (2) haben wir relativ brutal alle Kanten verdoppelt, um einen eulerschen Graphen zu erzwingen. Etwas sparsamer ist die Variante, die an dieser Stelle lediglich Matching–Kanten zwischen Knoten ungeraden Grades in B einfügt. Algorithmus 6.21 Input: vollständiger Graph G = (V, E), metrische Kostenfunktion c : E → R≥0 Output: TSP-Tour T Christofides–Heuristik(G = (V, E), c) (1) Berechne MST B in (G, c) (2) Sei U die Menge aller Knoten ungeraden Grades in B. Füge ein in (G[U ], c) leichtestes perfektes Matching zu B hinzu und erhalte B . (3) Berechne Euler Tour T in B (4) while es Knoten v gibt, der durch T mehrfach durchlaufen wird (5) ersetze konsekutive Kanten {a, v}, {v, b} durch {a, b} Satz 6.22 Algorithmus 6.21 ist ein polynomialer Approximationsalgorithmus für das metrische TSP mit Güte 1.5. Beweis: Sei M das in Schritt (2) berechnete Matching. Wir behaupten: L(M ) ≤ 1 1 L(opt(G[U ], c)) ≤ L(opt(G, c)). 2 2 (7) Die zweite Ungleichung ist offensichtlich. Die erste Ungleichung ergibt sich wie folgt: betrachte opt(G[U ], c). Dieser HK auf G[U ] induziert zwei perfekte Matchings in G[U ] (die erste, dritte, 34 fünfte Kante usw., und die zweite, vierte, sechste Kante usw.). Eins davon hat eine Länge von höchstens 12 L(opt(G[U ], c)), also muss das leichteste perfekte Matching höchstens so lang sein. Damit können wir nun ähnlich wie (aber besser als) im Falle der MST-Heuristik argumentieren. Sei wieder A die vom Algorithmus berechnete TSP–Tour. L(B ) L(B) + L(M ) (7) L(B) + 12 L(opt) 6.18 L(opt) + 12 L(opt) 3 L(A) ≤ = = . ≤ ≤ L(opt) L(opt) L(opt) L(opt) L(opt) 2 ¾ Vorlesung 31.01.08 Die bisherigen Approximationsalgorithmen für das TSP haben den MST als untere Schranke für die Länge einer optimalen TSP-Tour benutzt. Unser nächstes Ziel ist es, bessere untere Schranken zu konstruieren. Definition 6.23 Wir setzen n [n] ( ) 2 )} T (n) := {x ∈ {0, 1} : {e : xe = 1} bilden einen HK in Kn = ([n], 2 n und bezeichnen conv(T (n)) als das TSP-Polytop. Zu gegebenem Kostenvektor c ∈ R( 2 ) lautet das TSP-Problem also min{cT x : x ∈ T (n)} = min{cT x : x ∈ conv(T (n))}. Was uns aber fehlt, ist eine gute Beschreibung von conv(T (n)). n Proposition 6.24 Sei x ∈ Z( 2 ) . Dann ist x ∈ T (n) genau dann, wenn 0 ≤ xe ≤ 1 ∀e ∈ x{v,w} = 2 [n] 2 (8) ∀v ∈ [n] (9) ∀∅ = X ⊂ [n] (10) w:w=v xe ≤ |X| − 1 e∈(X 2) ¾ Beweis: . . . Bemerkung 6.25 n P := {x ∈ R( 2 ) : x erfüllt (8),(9),(10) } heißt Subtour-Polytop. Es gilt conv(T (n)) ⊂ P . Welche weiteren Ungleichungen brauchen wir, um das TSP-Polytop zu beschreiben, d.h. Gleichheit zu erzwingen? Zunächst geben wir ein ein paar äquivalente Umformungen für Bedingung (10) an. n Proposition 6.26 Angenommen, x ∈ R( 2 ) erfülle (8) und (9). Dann sind äquivalent: xe ≤ |X| − 1 ∀∅ = X ⊂ [n] X e∈( 2 ) xe ≤ |X| − 1 ∀∅ = X ⊆ [2, n] X e∈( 2 ) x{v,w} ≥ 2 ∀∅ = X ⊂ [n] v∈S,w∈[n]\S 35 (vgl. 10) (11) (12) ¾ Beweis: . . . Wir halten fest, dass n min{cT x : x ∈ T (n)} ≥ min{cT x : x ∈ R( 2 ) , x erfüllt (8), (9) und (10), (11) oder (12) }. Hier noch ein weiterer Ansatz für eine weitere (?) untere Schranke. Definition 6.27 Ein 1-Baum ist ein Subgraph H ⊆ ([n], [n] 2 ), der sich aus einem spannenden Baum auf den Knoten {2, . . . , n} und zwei zu Knoten 1 inzidenten Kanten zusammensetzt. Proposition 6.28 Die Kosten eines minimalen 1-Baums sind eine untere Schranke für die Kosten einer optimalen TSP-Tour. ¾ Beweis: Klar – jede TSP-Tour ist ein 1-Baum. Dies ergibt im allgemeinen keine gute untere Schranke. Betrachte beispielsweise den folgenden Graphen mit den Knoten 1, 2, 3, 4, 5 und den Kosten 100 für die Kante {1, 5}, Kosten 1 für die Kante {1, 4}, Kosten 10 für die Kanten {2, 3}, {2, 4} und {3, 4}, sowie Kosten 0 für alle anderen Kanten. Offensichtlich gibt es einen 1-Baum mit Kosten 0. Und eine TSP-Tour mit Kosten 10 findet sich auch schnell. Wir würden gerne zeigen, dass das eine optimale TSP-Tour ist – scheinbar hilft uns die untere Schranke durch den 1-Baum dabei nicht. Doch, und zwar mit folgendem Trick. Addiere Kosten 10 auf alle in Knoten 5 inzidenten Kanten. 1) Jetzt wachsen die Kosten unserer TSP-Tour um 20 auf Kosten 30. 2) Es lässt sich schnell überprüfen, dass die Kosten eines optimalen 1-Baums ebenfalls auf 30 wachsen. Das heißt: jede TSP-Tour in dem neuen Graph muss mindestens Kosten 30 haben. 3) Dann muss aber in dem alten Graph jede TSP-Tour Kosten mindestens 10 gehabt haben. Warum? Beweis durch Widerspruch: Angenommen, es hätte eine mit Kosten 10 − gegeben, dann hätte die gleiche Tour im neuen Graphen genau 20 mehr gekostet (denn wir hätten nur den Aufschlag von genau 10 + 10 für die zwei in Knoten 5 inzidenten Kanten zahlen müssen), und damit hätten wir in dem neuen Graphen eine Tour mit Kosten 30 − gehabt, im Widerspruch zu 2). Wir haben also durch den 1-Baum indirekt doch eine untere Schranke von 10 für TSP-Touren im alten Graphen gezeigt. Wir übersetzen das in einen allgemeinen Satz. Zu der Operation erhöhe die Kosten aller in 5 ” inzidenten Kanten um 10“ sagen wir, dass Knoten 5 die Knotennummer −10 erhält und schreiben ” y5 := −10“. Satz 6.29 Sei c : [n] → R≥0 , (y1 , . . . , yn ] ∈ Rn beliebig, Setze für alle e = {u, v} ∈ [n] die 2 2 modifizierten Kosten auf c̄e := ce − yu − yv . Seien die Kosten eines minimalen 1-Baums bei Kosten c̄ durch K gegeben. Dann ist K +2 v∈V yv eine untere Schranke für eine optimale TSP-Tour bei Kosten c. ¾ Beweis: ... Vorlesung 01.02.08 Unser Ziel ist es nun, zu zeigen, dass man (bei optimaler Wahl der Knotennummer yi ) in der obigen Proposition tatsächlich die gleiche Schranke wie durch das Subtourpolytop erzielt. Um das einzusehen, müssen wir zunächst den Wert eines optimalen 1-Baums durch ein LP beschreiben. Satz 6.30 (Spannende–Bäume–Polytop) Sei G = (V, E) ein (diesmal nicht notwendigerweise vollständiger) Graph mit |V | = n und |E| = m. Dann ist die konvexe Hülle der charakteristischen 36 Vektoren von spannenden Bäumen in G genau die Menge der Vektoren x ∈ Rm , die die folgenden Eigenschaften erfüllen: e∈E(G[X]) 0 ≤ xe ≤ 1 ∀e ∈ E (vgl. 8) xe ≤ |X| − 1 ∀∅ = X ⊂ V (13) . (14) xe = n − 1 e∈E Insbesondere gilt, dass für einen Kostenvektor c ∈ R≥0 m der Wert eines minimal spannenden Baums von G gegeben ist durch min{x : Rm : x erfüllt (8), (13), (14)}. Beweis: Offensichtlich erfüllen Konvexkombinationen von charakteristischen Vektoren spannender Bäume obige Bedingungen. Der Beweis der umgekehrten Richtung muss in der VL leider entfallen. ¾ n Korollar 6.31 (minimaler 1-Baum) Sei c ∈ R≥0 ( 2 ) und betrachte vollständigen Graphen ([n], [n] 2 ). Dann sind die Kosten eines minimalen 1-Baums bzgl. Kosten c gegeben durch n min cT x : x ∈ R( 2 ) mit [n] ∀e ∈ (vgl. 8) 0 ≤ xe ≤ 1 2 xe ≤ |X| − 1 ∀∅ = X ⊆ [2, n] (vgl. 11) X e∈( 2 ) xe = n − 2 (15) [2,n] e∈( 2 ) x{1,w} = 2 (16) w∈[2,n] Beweis: Klar nach Definition eines 1-Baums und 6.30. ¾ Satz 6.32 Maximiert man den Wert des minimalen 1-Baums über alle Knotennummern y, dann erhält man den gleichen Wert wie bei Minimierung über dem Subtour-Polytop in 6.25. ¾ Beweis: ... Lagrange-Relaxation Hinter der obigen Methode steht das allgemeine Prinzip des Lagrange–Relaxation. Betrachte das ILP (P ) : z ∗ := minn {cT x : Ax = b, Bx = d, x ≥ 0, x ∈ Zn } x∈R Vergleiche dies mit (Dy ) : L(y) := minn {cT x + (d − Bx)T y : Ax = b, x ≥ 0, x ∈ Zn }. x∈R Dann gilt für jedes y, dass z ∗ ≥ L(y), denn wenn x die Bedingung aus (P ) erfüllt, dann auch die Bedingung aus (Dy ) für jedes y und cT x = cT x + (d − Bx)T y = L(y). Bilde dann die beste untere Schranke u∗ := max L(y). y 37 Branch-and-Bound Verfahren Der Hauptgrund für die Entwicklung von guten unteren Schranken ist, dass man sie für sogenannte Branch-and-Bound Verfahren braucht. Angenommen wir haben eine (nicht-notwendigerweise optimale) TSP-Tour T ∗ berechnet und haben eine untere Schranke L für die Länge einer optimalen Tour. Jetzt wollen wir den Abstand zwischen c(T ∗ ) und L verringern. Definition 6.33 Für A, B ⊆ [n] 2 setzen wir SA,B := {TSP–Touren T : A ⊆ T, B ∩ T = ∅}, also die Touren, die alle Kanten aus A und keine aus B enthalten. Die SA,B stellen die Knoten in einem ((eventuell sehr großen) Hilfsbaum dar. Algorithmus 6.34 Input: TSP–Eingabe (G, c), Tour T ∗ , untere Schranke L Output: optimale Tour T ∗ Branch–and–Bound(G, c, T ∗, L) (1) Sei R := c(T ∗ ) und beginne mit dem einelementigen Hilfsbaum mit aktivem Knoten S∅,∅ . (2) Wähle aktiven Knoten SA,B im Hilfsbaum und deaktiviere ihn. (3) Wähle Kante e ∈ A ∪ B. Setze A := A ∪ {e} und B := B ∪ {e}. (4) foreach S ∈ {SA ,B , SA,B } (5) berechne untere Schranke L für alle Touren in S (6) if S = {T } and c(T ) < R then T ∗ := T , R := c(T ∗ ) (7) if |S | > 1 and L < R then nehme S als aktives Kind von SA,B in den Hilfsbaum auf (8) gehe zu 2) Bemerkung 6.35 n a) Algorithmus 6.34 hat im schlimmsten Fall Laufzeit O(2( 2 ) ) und findet immer eine optimale Tour. b) Die untere Schranke in Schritt 6) kann man beispielsweise durch Berechnung der LP-Relaxierung (Subtour-Polytop) unter Hinzufügen der Gleichung xe = 1 bzw xe = 0 gefunden werden. c) Wichtig ist weiterhin eine gute“ Wahl der Starttour T ∗ , des aktiven Knotens in Schritt 2) und der Kante ” in Schritt 3). Hierfür gibt es verschiedene Rezepte. d) Das Branch–and–Bound Verfahren lässt sich auch auf viele andere kombinatorische Optimierungsprobleme anwenden. Im Branching Schritt wählt man eine nicht ganzzahlige Variable x∗i und verzweigt auf die Fälle xi ≤ x∗i und xi ≥ x∗i . Für den Bounding Schritt berechnet man dann eine neue untere Schranke mit Hilfe der LP–Relaxierung inklusive neuer Ungleichung. Vorlesung 07.02.08 Ausblick: Schnittebenenverfahren Angenommen, die unteren Schranken, die man durch Berechnungen von Relaxationen erhalten hat, sind zu niedrig. Dann braucht man weitere Ungleichungen, die sich aus der Ganzzahligkeit ergeben. Wir brauchen dann noch weitere Ungleichungen, die das Polytop kleiner machen, ohne ganzzahlige Punkte (also mögliche TSP-Touren) abzuschneiden.Wir wollen hier aber einen allgemeinen Ansatz kennenlernen, der nicht nur für das TSP interessant ist. Dazu zunächst wieder ein Beispiel. Beispiel 6.36 Sei P := {x ∈ Rn : Ax ≤ b} und sei P̃ := {x ∈ Zn : Ax ≤ b} mit ⎛ ⎞ ⎛ ⎞ 2 3 27 ⎜ 2 −2 ⎟ ⎜ 7 ⎟ ⎜ ⎟ ⎜ ⎟ ⎜ ⎟ ⎜ A := ⎜ −6 −2 ⎟ , b := ⎜ −9 ⎟ ⎟. ⎝ −2 −6 ⎠ ⎝ −11 ⎠ −6 +8 21 38 Wie man leicht (zB graphisch) verifiziert, gilt für alle x ∈ P , dass x2 ≤ 6. Und der Punkt (4.5, 6) ∈ P zeigt, dass diese Schranke auch angenommen wird. Gleichzeitig kann man aber auch leicht feststellen, dass für alle x ∈ P̃ gilt, dass x2 ≤ 5 gilt. Wie lässt sich das jedoch beweisen? Betrachten wir dazu zunächst den folgenden Trick. Dividiere die letzte Ungleichung durch 2 und erhalte −3x1 + 4x2 ≤ 10.5 Daraus ergibt sich aber für alle x ∈ P̃ , dass −3x1 + 4x2 ≤ 10. Multipliziere diese Ungleichung nun mit 2, und addiere dazu das 3-fache der ersten Ungleichung. Wir erhalten 17x2 ≤ 101, also x2 ≤ 5.94, nach Abrunden also x2 ≤ 5, wie gewünscht. Ax ≤ b}, und seien Proposition 6.37 Betrachte P := {x ∈ Rn : Ax ≤ b} und P̃ := {x ∈ Zn : m n aTi die Zeilenvektoren von A. Seien y , . . . , y ∈ R gegeben, und setze c := 1 m ≥0 i=1 yi ai ∈ R und m d := i=1 yi bi ∈ R. Dann gilt für alle x ∈ P : cT x = yi aTi x ≤ i yi bi = d, i und, falls c ∈ Zn , dann insbesondere für alle x ∈ P̃ , dass cT x ≤ d. Definition 6.38 Seien die Bezeichnungen wie oben. Wenn c ∈ Zn , dann heißt die Ungleichung cT x ≤ d Gomory–Chvátal Schnittebene (cutting–plane). Man sagt, dass die Ungleichung cT x ≤ d durch y1 , . . . , ym aus Ax ≤ b abgeleitet wurde. Sei nun wT x ≤ t eine gültige Ungleichung für die Punkte in P̃ . Ein Schnittebenenbeweis für w x ≤ t aus Ax ≤ b ist eine Folge von M Ungleichungen zusammen mit nichtnegativen Zahlen T y1,1 , . . . , y1,m , y2,1 , . . . , y2,m+1 , . . . , yM,1 , . . . , yM,m+M−1 , so dass für alle k = 1, . . . , M die Ungleichung aTm+k x ≤ bm+k durch yk,1 , . . . , yk,m+k−1 aus den vorangegangenen Ungleichungen abgeleitet wurde und am+M = w und bm+M = t. Satz 6.39 Sei A ∈ Qm×n sowie P := {x ∈ Rn : Ax ≤ b} und P̃ := {x ∈ Zn : Ax ≤ b}. Sei ferner wT x ≤ t für alle x ∈ P̃ . Dann existiert ein t ≤ t und ein Schnittebenenbeweis für wT x ≤ t aus Ax ≤ b. ¾ Beweis: (nur skizziert) 39