Formale Methoden der Informatik WS 2010/2011 Lehrstuhl für Datenbanken und Künstliche Intelligenz Prof. Dr. Dr. F. J. Radermacher • H. Ünver • T. Rehfeld • J. Dollinger 6. Aufgabenblatt Besprechung in den Tutorien vom 08.12.2010 (ab Übungstermin) bis 15.12.2010 (bis Übungstermin) 28. Aufgabe (6 Punkte) Verständnisfragen: a) Was ist ein Euler-Kreis, und was ist eine Euler-Tour? Euler-Kreis: Ein Weg durch einen Graphen, der alle Kanten genau einmal besucht und bei dem Anfangs- und Endknoten übereinstimmen. Euler-Tour: Wie Euler-Kreis, nur müssen Anfangs- und Endknoten hier nicht übereinstimmen. b) Wann existiert zu einem Graphen ein Euler-Kreis und wann eine Euler-Tour? Euler-Kreis: Wenn alle Knotengrade gerade sind. Euler-Tour: Wenn die Knotengrade maximal zweier Knoten ungerade sind. c) Was ist ein Hamilton-Kreis? Ein Weg durch einen Graphen, der alle Knoten genau einmal besucht und bei dem Anfangs- und Endknoten übereinstimmen. d) Was ist eine Rundreise? Ein Weg in einem Graphen, der von einem Startknoten ausgehend über verschiedene andere Knoten (oft auch über alle anderen Knoten) wieder zum Startknoten führt. (Im Grunde, (meist) ein Hamiltonkreis durch einen Graphen.) e) Ist der Dijkstra-Algorithmus geeignet, Rundreiseprobleme zu lösen? Nein! Der Dijkstra-Algorithmus sucht den kürzesten Weg zwischen zwei Knoten in einem Graphen (ggf. zwischen einem Anfangsknoten und allen anderen Knoten). Eine Rundreise beschreibt einen Kreis in einem Graphen, d.h. Anfangs- und Endknoten sind derselbe Knoten. Beim Traveling-Salesman-Problem – einem typischen Rundreiseproblem (gesucht ist die kürzeste Rundreise, die alle Knoten genau einmal besucht) – funktioniert der DijkstraAlgorithmus gerade nicht . Ermittelt wird nur der kürzeste Weg zwischen zwei (festen) Knoten – nicht der Kreisschluss. f) Was ist eine Heuristik? Eine Strategie, die zwar kein exaktes, jodoch zumindest ein gutes“ Ergebnis zu einem ” Problem liefert. Heuristiken werden vor allem eingesetzt, wenn die exakte Bestimmung eines Problems (ab einer bestimmten Datenmenge) einen sehr hohen Aufwand bedeutet. g) Was ist ein Transportnetz? Ein Graph mit gewichteten Kanten, die Kapazitäten darstellen. h) Was ist ein Fluss? Ein Fluss durch eine Kante ist eine Zahl, die kleiner oder gleich der Kapazität dieser Kante ist, sowie eine Angabe über die Richtung des Flusses. Ein Fluss durch den Graphen ist die Summe der Flüsse durch die Kanten eines beliebigen Schnitts. Anmerkung: Die Gleichheit der Flüsse durch alle Schnitte wird durch das Kirchoff’sche Gesetz gewährleistet. i) Wann ist ein Fluss maximal? Wenn es keinen weiteren flusserhöhenden Weg mehr von der Quelle zur Senke gibt. j) Was ist ein Schnitt? (Genau) die Menge von Kanten, durch deren Entfernung der Graph in zwei Zusammenhangskomponenten zerfällt. k) Was ist ein Matching? Ein Menge von Kanten, so dass keine zwei Kanten einen gemeinsamen Knoten haben. l) Was ist ein perfektes Matching? Ein Matching, bei dem alle Knoten des Graphen beteiligt sind. 29. Aufgabe (6 Punkte) Kürzester Weg: Bestimmen Sie den kürzesten Weg im folgenden Graphen mit Hilfe des Dijkstra Algorithmus: a) vom Knoten s zum Knoten t, b 3 7 a t 4 2 6 2 7 d 14 10 s c 4 7 3 7 e L K ∅ (a, ∞), (b, ∞), (c, ∞), (d, ∞), (e, ∞), (s, 0) , (t, ∞) p(s)=− (s, 0) (s, 0), (c, 4) (s, 0), (c, 4), (a, 6) (s, 0), (c, 4), (a, 6), (e, 7) (s, 0), (c, 4), (a, 6), (e, 7), (b, 9) (s, 0), (c, 4), (a, 6), (e, 7), (b, 9), (d, 13) (s, 0), (c, 4), (a, 6), (e, 7), (b, 9), (d, 13), (t, 15) ∅ (a, 7), (b, ∞), (c, 4) , (d, 14), (e, 7), (t, ∞) p(a)=s p(c)=s p(d)=s p(e)=s (a, 6) , (b, 10), (d, 14), (e, 7), (t, ∞) p(a)=c p(b)=c (b, 9), (d, 14), (e, 7), (t, ∞) p(b)=a (b, 9), (d, 14), (t, ∞) (d, 13), (t, 16) p(d)=b p(t)=b (t, 15) p(t)=d Legende: • Die Angaben p(x) = y unter den neu berechneten Knoten geben an, (ob in diesem Schritt ein neuer Vorgänger und) welcher Vorgänger für eine Entfernungsänderung des Knotens in diesem Schritt verantwortlich ist. • Fettgedruckte Knoten aus der K-Liste sind die gegenwärtig kleinsten und werden in die L-Liste übernommen. • Unterstrichene Knoten aus der K-Liste sind die von den fettgedruckten aus (und damit in die L-Liste übernommenen und damit vom nächsten Schritt ab) erreichbaren Knoten. (Nur diese Knoten brauchen im nächsten Schritt neu untersucht werden. Die restlichen verändern sich unter Garantie im nächsten Schritt nicht und können daher einfach abgeschrieben werden.) Alternative Schreibweise: m(s) := 0 pred(s) := − v0 := s K := {a, c, d, e} m(a) := 7 pred(s) := s m(c) := 4 pred(c) := s m(d) := 14 pred(d) := s m(e) := 7 pred(e) := s v0 := c K := {a, b, d, e} m(a) := m(c) + w(c, a) = 4 + 2 = 6 pred(a) := c m(b) := m(c) + w(c, b) = 4 + 6 = 10 pred(b) := c m(d) := m(c) + w(c, d) = 4 + 10 = 14 keine Verbesserung (war schon 14) m(e) := m(c) + w(c, e) = 4 + 3 = 7 keine Verbesserung (war schon 7) v0 := a K := {b} m(b) := m(a) + w(a, b) = 6 + 3 = 9 pred(b) := a v0 := e K := {d} m(d) := m(e) + w(e, d) = 7 + 7 = 14 keine Verbesserung (war schon 14) v0 := b K := {d, t} m(d) := m(b) + w(b, d) = 9 + 4 = 13 pred(d) := b m(t) := m(b) + w(b, t) = 9 + 7 = 16 pred(t) := b v0 := d K := {t} m(t) := m(d) + w(d, t) = 13 + 2 = 15 pred(t) := d v0 := t K := {} Kürzester Weg: Die Angaben von p(x) (für verschiedene x) können in einer Tabelle zusammengefasst werden, in der für jedes x, das angegeben wird, ein Wert eingetragen (und ggf. auch wieder überschrieben, d.h. abgeändert) wird. Für den vorliegenden Graphen ergibt sich beim ablaufen des Dijkstra-Algorithmus die folgende Tabelle: Vorgänger sc ca s sb s − bd pred(x) pred(a) pred(b) pred(c) pred(d) pred(e) pred(s) pred(t) Durch sukzessives Einsetzen erhält man (von hinten angefangen) den kürzesten Weg: Zielknoten pred(t) pred(d) pred(b) pred(a) pred(c) pred(s) = = = = = = = t d b a c s − (Startknoten) Damit ergibt sich der folgende kürzeste Weg (von s nach t): s→c→a→b→d→t Lösung: b 3 7 a t 4 2 6 2 7 d 14 10 s c 4 7 3 7 e b) und von Augsburg nach Hanau. (Bonus) 20 Frankfurt am Main Hanau HA 110 F Würzburg WÜ 90 120 Nürnberg Mannheim MA N 140 130 AA Aalen 115 Stuttgart S 75 90 80 UL Ulm A 80 Augsburg M München L ∅ K (A, 0) (A, 0) (M, 80), (UL, 80) -"-(UL, 80) (AA, 155) (S, 170) -"- (N, 195) -"- A (AA, 155), (M, 80), (S, 170) UL UL (AA, 155), (N, 195), (S, 170) -"- (M, 80) -"- A (WÜ , 295) -"-"-"-"- (MA, 300) (F, 390) M (N, 195), (S, 170), (WÜ , 295) AA (MA, 300), (N, 195), (WÜ , 295) S (MA, 300), (WÜ , 295 //// ) 315 (HA, 405), (MA, 300) WÜ (F, 390), (HA, 405) MA ) (HA, 405 /// / 410 (HA, 405) ∅ Legende: • Nicht-erreichbare Knoten (bisher durch die Form (x, ∞) gekennzeichnet) wurden diesmal weggelassen. • Die Angaben unter den neu berechneten Knoten beziehen sich auf den unmittelbaren Vorgänger, der zur Neuberechnung der Entfernung geführt hat. Diesmal wurde nur noch der Name des Vorgängerknotens angegeben (also kein pred(x) oder p(x) mehr). • Ergab eine Neuberechnung eine größere Entfernung als die bisherige, so wurde dieser nicht-übernomme Wert in ausge-X-ter //////////////// Form darunter geschrieben (hätte weggelassen werden können). • Fettgedruckte Knoten aus der K-Liste waren in der Zeile die gegenwärtig kleinsten und wurden in die L-Liste übernommen. Alternative Schreibweise: m(A) := 0 pred(A) := − v0 := A K := {UL, M } m(UL) := 80 pred(UL) := A m(M ) := 80 pred(M ) := A v0 := M K := {N } m(N ) := m(M ) + w(M, N ) = 80 + 115 = 195 pred(N ) := M v0 := UL K := {AA, S} m(AA) := m(UL) + w(UL, AA) = 80 + 75 = 155 pred(AA) := UL m(S) := m(UL) + w(UL, S) = 80 + 90 = 170 pred(S) := UL v0 := AA K := WÜ m(WÜ) := m(AA) + w(AA, WÜ ) = 155 + 140 = 295 pred(WÜ) := AA v0 := S K := {MA} m(MA) := m(S) + w(S, MA) = 170 + 130 = 300 pred(MA) := S v0 := N K := WÜ m(WÜ) := m(N ) + w(N, WÜ) = 195 + 120 = 315 keine Verbesserung (bisher 295) v0 := WÜ K := {HA} m(HA) := m(WÜ ) + w(WÜ , HA) = 295 + 110 = 405 pred(HA) := WÜ v0 := MA K := {F } m(F ) := m(MA) + w(MA, F ) = 300 + 90 = 390 pred(F ) := MA v0 := F K := {HA} m(HA) := m(F ) + w(F, HA) = 390 + 20 = 410 keine Verbesserung (bisher 405) v0 := HA K := {} Kürzester Weg: Die Angaben der Vorgänger verschiedener Knoten x können in einer Tabelle zusammengefasst werden, in der für jedes x, das angegeben wird, ein Wert eingetragen (und ggf. auch wieder überschrieben, d.h. abgeändert) wird. Für den vorliegenden Graphen ergibt sich beim ablaufen des Dijkstra-Algorithmus die folgende Tabelle diesmal in der Reihenfolge des ersten Auftretens – also nicht umsortiert: Vorgänger − A A M UL UL AA S WÜ MA pred(x) pred(A) pred(UL) pred(M ) pred(N ) pred(AA) pred(S) pred(WÜ ) pred(MA) pred(HA) pred(F ) Durch sukzessives Einsetzen erhält man (von hinten angefangen) den kürzesten Weg: (Ziel) pred(HA) pred(WÜ ) pred(AA) pred(UL) pred(A) → → → → → WÜ AA UL A − (Start) Damit ergibt sich der folgende kürzeste Weg (von Augburg (A) nach Hanau (HA)): A → UL → AA → WÜ → HA Lösung: 20 Frankfurt am Main Hanau HA 110 F Würzburg WÜ 90 120 Nürnberg Mannheim MA N 140 130 AA Aalen 115 Stuttgart S 75 90 UL 80 Ulm A Augsburg 80 M München 30. Aufgabe (1 Punkt) Hamiltonkreis: Geben Sie ein Beispiel für einen Graphen an ohne Hamiltonkreis, bei dem alle Knotengrade ≥ 2 sind. Beispielsweise: .... ......... ..... ........ .... ...... . ..... .... .. ... ... ..... .. . ............... . . . . .......... ... .... ... ... . .... . .. ... .... .... .... ... .... .... ... ......... ...... . .... ....... ..... .. ..... ..... ... ......... ...... . . .... .. . . . ... .. .... .... ... .... .... ... . . ... . . . .... ......... . . . . . . . . . . . .. ...... .... ...... .. ..... . ..... . ... . ..... ...... ................ ....... 1 5 2 4 3 Gleichgültig, wie man läuft, für eine Kreis-Tour muss man auf jeden Fall zweimal über den Knoten 2 laufen – und das ist bei einer Hamiltontour nicht erlaubt. 31. Aufgabe (4 Punkte) Eulerkreis: Gegeben sei der folgende Graph: a) Kann man diesen Graphen mit Kanten (Mehrfachkanten nicht erlaubt) so erweitern, dass er mit einem Zug gezeichnet werden kann? In einem Zug zeichnen ist äquivalent mit: Der Graph hat einen Eulerpfad (d.h. es gibt höchstens zwei Knoten mit ungeradem Grad). Durch Hinzufügen von Kanten zwischen den Knoten mit ungeradem Grad werden die Grade dieser Knoten gerade gemacht. Dies führt man so oft durch, bis nur noch zwei Knoten mit ungeradem Grad vorhanden sind. Mögliche Kanten: {{A, N } , {E, P } , {G, F }}. b) Kann man ihn auch so erweitern, dass Start- und Endknoten des Zugs gleich sind? {{A, G} , {C, E} , {M, F } , {N, P }} c) Gibt es Graphen (mit mehr als zwei Knoten), die man durch Hinzufügen von Kanten nicht so ergänzen kann, dass sie mit einem Zug gezeichnet werden können? Ja, z.B. der K4 (K4 ist ein Graph mit 4 Knoten, bei dem jeder mit jedem verbunden ist). d) Gibt es Graphen (mit mehr als zwei Knoten), die man durch Hinzufügen von Kanten nicht so ergänzen kann, dass sie mit einem Zug gezeichnet werden können, so dass Start- und Endknoten gleich sind? Ja, z.B. der K4 , bei dem eine Kante entfernt wurde (wenn Mehrfachkanten nicht erlaubt sind). 32. Aufgabe (6 Punkte) Algorithmus von Ford / Fulkerson: 3 ....... ................ .... ....... .. .. ... ..... . ........... . ... ..... ......... . . . . . . . . . . . . . . . . . . . . .................................. ................ ...... ... ...... . . ... . . . . . .... .. .. .... ................ . . . . . . ........ ... ... ... ... ......... .... .... .... ........ .... ... . ... . . . . . ......... ... ... ... ......... .... ..... .... .... ........ . .......... ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ............... .... . .. ... . ... . .... ... .. ..... ..... .. . ........... ...... . . . ............ . . . ... . . . . . ... .... ... .... ..... ................. .............................. . . . . . . . . . . . . . . . . . . . . . . . . . ...... ... ... ..... . . ... ... ...... . . . . . . .... . . . . .... .. .. ........ ... .... .... .... .... ......... .... .... .... ........ ... ... ... ......... .... ... .... .... .... ................ .... . . . . . . . . . ...... .. ...... ............................ ............... ............ ........... ........ . .. .. ... ..... . ........... .. ... ..... ................. ........... a 10 Quelle 1 s 7 2 6 3 c 4 4 d t Senke 1 2 b 6 f 1 e 7 6 a) Bestimmen Sie mit dem Algorithmus von Ford und Fulkerson für den gegebenen Graphen einen maximalen Fluss von der Quelle zur Senke. Beispielhafte Berechnung der Erweiterungspfade und der entstehenden Flusserhöhung: Erweiterungspfad Restkap. / Flusserh. s-a-d-t: s-a: a-d: d-t: 10 − 0 3−0 7−0 s-b-e-t: s-b: b-e: e-t: 4−0 7−0 6−0 = = = min: 4 7 6 4 s-c-e-t: s-c: c-e: e-t: 1−0 2−0 6−4 = = = min: 1 2 2 1 s-a-c-e-t: s-a: a-c: c-e: e-t: 10 − 3 6−0 2−1 6−5 = = = = min: 7 6 1 1 1 s-a-c-d-t: s-a: a-c: c-d: d-t: 10 − 4 6−1 2−0 7−3 = = = = min: 6 5 2 4 2 s-a-c-b-e-f-t: s-a: a-c: c-b: b-e: e-f: f-t: 10 − 6 6−3 4−0 7−4 1−0 6−0 = = = = = = min: 4 3 4 3 1 6 1 s-a-c-b-e-d-t: s-a: a-c: c-b: b-e: e-d: d-t: 10 − 7 6−4 4−1 7−5 1−0 7−5 = = = = = = min: 3 2 3 2 1 2 1 = 10 = 3 = 7 min: 3 Maximaler Fluss: 13 b) Geben Sie einen minimalen Schnitt an. {(a, d), (c, d), (e, d), (e, f ), (e, t)} 33. Aufgabe (4 Punkte) Matching: Ein Personalchef hat mehrere Stellen zu besetzen (K, L, M, N, O, P, Q, R). Er hat mehrere Bewerbungen vorliegen, wobei die Bewerber für mehrere Jobs geeignet sind (in Klammern für jeden Bewerber angegeben): Alfred (K, P ), Bruno (O, R), Cornelia (L, R), Dorit (N, R), Emil (Q, M ), Frida (O, P ), Gundula (P, N, R). Finden Sie auf graphentheoretischem Wege eine Zuordnung, so dass möglichst viele der vakanten Stellen mit einem geeigneten Bewerber besetzt werden können. Das Problem wird als Graph aufgefasst, indem man die Berufe und die Personen als Knoten betrachtet und die Beziehung der Eignung“ als Kante zwischen der Person und den Berufen, ” für die sie geeignet ist. Der entstandende Graph ist ein bipartiter Graph, und die Aufgabe besteht nun darin, ein maximales Matching zu finden. Ein perfektes Matching kann man in diesem Graph nicht finden, denn die Knoten M, Q haben nur einen gemeinsamen Nachbarn E – folglich kann einer dieser zwei Knoten nicht “gematcht” werden. Das Matchingproblem wird auf das Flussproblem reduziert, indem man zwei zusätzliche Knoten, die Quelle (S) und die Senke (T ), hinzufügt sowie Kanten zwischen der Quelle und allen Knoten aus der ersten Menge (die Jobs) und zwischen denen aus der zweiten Menge (die Personen) und der Senke. Alle Kanten haben Kapazität Eins. Ein möglicher maximaler Fluss entspricht einem maximalen Matching in diesem Graphen. Dieser ist mit Rot eingetragen. K A L B M C N S D O E P F Q G R T