Vorlesung OR Prof. M. Voigt 31. Mai 2017 1 Einführung in die Graphentheorie 1.1 Grundbegriffe, Bezeichnungen 1. Ein (endlicher) Graph G = (V, E) ist eindeutig bestimmt durch (a) V = V (G): endliche, nicht-leere Menge Knotenpunktmenge von G genannt (b) E = E(G) ⊆ V × V : endliche Menge - Kantenmenge von G genannt 2. Ist e ∈ E(G) mit e = (x, y) für x, y ∈ V = V (G) so sagen wir (a) x und y sind adjacent (benachbart) in G (b) e verbindet x und y in G (c) x und y sind Endknotenpunkte von e bzw. inzident mit der Kante e kurz: e = xy oder e = yx 1 3. Sei e1 ̸= e2 und e1 = xy, e2 = xy. Dann heißen e1 und e2 parallele Kanten 4. e = xx heißt Schlinge an x. 5. Ein Graph ohne Schlingen und parallele Kanten heißt schlichter Graph 6. Der Grad oder die Valenz d(x) = dG (x) von x ∈ V (G) ist die Zahl der zu x inzidenten Kanten. Dabei zählen Schlingen doppelt. Ein Knoten mit der Valenz 0 heißt isolierter Knoten. Der Maximalgrad von G ist ∆(G) := max{d(x) : x ∈ V }. Der Minimalgrad von G ist δ(G) := min{d(x) : x ∈ V }. 7. H ∼ = G ( H ist isomorph zu G), falls es eine bijektive Abbildung f : V (H) → V (G) gibt mit xy ∈ E(H) ⇐⇒ f (x)f (y) ∈ E(G). Man nennt f dann einen Isomorphismus von H auf G. 8. Ein Graph H = (V1 , E1 ) heißt Untergraph von G = (V, E), sofern V1 ⊆ V und E1 ⊆ E. 9. G = (V, E) heißt leerer Graph ⇐⇒ E = ∅ 10. G heißt vollständiger Graph, wenn jeder Knoten von G zu jedem anderen Knoten von G benachbart ist. Der vollständige Graph mit n Knoten wird mit Kn bezeichnet. 11. G = (V, E), F = (x1 , e1 , x2 , e2 , . . . , xr−1 , er−1 , xr , er , xr+1 ), x1 , . . . , xr+1 ∈ V (G), e1 , . . . , er ∈ E(G) 2 (a) F mit ei = xi−1 xi ∀i = 1, . . . , r heißt Kantenfolge in G F verbindet den Anfangsknoten x1 mit dem Endknoten xr+1 . F ist (x1 , xr )-Kantenfolge. Länge(F )=r (Anzahl der Kanten) F heißt offen ⇐⇒ x1 ̸= xr+1 , F heißt geschlossen ⇐⇒ x1 = xr+1 . (b) F heißt Kantenzug in G ⇐⇒ F ist Kantenfolge, dessen Kanten verschieden sind. (c) F heißt (einfacher) Weg in G ⇐⇒ F ist offener Kantenzug dessen Knotenpunkte verschieden sind. (d) F heißt Kreis in G ⇐⇒ F ist geschlossener Kantenzug, dessen Knoten mit Ausnahme von Anfangs- und Endknoten verschieden sind. (e) Eine Kante e = xy mit {x, y} ∈ {x1 , . . . , xr+1 } heißt Sehne, sofern e ̸∈ {e1 , . . . , er } 12. G heißt zusammenhängend ⇐⇒ je zwei Knoten von G sind durch eine Kantenfolge in G verbunden. 13. H heißt Komponente von G ⇐⇒ H ist maximaler zusammenhängender Untergraph von G. 3 1.2 Darstellung von Graphen im Computer (1) G = (V, E) sei ein schlichter Graph mit V = {x1 , . . . , xn }. Dann heißt A = (aij ) i, j = 1, . . . , n mit { 1 f alls xi xj ∈ E aij = 0 sonst Adjazenzmatrix von G. (2) G = (V, E) sei ein schlichter Graph mit V = {x1 , . . . , xn } und E = {e1 , . . . , em }. Dann heißt B = (bij ) i = 1, . . . , n, j = 1, . . . , m mit { 1 f alls xi Endknoten von ej bij = 0 sonst Inzidenzmatrix von G. (3) In einer Adjazenzliste wird für jeden Knoten x die Liste Lx der zu x inzidenten Kanten durch Angabe der jeweiligen Endknoten (Nachbarn von x) beschrieben: Knoten Liste der N achbarn 4 1.3 Bäume Definition: G heißt Wald ⇐⇒ G enthält keinen Kreis (G ist kreisfrei). G heißt Baum ⇐⇒ G ist zusammenhängend und kreisfrei. Ein Knoten x ∈ V heißt Blatt ⇐⇒ d(x) = 1 Satz 1.1 Es sei G = (V, E) ein Graph mit |V | = n ≥ 1. Dann gilt G ist Baum ⇔ G ist kreisfrei und |E| = n − 1 2 2.1 Algorithmen auf Graphen Minimalgerüste Beispiele: Serie 1, Aufgabe 2, Telekomnetz Baden-Würtemberg Definition: Sei G = (V, E) ein Graph. Ein Untergraph T = (V ′ , E ′ ) heißt Gerüst von G, falls V = V ′ , E ′ ⊆ E und T ist ein Baum. Satz 2.1 Der vollständige Graph Kn mit V (Kn ) = {1, . . . , n} und E(Kn ) = {ij ; 1 ≤ i < j ≤ n} hat nn−2 Gerüste. s. Hausaufgabe: K4 hat 16 Gerüste. K20 hat 2018 = 2, 62... · 1023 Gerüste. K50 hat 5048 = 3, 55... · 1081 Gerüste. Problem: Gegeben: zusammenhängender schlichter Graph G, Kantengewichtsfunktion f : E(G) → R ∑ Gesucht: Ein Gerüst T von G mit f (T ) := f (e) → min e∈E(T ) 5 Bezeichnung: Ein Gerüst T0 von G wird Minimalgerüst (minimum spanning tree) von (G, f ) (oder kürzer von G) genannt, falls f (T0 ) ≤ f (T ) ist, für alle Gerüste T von G. f wird auch kurz Kostenfunktion genannt. 3 2 2 5 4 8 4 5 4 1 3 1 3 3 1 2 6 2 9 5 8 7 8 9 Beispiel: Satz 2.2 Sei G ein zusammenhängender Graph mit Kostenfunktion f : E → R. Ferner sei u ⊆ V und e0 ∈ E eine Kante zwischen U und V \ U mit minimalem Gewicht. Dann existiert ein Minimalgerüst T0 , das die Kante e0 enthält. Algorithmus 2.1 (Prim) Eingabe: zusammenhängender Graph G = (V, E) mit V = {1, . . . , n} und eine Kostenfunktion f : E → R mit f (ij) = ∞ ⇐⇒ ij ̸∈ E. 1. Initialisierung: Setze t := 1; B := ∅; U := {1}; for all i, j ∈ V, i ̸= j, setze d(ij) = f (ij); (technische Maßnahme) 2. bestimme einen Knoten u ∈ V \ U mit d(tu) = min{d(tv) ; v ∈ V \ U }; (d(tv) ist der minimale Abstand eines Knoten v ∈ V \ U zu einem Knoten t ∈ U ) 6 bestimme eine Kante e := xu ∈ E mit f (e) = d(tu) und x ∈ U ; (da G zusammenhängend ist, ist d(tu) endlich) 3. B := B ∪ {e}; 4. U := U ∪ {u}; 5. Falls U ̸= V : Neuberechnung von d(tv) für alle v ∈ V \ U setze d(tv) := min{d(tv), d(uv)}; (Dies ist der Abstand von v zum nächstgelegenen Knoten aus U ) 6. Wiederhole die letzten 4 Schritte bis U = V ist Ausgabe: Die Kantenmenge B eines Minimalgerüstes von G Bemerkung: Der Algorithmus ist ein Beispiel für die sogenannte Greedy-Methode (greedy = gefräßig, raffgierig), die in jedem Schritt unter Berücksichtigung der Nebenbedingungen das lokal beste Element auswählt. 7 3 2 2 5 4 8 4 5 4 1 3 1 3 2 2 3 1 6 9 5 8 7 8 9 Starte mit t = 1 v ∈V \U d(tv) d(uv) d(tv) d(uv) d(tv) d(uv) d(tv) d(uv) d(tv) d(uv) d(tv) d(uv) d(tv) d(uv) d(tv) 2 2 ∞ 2 - 3 3 ∞ 3 5 3 1 1 - 4 ∞ ∞ ∞ 3 3 ∞ 3 4 3 - 5 ∞ ∞ ∞ ∞ ∞ 3 3 ∞ 3 8 3 - 6 ∞ 2 2 ∞ 2 - B = {17, 12, 67, 63, 24, 56, 58, 59} 8 7 1 - 8 ∞ 9 9 ∞ 9 8 8 ∞ 8 ∞ 8 2 2 - 9 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ 4 4 5 4 u = 7, e = 17 u = 2, e = 12 u = 6, e = 67 u = 3, e = 63 u = 4, e = 24 u = 5, e = 56 u = 8, e = 58 u = 9, e = 59 2.2 Kürzeste Wege, Algorithmus von Dijkstra Gegeben: • zusammenhängender schlichter Graph G mit n ≥ 2 Knotenpunkten • f : Kantenbewertung (Kostenfunktion) von G, f : E(G) → R • s, t: zwei Knotenpunkte von G mit s ̸= t Gesucht: Ein Weg W zwischen s und t in G mit ∑ f (e) → min . f (W ) := e∈E(W ) Definitionen: 1. Ist f : E → R eine Kantenbewertung von G, so heißt (G, f ) kurz Netzwerk. 2. Ein Weg W = (x0 , x1 , . . . , xl ) in G mit Anfangsknoten x0 und Endknoten xl wird kurz (x0 , xl )-Weg genannt. Wir nennen xi−1 den Vorgänger von xi in W und W ′ = (x0 , . . . , xi ) den (x0 , xi )-Teilweg von W ∑ 3. f (W ):= f (e) e∈E(W ) 4. Ein kürzester (x, y)-Weg in (G, f ) ist ein (x, y)-Weg W0 in G mit f (W0 ) ≤ f (W ) für alle (x, y)-Wege W in G. Die Länge eines kürzesten (x, y)-Weges wird mit dist(x, y):=f (W0 ) bezeichnet. 9 Satz 2.3 Es sei (G, f ) ein Netzwerk mit f (e) ≥ 0 für alle e ∈ E(G), und es seien x, y zwei verschiedene Knoten von G. Ist W0 ein kürzester (x, y)-Weg in (G, f ) und ist y ′ der Vorgänger von y in W0 , so ist der (x, y ′ )-Teilweg W ′ von W ein kürzester (x, y ′ )-Weg in (G, f ). Algorithmus 2.2 (Dijkstra) Eingabe: zusammenhängender Graph G = (V, E) mit Kostenfunktion f : E → R+ und Startknoten x1 ∈ V = {x1 , . . . , xn }. 1. Initialisierung: für j := 1, . . . , n setze d(xj ) := ∞; B := ∅ 2. x = x1 , d(x1 ) := 0; OFFEN:=V \ {x1 }; (OFFEN= Menge der Knoten xi , für die die permanente Distanz d(xi ) := dist(x1 , xi ) noch nicht bekannt ist.) 3. für alle xi ∈ OF F EN mit xxi ∈ E setze dt (xi ) := d(x) + f (xxi ); 4. für alle xi ∈ OF F EN mit xxi ∈ E setze d(xi ) := min{d(xi ), dt (xi )}; (Neuberechnung des Abstandes) v(xi ) := x falls d(xi ) = dt (xi ); (Bestimmung des Vorgängers) 5. wähle ein x ∈ OFFEN mit d(x) = min{d(y) : y ∈ OF F EN }; setze OF F EN := OF F EN \ {x}; falls x ̸= x1 , setze B := B ∪ {v(x)x} 6. Wiederhole die letzten drei Schritte bis OF F EN = ∅ 10 Ausgabe: Eine Liste d(xi ) (i = 1, . . . , n), die die Distanzen dist(x1 , xi ) = d(xi ) enthält, sowie die Kantenmenge B eines Gerüstes von G, wobei der eindeutige (x1 , xi )-Weg in G[B] stets ein kürzester (x1 , xi )-Weg in G ist. Beispiel: 10 2 13 1 16 13 8 11 13 4 13 17 17 3 12 6 22 8 5 21 13 10 10 18 16 11 16 12 7 11 9 15 d(xi ) d(x) + f (xxi ) d(xi ) v(xi ) d(x) + f (xxi ) d(xi ) v(xi ) d(x) + f (xxi ) d(xi ) v(xi ) d(x) + f (xxi ) d(xi ) v(xi ) d(x) + f (xxi ) d(xi ) v(xi ) d(x) + f (xxi ) d(xi ) v(xi ) d(x) + f (xxi ) d(xi ) v(xi ) d(x) + f (xxi ) d(xi ) v(xi ) d(x) + f (xxi ) d(xi ) v(xi ) 1 0 - 2 ∞ 13 13 1 3 ∞ 16 16 1 25 16 1 4 ∞ 12 12 1 5 ∞ - - 16 1 24 16 1 - - - - 33 33 4 29 29 7 21 21 2 33 21 2 - - - - - - 13 1 13 1 - 6 ∞ 23 23 2 23 2 38 23 2 7 ∞ 13 13 1 23 13 1 8 ∞ 9 ∞ 10 ∞ x=1 x=4 x=7 - 31 31 7 25 25 7 x=2 - 31 7 25 7 x=3 - 25 7 x=5 25 7 x=6 - - - - - - - - - - - - - - - 31 7 45 31 7 36 31 7 35 31 7 - - - - - - - - - 12 25 7 - 39 39 6 40 39 6 44 39 6 x=9 8 10 2.3 Eulerkreise Das Königsberger Brückenproblem (frühes 18. Jahrhundert) wird als Geburtsstunde der Graphentheorie angesehen. Problem: Gegeben ist ein Graph G, nicht notwendig schlicht. Gesucht ist ein Kreis in G, der jede Kante genau einmal enthält. Anwendung: Problem des chinesischen Postboten, Müllabfuhr, Kalken der Linien auf einem Tennisplatz Definitionen: • Ein Eulerzug eines ungerichteten nicht notwendig schlichten Graphen G = (V, E) ist ein Kantenzug P in dem jede Kante aus E genau einmal vorkommt und bei dem Anfangs- und Endknoten übereinstimmen. • Verlangen wir nicht, daß Anfangs- und Endknoten übereinstimmen, so sprechen wir von einem offenen Eulerzug. • Ein Graph heißt Eulersch, falls er einen Eulerzug besitzt. Beispiel: Das Haus vom Nikolaus Bemerkung: In der Literatur wird ein Eulerzug vielfach als Eulerkreis und ein offener Eulerzug als Eulerweg bezeichnet. 2.3.1 Existenz und Konstruktion Satz 2.4 (Euler, 1736) Ein nicht notwendig schlichter Graph G = (V, E) ist genau dann Eulersch, wenn G (bis auf isolierte 13 Knoten) zusammenhängend ist und alle Knoten geraden Grad haben (Schlingen werden doppelt gezählt). Satz 2.5 (Euler, 1736) Ein nicht notwendig schlichter Graph G = (V, E) besitzt einen offenen Eulerzug, wenn G (bis auf isolierte Knoten) zusammenhängend ist und die Anzahl der Knoten mit ungeradem Grad ist 0 oder 2 (Schlingen werden doppelt gezählt). Ein Linearzeitalgorithmus zur Konstruktion eines (offenen) Eulerzuges Eingabe: Graph G = (V, E), zusammenhängend, nicht notwendig schlicht 1. Setze W = ∅, Stelle fest ob der Graph (a) 0 Knoten ungeraden Grades (b) 2 Knoten ungeraden Grades: x, y besitzt. 2. (a) Starte bei beliebigem Knoten v (b) Starte bei x 3. Konstruiere einen nicht verlängerbaren Kantenzug (im Fall (b) einen offenen Kantenzug) und füge die benutzten Kanten zu W hinzu. Kommentar: Im Fall (a) endet der Kantenzug zwangsläufig bei v, da bei jedem anderen Knoten der Kantenzug durch die gerade Valenz verlängerbar ist. Im Fall (b) endet der offene Kantenzug zwangsläufig bei y 4. Ist W ̸= E, wähle beliebigen Knoten v ′ mit noch unbenutzten Kanten aus dem schon fertigen Kantenzug. 14 Konstruiere nicht verlängerbaren Kantenzug von v ′ aus (endet bei v ′ ) und füge die benutzten Kanten zu W hinzu. Füge den neuen Kantenzug an der entsprechenden Stelle in den alten Kantenzug ein. 5. Wiederhole 4. so lange, bis W = E. Ausgabe: (a) Eulerzug, (b) offener Eulerzug von G 2.3.2 Das Problem des chinesischen Postboten Gegeben: Straßennetz mit Entfernungsangaben zwischen Verzweigungen, der Postbote startet an einer Ecke (Postamt), muß jede Straße mindestens einmal durchlaufen und zum Postamt zurückkehren. Gesucht: Tour kürzester Länge Modell: Graph G = (V, E) mit Kantenbewertung (Kostenfunktion) f : E → R+ . Startegie: Wenn G Eulersch ist, konstruieren wir einen Eulerzug, fertig. Wenn G nicht Eulersch ist, konstruieren wir durch Verdoppelung von “einigen passenden“ Kanten einen (nicht schlichten) Graphen G∗ = (V, E ∗ ), so daß G∗ Eulersch ist und f (E ∗ \ E) minimal ist. Ein Eulerzug in G∗ ist dann der Weg des Postboten. 15 Beispiel: 2 4 3 2 1 4 5 1 3 2 3 2 3 5 1 2 4 4 8 2 6 5 3 7 9 8 16 2.4 Laufzeiten von Algorithmen 17 2.5 Der Algorithmus von Ford & Fulkerson Gegeben: Leitungsnetz mit Kapazitäten und möglichen Durchflußrichtungen, ein Erzeuger (Quelle), ein Abnehmer (Senke) Gesucht: Maximalfluß von der Quelle zur Senke 2.5.1 gerichtete Graphen Problem: Die Kanten im Netzwerk dürfen jeweils nur in einer vorgegebenen Richtung durchlaufen werden (Einbahnstraßen). Definitionen: (s. Folie) 1. Ein gerichteter Graph (directed graph, Digraph) D = (V, A) ist eindeutig bestimmt durch (a) V = V (D) endliche nichtleere Menge (Knotenpunktmenge) (b) A = A(D) endliche Menge von geordneten Paaren von Knoten (Kantenmenge, arc-gerichtete Kante) 2. Statt e = (x, y) schreiben wir kurz e = xy ⃗ oder e = xy, wenn klar ist, daß es sich um einen gerichteten Graphen handelt. 3. Sei e = xy, ⃗ dann heißt x Anfangsknoten und y Endknoten von e und e Kante von x nach y. 4. Der einem gerichteten Graph D = (V, A) zugrundeliegende (ungerichtete) Graph G = (V, E) ist definiert durch: xy ∈ E ⇐⇒ xy ∈ A oder yx ∈ A. 18 5. gerichtete Kantenfolge, gerichteter Weg und gerichteter Kreis werden analog zu den entsprechenden bekannten (ungerichteten) Begriffen definiert. ∑ 6. d+ aD (x, y) heißt Ausgangsgrad (AusgangsvaD (x) = y∈V (D) lenz, outdegree) ∑ von x. − dD (x) = aD (y, x) heißt Eingangsgrad (Eingangsvay∈V (D) lenz, indegree) von x. 7. Ein gerichteter Graph D = (V, A) heißt zusammenhängend, sofern sein zugrundeliegender ungerichteter Graph zusammenhängend ist. 8. Ein gerichteter Graph D = (V, A) heißt stark zusammenhängend ⇐⇒ für alle x, y ∈ V existieren ein gerichteter Weg von x nach y und ein gerichteter Weg von y nach x. 2.5.2 Definitionen und Bezeichnungen: Bemerkung: Im folgenden bezeichne G = (V, E) einen gerichteten Graphen, wobei E jetzt die Menge der gerichteten Kanten ist. • Ein (s,t)-Netzwerk N = (G, c, s, t) besteht aus 1. G - gerichteter Graph ohne Schlingen 2. c - Kantenbewertung von G mit c(e) ≥ 0, ganzzahlig, ∀e ∈ E(G). 19 3. s, t - zwei verschieden Knoten von G. Man nennt c die Kapazität des Netzwerkes N , s die Quelle, sowie t die Senke von N . • Sei G ein gerichteter Graph und A ⊆ V (G). Skizze I + (A) := {e ; e = xy, x ∈ A und y ∈ V \ A} I − (A) := {e ; e = xy, x ∈ V \ A und y ∈ V } Eine Kantenmenge F = I + (A) heißt Schnitt von G. Ist außerdem s ∈ A und t ∈ V \ A, so heißt F = I + (A) ein (s, t)-Schnitt von G. Die Kapazität des Schnittes F = I + (A) in N ist definiert durch: ∑ c(F ) := c(e), e∈F wobei c(∅) = 0 sei. Beispiel: • Das Minimalschnittproblem: Gegeben: N = (G, c, s, t) ein (s, t)-Netzwerk Gesucht: (s, t)-Schnitt F von G mit c(F ) → min. Ein solcher Schnitt wird kurz Minimalschnitt von N genannt. • Ist f : E → R eine Kantenbewertung von G, so sei für x∈V ∑ ∑ f (e) f (e) − df (x ) := e∈I + (x) 20 e∈I − (x) die Divergenz von f in x. Beispiel • Eine Kantenbewertung f : E → R heißt (s,t)-Fluß von G, falls df (x) = 0 für alle x ∈ V \ {s, t}. Dann ist df (s) = −df (t). • Wert(f ) := df (s). • Ein (s, t)-Fluß f von G heißt zulässiger (s, t)-Fluß in N = (G, c, s, t) falls für alle e ∈ E(G) gilt: 0 ≤ f (e) ≤ c(e). • Das Maximalflußproblem Gegeben: Ein (s, t)-Netzwerk N = (G, c, s, t) Gesucht: Ein zulässiger (s, t)-Fluß f von N mit W ert(f ) → max. Ein solcher Fluß wird kurz Maximalfluß in N genannt. 2.5.3 Das max-flow-min-cut Theorem Satz 2.6 (Ford & Fulkerson, 1956) Sei N = (G, c, s, t) ein (s, t)-Netzwerk. Dann ist der maximale Wert eines (s, t)-Flusses in N gleich der minimalen Kapazität eines (s, t)-Schnittes von N , d.h. max f ist (s,t)−F luß in N W ert(f ) = min F ist (s,t)−Schnitt von N c(f ) Folgerung: Ist f ein zulässiger (s, t)-Fluß in N und F ein (s, t)-Schnitt von N und gilt: W ert(f ) = c(F ), so ist f ein Maximalfluß und F ein Minimalschnitt von N . 21 2.5.4 Algorithmus Eingabe: Ein (s, t)-Netzwerk N = (G, c, s, t) Datenstruktur: • c(e) : Kapazität der Kante e, c(e) ≥ 0, ganzzahlig • f (e) : Fluß von f in der Kante e mit 0 ≤ f (e) ≤ c(e) • A : Menge der markierten Knotenpunkte • B : Menge der markierten, aber noch nicht überprüften Knotenpunkte • V or(x): Vorgänger des Knoten x auf einem markierten (⊆ A) (s, x)-Kantenzug • d(x) : Werte zur Berechnung der Erhöhung des aktuellen Flusses • Wert(f ) : Wert des aktuellen (s, t)-Flusses Anfangsschritt: 1. f (e) := 0 für alle e ∈ E, Wert(f ) := 0 Markierungsschritt: 2. A := {s}, B := {s}, d(s) = ∞ 3. Ist B = ∅ gehe zu 9. 4. Wähle x ∈ B und setze B := B \ {x} 22 5. Für alle e = xy ⃗ mit y ̸∈ A führe aus: Ist f (e) < c(e), dann setze V or(y) := +x, d(y) := min{c(e) − f (e), d(x)} A := A ∪ {y}, B := B ∪ {y} 6. Für alle e = yx ⃗ mit y ̸∈ A führe aus: Ist f (e) > 0, dann setze V or(y) := −x, d(y) := min{f (e), d(x)} A := A ∪ {y}, B := B ∪ {y} 7. Ist t ∈ A, so gehe zu 8., sonst zu 3. Verbesserungsschritt: 8. • Wert(f):=Wert(f ) + d(t) • x1 = V or(t), falls V or(t) > 0 setze f (x⃗1 t) := f (x⃗1 t) + d(t) sonst ⃗ 1 ) := f (tx ⃗ 1 ) − d(t) f (tx • x2 = V or(x1 ), falls V or(x1 ) > 0 setze f (x2⃗x1 ) := f (x2⃗x1 ) + d(t) sonst f (x1⃗x2 ) := f (x1⃗x2 ) − d(t) • . . . bis s erreicht ist • gehe zu 2. Ausgabe: Ein Maximalfluß f von N und ein Minimalschnitt I + (A) 23 2.6 Das Zuordnungsproblem 2.6.1 Problemstellung Tourenplanung Gegeben: n LKWs A1 , . . . , An , n Touren B1 , . . . , Bn , cij seien die Kosten, wenn der LKW i die Tour j fährt, C = (cij ) sei die Kostenmatrix Gesucht: Zuordnung der LKWs zu den Touren derart, daß die Kosten minimal werden, d.h. Z= n ∑ n ∑ cij xij → min i=1 j=1 { mit xij = Beispiel: C B1 A1 3 A2 8 A3 9 A4 8 2.6.2 1 LKW i fährt Tour j 0 sonst n=4 B2 B3 B4 7 9 12 2 11 2 10 4 6 5 5 7 Das Zuordnungsproblem (ungewichtet) Problem: Tanzstunde Geg.: eine Menge von Frauen und eine Menge von Männern es ist bekannt, welche Paare sich gegenseitig symphatisch finden Ges.: maximale Anzahl von (Tanz)Paaren mit gegenseitiger Symphatie 24 Definition: Ein Graph G = (V, E) ist ein paarer Graph (bipartiter Graph), falls V = A ∪ B und E ⊆ A × B. D.h. es gibt nur Kanten zwischen den Knotenmengen A und B, aber keine Kanten in A und keine Kanten in B. Modell: Paarer Graph G = (V, E): A entspricht der Menge der Frauen, B entspricht der Menge der Männer, x ∈ A ist benachbart zu y ∈ B, sofern x und y sich symphatisch finden. Gesucht ist ein Matching mit maximaler Kantenanzahl in G Bemerkung: Das Problem kann mit verschiedenen Algorithmen gelöst werden. • Ford & Fulkerson 1. Konstruiere aus G einen gerichteten Graphen G∗ = (V, A): – Alle vorhandenen Kanten werden von A nach B gerichtet. – Füge eine Quelle s, sowie sämtliche mögliche gerichtete Kanten von s nach A hinzu. – Füge eine Senke t, sowie sämtliche mögliche gerichtete Kanten von B nach t hinzu. 2. Definiere eine Kantenbewertung: f : A → R+ : f (e) = 1∀e ∈ A. 3. Bestimme einen maximalen Fluß von s nach t (F& F) 4. I + (A) ist ein maximales Matching in G∗ . 25 • alternierende Wege Definition: Sei G = (V, E) ein Graph und M ein Matching in G. Ein bezüglich M alternierender Weg ist ein Weg in G der abwechselnd Kanten aus M und aus E − M enthält. 1. Suche einen alternierenden Weg W in G, der sowohl mit einer Kante aus E − M beginnt als auch endet und nicht verlängerbar ist. 2. Falls kein solcher Weg existiert, ist M ein Matching mit maximaler Kantenanzahl. Gehe zu 5. 3. Falls ein solcher Weg existiert, konstruiere ein Matching M1 aus M durch Entfernen der Matchingkanten von W und Hinzunahme der Nichtmatchingkanten von W . M1 hat mehr Kanten als M . Setze M = M1 4. Wiederhole 1.-3., solange dies möglich ist. 5. Ausgabe von M 2.6.3 Nullzuordnungen Problem: Geg.: (n, n)-Matrix A = (aij ), die in jeder Zeile und jeder Spalte mindestens eine Null enthält. Ges.: Nullzuordnung: Markierung einer maximalen Anzahl von Nullen, so dass in jeder Zeile und jeder Spalte höchstens eine Null markiert ist. Bemerkung: Das Problem kann als ungewichtetes Zuordnungsproblem modelliert werden: 26 • paarer Graph G = (V, E), V = A ∪ B • Knoten i in A ist verbunden mit Knoten j in B genau dann wenn aij = 0 • Bestimme Matching mit maximaler Kantenanzahl in G • Markiere die den Kanten entsprechenden Nullen 2.6.4 Das Zuordnungsproblem gewichtet - Die Ungarische Methode (1) Kostenmatrixredunktion • je Zeile und je Spalte wird jeweils eine passende Zahl zi bzw. sj addiert oder subtrahiert • erzeugt in jeder Zeile und in jeder Spalte mindestens eine Null • verändert die Struktur des Problems nicht n m ∑ n m n m ∑ ∑ ∑ ∑ ∑ (cij − zi − sj )xij = cij xij − zi xij − Z∗ = n ∑ j=1 da i=1 j=1 sj m ∑ i=1 n ∑ xij = Z − m ∑ zi ai − i=1 xij = ai = 1 und j=1 n ∑ n ∑ i=1 j=1 sj bj = Z − j=1 m ∑ i=1 j=1 n ∑ zi − i=1 sj , j=1 xij = bj = 1 i=1 Somit hängen die Subtrahenden nicht von xij ab. (2) Anfangszuordnung • Führe eine Kostenmatrixreduktion durch bis in jeder Zeile und in jeder Spalte mindestens eine Null vorkommt. 27 • Ziel: Zuordnung (Markierung von Feldern, so daß in jeder Zeile und jeder Spalte genau ein Feld markiert ist), die möglichst viele Nullen als reduzierte Kosten enthält. • Wähle eine Zuordnung mit einer maximalen Anzahl von Nullen. Mache die entsprechenden Felder kenntlich. s. 2.6.3 • Falls alle gewählten Felder die (reduzierten) Kosten Null enthalten, ist die Zuordnung optimal, sonst muß die Optimierung durchgeführt werden. (3) Optimierungsphase 1. Markierung • Markiere alle Zeilen, die im markierten Feld keine Null enthalten. sei I die Menge der Indizes dieser Zeilen. • Markiere alle Spalten, die mindestens eine Null in einer der bisher markierten Zeilen enthalten. Die Menge der Indizes dieser Spalten sei J. • Markiere zusätzlich alle Zeilen, die in den markierten Spalten Zuordnungen (Nullmarkierungen) enthalten. Füge die Indizes zu I hinzu. • Markiere zusätzlich Spalten, Zeilen,.. entsprechend den letzten zwei Schritten solange dies möglich ist. 2. Umrechnung • Ermittle das Minimum der cij in den markierten Zeilen, aber dort nur in den nichtmarkierten Spalten. (Falls es keine solche Felder gibt, gibt es eine bessere Ausgangszuordnung) m := min{cij | i ∈ I, j ̸∈ J} 28 • Für i ∈ I und j ̸∈ J setze: cij = cij − m • Für i ̸∈ I und j ∈ J setze: cij = cij + m • Sonst: cij = cij 3. Wähle eine neue Zuordnung unter Verwendung möglichst vieler Nullen. 4. Wiederhole das Verfahren solange, bis die Zuordnung nur Nullen enthält (optimal ist). 2.6.5 Variationen Sei C = (cij ) die “Kostenmatrix“. (1) Die Zielfunktion ist zu maximieren • Setze m := max i=1,...,n,j=1,...,n cij und • C ′ := (c′ij ) mit c′ij := m − cij • Minimiere die Zielfunktion bezüglich der “Kostenmatrix“ C′ (2) Anzahl Anbieter ̸= Anzahl Besteller Führe fiktive Anbieter bzw. fiktive Besteller ein und setze die entsprechenden “Kosten“ konstant cij = c, c ∈ N0 29 2.7 Hamiltonkreise und das TSP Problem Das Problem des Handlungsreisenden Traveling Salesman Problem (TSP): Gegeben: Liste von Städten, sowie für je zwei Städte die Kosten, um von einer Stadt in die andere zu gelangen. Ein Handlungsreisender startet in einer Stadt, macht eine Rundtour durch alle Städte und kehrt an seinen Ausgangspunkt zurück. Gesucht: Reiseroute mit minimalen Gesamtkosten Modell: Vollständiger Graph mit Kantenbewertung (Kostenfunktion) f : E → R+ ; Gesucht ist ein Kreis, der jeden Knoten in G einmal enthält und minimale Kosten verursacht Definitionen: • Ein Hamiltonkreis (Hamiltonweg) eines Graphen G = (V, E) ist ein Kreis (Weg) in dem jeder Knoten aus V (genau einmal) vorkommt. • Ein Graph heißt Hamiltonsch, falls er einen Hamiltonkreis besitzt. 2.7.1 Geschichte des TSP-Problems • 1832: Handbuch für Handlungsreisende Das Problem wurde beschrieben, aber nicht mathematisch behandelt, es wurden Beispieltouren angegeben • 1856: Spiel mit 20 Knoten und Nebenbedingungen 30 • 1930: Math. Kolloquium in Wien: Das Problem wurde mathematisch formuliert: Botenproblem (Menger) 2.7.2 Komplexität Wir betrachten das folgende Entscheidungsproblem: TSP = {(G, f, k) : • G = (V, E) ist vollständiger Graph, f : E → R+ ist eine Kostenfunktion, k ∈ N • Gibt es einen ∑ Hamiltonkreis C = (e1 , . . . , en ) in G mit f (C) = f (e) ≤ k}. e∈E(C) Satz 2.7 TSP ist NP-vollständig. 2.7.3 Exakte Lösungen (1) Alle Touren durchsuchen Bem: Für n Städte gibt es (n−1)! 2 mögliche Touren. Beispiel: K4 A − 29 − B − 30 − C − 12 − D − 35 − A : 97 A − 20 − B − 34 − D − 12 − C − 42 − A : 108 A − 42 − C − 30 − B − 34 − D − 35 − A : 141 Für 15 Städte hat man bereits mehr als 4.3·1010 Wege zu durchsuchen. 31 (2) Formulierung als LP-Problem Geg.: G(V, E) vollständiger Graph, V = {1, . . . , n}, Kostenfunktion f : E → R+ { ⃗ gehört zur Tour 1 ij Ges.: Sei xij = 0 sonst n n ∑∑ Z= xij f (ij) → min i=1 j=1 Nebenbedinbungen: • n ∑ xij = 1 ∀i = 1, . . . , n, i=1 n ∑ xij = 1, ∀j = 1, . . . , n j=1 • Es muss verhindert werden, dass mehrere kurze Kreise entstehen (statt eines Hamiltonkreises) Die Anzahl dieser Nebenbedingungen steigt exponentiell in n !!! (3) Rekorde: s. Wikipedia 2005: Layout integrierter Schaltkreise mit 33 810 Knoten (William Cook, Concorde) 2004: wurde eine optimale Tour durch 24 978 schwedische Städte berechnet Concorde) 2.7.4 Heuristiken Zielstellung: Gute Näherungen für TSP finden Einige Vorschläge: 32 1. NN (Nächster Nachbar) Wähle einen beliebigen Starknoten x. Sei x der letzte erreichte Knoten. Suche unter allen noch ”nicht erreichten” Knoten denjenigen Knoten y mit minimalem f (xy). 2. MST (Minimum Spanning Tree) (a) Konstruiere ein minimales Gerüst T (b) Verdopple alle Kanten in T und erhalte TD . Konstruiere einen Eulerzug C in TD . (c) Konstruiere einen Hamiltonschen Kreis CM ST aus C durch Überspringen schon besuchter Knoten. 3. CH (Christofides Heuristik) (a) Konstruiere ein minimales Gerüst T (b) Sei U die Menge der Knoten ungeraden Grades in T , |U | = 2m. Konstruiere gewichtetes minimales (perfektes) Matching M auf U , M = {x1 y1 , . . . , xm ym } und füge M zu T hinzu, erhalte Eulerschen Graph TD (c) Konstruiere einen geschlossenen Eulerzug C in TD (d) Konstruiere einen Hamiltonschen Kreis CCH aus C durch Überspringen schon besuchter Knoten. Frage: Wie gut sind nun diese Heuristiken? Bezeichnungen: ∑ f (e) 1. f (C) = e∈E(C) 2. Copt bezeichne den Kreis mit minimalen Kosten, d.h. f (Copt ) ≤ f (C) für jeden Hamiltonkreis C. 33 3. Ein TSP heißt metrisches TSP sofern für die Kostenfunktion die Dreiecksungleichung erfüllt ist: f (xy) ≤ f (xz) + f (zy) für alle x, y, z. Satz 2.8 Es sei ein metrisches TSP mit Kostenfunktion f gegeben. Dann gilt 1. f (CM ST ) ≤ 2f (Copt ) 2. f (CCH ) ≤ 32 f (Copt ) s. M.Aigner: Diskrete Mathematik, Friedr. Vieweg & Sohn Verlag, Wiesbaden 2006 34 3 Allgemeine Optimierungsmethoden Bemerkung: In diesem Abschnitt geht es nicht unbedingt um schnelle Methoden, sondern um systematisches Durchsuchen 3.1 3.1.1 Branch and Bound Backtracking (1) Die Idee Die Backtracking-Methode organisiert das erschöpfende Durchsuchen ohne Schleifen. Partielle Lösungen werden solange erweitert, wie es möglich ist. Wenn es nicht mehr weiter geht, geht man einen Schritt zurück und probiert neu. Beispiel: Labyrinth (2) Baumdiagramm • Gegeben: Mengen A1 , A2 , dots • Gesucht: (a1 , a2 , . . .) mit ai ∈ Ai die gewisse Bedingungen erfüllen • Beginne mit dem leeren Wort () als Wurzel • Sei S1 die Menge der Kandidaten aus A1 Wähle a1 ∈ S1 → Teillösung (a1 ) • Seien (a1 , . . . , ai ) schon gewählt. 35 • Si+1 sei die Menge der Elemente x aus Ai+1 , so dass (a1 , . . . , ai , x) den vorgegebenen Bedingungen genügt. • Wähle aus der Kandidatenmenge Si+1 ⊆ Ai+1 das erste Element, sofern Si+1 ̸= ∅. Falls Si+1 = ∅, gehe zurück und teste den nächsten Kandidaten aus Si . Beispiel: • Gegeben: n × n-Schachbrett • Gesucht: Eine Plazierung von möglichst vielen Damen, so dass keine die andere schlagen kann Frage: Geht es immer mit n Damen? (Ja n ≥ 4) • Bemerkung:Die Lösung ist eine Permutation a1 , . . . , an der Zahlen 1, . . . , n, so dass ai die Spaltennummer der Dame in Zeile i angibt. Diagonalbedingung: |ai − aj | ̸= |i − j| für i ̸= j. • n = 4; Durch Symmetrie können wir a1 ≤ 2 annehmen, also A1 = {1, 2} • ... 3.1.2 Idee der Branch and Bound Methode Bemerkung: Es handelt sich um eine Variante (Verfeinerung) der BacktrackMethode. Es wird versucht, das Durchsuchen ganzer Teilbäume überflüssig zu machen. 36 Idee: In jedem Knoten des Backtrack-Baumes ermitteln wir eine untere Schranke für das gesuchte Minimum copt . Wir verzweigen (branch), ermitteln und vergleichen die neuen Schranken (bound) und fahren mit dem Knoten fort der aktuell die beste Schranke angibt. Wird für ein Blatt ein Wert c ermittelt, so können alle Teilbäume mit einer Schranke schlechter als c ignoriert werden. 3.1.3 Beispiele: (a) Das Asymmetrische Rundreiseproblem (ARP) 1. Gegeben: gerichteter Graph G = (V, A), Kantenbewertung: w(e) ≥ 0, z.B. 1 2 1 ∞ 2 2 2 ∞ 3 8 6 3 4 ∞ 5 3 ∞ 4 8 5 7 4 6 4 cij gibt die Kosten von i nach j an. Da es cij mit cij ̸= cji gitb, handelt es sich um ein ARP. 2. Gesucht: Rundtour mit minimalen Kosten. 37 3. bound: Zeilen und Spaltenreduktion Von jedem Knoten muss eine Kante ausgehen, d.h. die Kosten der Rundtour sind mindestens so hoch, wie die Summe der minimalen Elemente der einzelnen Zeilen. Subtrahiere diese Elemente von der jeweiligen Zeile und setze die Summe als untere Schranke. Analog wird eine Spaltenredunktion durchgeführt (jeder Knoten muss erreicht werden). Die minimalen Element werden zur vorhandenen Schranke addiert. Teste, ob es eine Rundtour gibt, bei der alle Kanten die aktuelle Bewertung 0 haben. Falls ja, ist dies eine Rundtour mit minimalen Kosten. 4. branch: Wähle eine Kante e = ij mit aktueller Bewertung 0 und betrachte die Fälle: (a) e = ij gehört zur Tour: Streiche Zeile i und Spalte j und setze cji = ∞. (b) e = ij gehört nicht zur Tour: Setze cij = ∞. 5. bound: 38 Berechne die neuen Schranken durch Zeilen- und Spaltenreduktion und gehe in den Zweig mit der niedrigeren Schranke. Teste, ob es eine Rundtour gibt, bei der alle Kanten die aktuelle Bewertung 0 haben. Falls ja, ist dies eine Rundtour mit minimalen Kosten. 6. Wiederhole die Schritte 4 und 5 bis eine Rundtour mit minimalen Kosten gefunden wurde. (b) minimales gewichtetes (perfektes) Matching 1. Geg.: K8 mit folgenden Kantengewichten (s. Serie 6, Aufgabe 4): 1 2 1 2 2 2 - 4 5 3 5 5 3 7 9 7 8 10 11 13 11 15 11 9 13 4 5 3 - 6 4 12 6 10 5 5 3 6 - 10 8 12 11 7 9 7 4 10 - 8 2 6 8 13 11 12 8 8 - 6 3 10 11 9 6 12 2 6 - 4 11 15 13 10 11 6 3 4 - 2. Ges.: minimales gewichtetes Matching 3. Bemerkung: Der K8 hat 7 · 5 · 3 = 105 verschiedene perfekte Matchings 39 4. Bound: Jeder Knoten gehört zu genau einer MatchingKante ⇒ addiere die Gewichte schon gewählter Kanten, sowie 21 mal die Summe der minimalen Elemente aller restlichen Zeilen. 5. Branch: Wähle eine Kante e = ij mit minimalem Gewicht und betrachte die Fälle: (a) e = ij gehört zum Matching: Streiche Zeilen i und j, sowie Spalten i und j. (b) e = ij gehört nicht zum Matching: Setze w(ij) = w(ji) = ∞ 6. berechne die unteren Schranken neu. 7. Wiederhole die Schritte 5 und 6 bis ein minimales gewichtetes Matching gefunden wurde. 40