Grundlagen der Algorithmen und Datenstrukturen Kapitel 12 Prof. Dr. Christian Scheideler Stv: Stefan Schmid SS 2008 07.11.2015 Kapitel 12 1 Heute... Prof Scheideler auf Konferenz... Vorlesung: - Techniken beim Algorithmenentwurf („check list“?) - ev. Nachbesprechung Midterm - Fragen Endterm? 07.11.2015 Kapitel 12 2 Generische Optimierungsverfahren Techniken: • Systematische Suche – lass nichts aus • Divide and Conquer – löse das Ganze in Teilen • Dynamische Programmierung – mache nie etwas zweimal • Greedy Verfahren – schau niemals zurück • Lokale Suche – denke global, handle lokal 07.11.2015 Kapitel 12 3 Systematische Suche Prinzip: durchsuche gesamten Lösungsraum Auch bekannt als „Brute Force“ Vorteil: sehr einfach zu implementieren Nachteil: sehr zeitaufwendig und sollte daher nur für kleine Instanzen verwendet werden 07.11.2015 Kapitel 12 4 Systematische Suche Beispiele: • Suche in unsortierter Liste • Broadcasting in unstrukturierten verteilten Systemen (Peer-to-Peer Systeme) • Selection Sort (nimm wiederholt kleinstes Element aus Eingabesequenz) • Rucksackproblem (siehe nächste Folie) 07.11.2015 Kapitel 12 5 Systematische Suche Rucksackproblem: • Eingabe: n Objekte mit Gewichten w1,…,wn und Werten v1,…,vn und Rucksack mit Kapazität W • Ausgabe: Objektmenge M maximalen Wertes, die in Rucksack passt Anwendungen: Nikolaus, Räuber, … 07.11.2015 Kapitel 12 6 Systematische Suche Lösung zum Rucksackproblem: Probiere alle Teilmengen von Objekten aus und merke die Menge M von Objekten mit i 2 M wi <= W, die bisher den maximalen Wert hatte Aufwand: O(2n), da es 2n Möglichkeiten gibt, Teilmengen aus einer n-elementigen Menge zu bilden. 07.11.2015 Kapitel 12 7 Divide and Conquer Prinzip: teile Problem in Teilprobleme auf, die unabhängig voneinander gelöst werden können Vorteil: Implementierung oft einfach, da rekursiv Nachteil: eventuell werden Teilprobleme doppelt gelöst 07.11.2015 Kapitel 12 8 Doppelte Berechnungen... Fibonacci Zahlen: f0 = 0, f1 = 1 fn = fn-1 + fn-2 07.11.2015 Kapitel 12 9 Divide and Conquer Beispiele: • Mergesort • Quicksort • Binary Search • Arithmische Operationen wie Matrixmultiplikation oder Multiplikation großer Zahlen • Nächstes-Paar-Problem 07.11.2015 Kapitel 12 10 Divide and Conquer Matrixmultiplikation nach Strassen: • Eingabe: nxn-Matrizen A und B • Ausgabe: nxn-Matrix C mit C=A¢B Wir nehmen vereinfachend an, n sei Zweierpotenz. Dann A und B darstellbar durch jeweils 4 (n/2)x(n/2)-Matrizen: A= 07.11.2015 A00 A01 A10 A11 B= Kapitel 12 B00 B01 B10 B11 11 Divide and Conquer Für Matrix C gilt: C= C00 C01 C10 C11 mit • C00=M1+M4-M5+M7 • C01=M3+M5 • C10=M2+M4 • C11=M1+M3-M2+M6 mit Matrizen M1,…,M7 wie in nächster Folie 07.11.2015 Kapitel 12 12 Divide and Conquer Matrizen M1,…,M7: • M1=(A00+A11) ¢ (B00+B11) • M2=(A10+A11) ¢ B00 • M3=A00 ¢ (B01-B11) • M4=A11 ¢ (B10-B00) • M5=(A00+A01) ¢ B11 • M6=(A10-A00) ¢ (B00+B01) • M7=(A01-A11) ¢ (B10+B11) 07.11.2015 Kapitel 12 7 rekursive Aufrufe 13 Divide and Conquer Laufzeit von Strassens Algorithmus: T(1)=O(1), T(n)=7T(n/2) + O(n2) Also Laufzeit O(nlog2 7) = O(n2,81) Laufzeit der Schulmethode (brute force): O(n3) 07.11.2015 Kapitel 12 14 Divide and Conquer Nächstes-Paar-Problem: • Eingabe: Menge S von n Punkten P1=(x1,y1),…,Pn=(xn,yn) im 2-dimensionalen Euklidischen Raum • Ausgabe: Punktpaar mit kürzester Distanz Annahme: n ist Zweierpotenz 07.11.2015 Kapitel 12 15 Divide and Conquer Algo für Nächstes-Paar-Problem: • Sortiere Punkte gemäß x-Koordinate (z.B. Mergesort, Zeit O(n log n) ) • Löse danach Nächstes-Paar-Problem rekursiv durch Algo ClosestPair 07.11.2015 Kapitel 12 16 Divide and Conquer Algo ClosestPair(S): • Eingabe: nach x-Koordinate sortierte Punktmenge S • |S|=2: sortiere S gemäß y-Koordinate und gib Distanz zwischen den zwei Punkten in S zurück • |S|>2: – – – – teile S in der Mitte (Position n/2) in S1 und S2 d1:=ClosestPair(S1); d2:=ClosestPair(S2) d:=min{ClosestCrossPair(S1,S2,min(d1,d2)), d1, d2} Führe Merge(S1,S2) durch, so dass S am Ende nach y-Koordinate sortiert ist (S1, S2 bereits sortiert) – gib d zurück 07.11.2015 Kapitel 12 17 Divide and Conquer ClosestCrossPair(S1,S2,d): d=min{d1,d2} d Nur Punktpaare in Streifen interessant d d2 d1 Nur max. 4 Punkte in dxd-Quadrant Punkte nach yKoordinate sortiert 07.11.2015 S1 Kapitel 12 S2 18 Divide and Conquer ClosestCrossPair: • Durchlaufe die (nach der y-Koordinate sortierten) Punkte in S1 und S2 von oben nach unten (wie in Merge(S1,S2)) und merke die Mengen M1 und M2 der 8 zuletzt gesehenen Punkte in S1 und S2 im d-Streifen • Bei jedem neuen Knoten in M1, berechne Distanzen zu Knoten in M2, und bei jedem neuen Knoten in M2, berechne Distanzen zu Knoten in M1 • Gib am Ende minimal gefundene Distanz zurück 07.11.2015 Kapitel 12 19 Divide and Conquer Last 8 points => y distance from current point at for other points > d => can be ignored! d=min{d1,d2} d d d2 d1 07.11.2015 S1 Kapitel 12 S2 20 Divide and Conquer New point => compare to those stored points (max 8) which are on other side! d=min{d1,d2} d d d2 d1 07.11.2015 S1 Kapitel 12 S2 21 Divide and Conquer Laufzeit für Nächstes-Paar-Algo: • Mergesort am Anfang: O(n log n) • Laufzeit T(n) von ClosestPair Algo: T(1)=O(1), T(n)=2T(n/2)+O(n) Gesamtlaufzeit: O(n log n) Brute force: O(n2) 07.11.2015 Kapitel 12 22 Dynamische Programmierung Prinzip: rekursive Durchsuchung des Lösungsraums mittels Speicher Vorteil: verhindert doppelte Berechnung von Teillösungen Nachteil: benötigt eventuell sehr viel Speicher 07.11.2015 Kapitel 12 23 Dynamische Programmierung Beispiele: • Berechnung des Binomialkoeffizienten • Rucksackproblem 07.11.2015 Kapitel 12 24 Dynamische Programmierung Berechnung des Binomialkoeffizienten: • Eingabe: n,k>=0, n>=k • Ausgabe: C(n,k) mit C(n,k) = nk Rekursive Formel für C(n,k): • C(n,0)=C(n,n)=1 für alle n>=0 • C(n,k)=C(n-1,k-1)+C(n-1,k) für n>k>0 07.11.2015 Kapitel 12 25 Dynamische Programmierung 0 1 0 1 1 1 1 2 1 2 2 …. k-1 k 1 .. . k 1 k … 1 .. . n-1 C(n-1,k-1) C(n-1,k) C(n,k) n 07.11.2015 zu berechnende Einträge (<n¢k); linke Spalte und Diagonale alles 1 zu Beginn, Rest folgt rekursiv. Kapitel 12 26 Dynamische Programmierung Berechnung des Binomialkoeffizienten: for i:=0 to n do for j:=0 to min(i,k) do if j=0 or j=i then C[i,j]:=1 else C[i,j]:=C[i-1,j-1]+C[i-1,j] return C[n,k] Laufzeit: O(n ¢ k) 07.11.2015 Kapitel 12 27 Dynamische Programmierung Rucksackproblem: • Eingabe: n Objekte mit Gewichten w1,…,wn und Werten v1,…,vn und Rucksack mit Kapazität W • Ausgabe: Objektmenge M maximalen Wertes, die in Rucksack passt 07.11.2015 Kapitel 12 28 Dynamische Programmierung V[i,w]: optimaler Wert, der für die Objekte 1 bis i bei Rucksackvolumen w erreichbar ist Rekursive Berechnung von V[i,w]: • Für die Teilmengen, die das i-te Objekt nicht enthalten ist der Wert der optimalen Lösung gleich V[i-1,w] • Für die Teilmengen, die Objekt i enthalten, ist der Wert der optimalen Lösung gleich vi+V[i-1,w-wi] (wi abziehen, sonst würde Gesamtgewicht zu gross!) 07.11.2015 Kapitel 12 29 Dynamische Programmierung Idee also: Wenn wir für Teilmenge der Objekte 1..i-1 optimale Packung für Maximalgewichte 1...w haben, können wir optimale Packung für Objekte 1..i mit Maximalgewicht w sehr schnell berechnen. 07.11.2015 Kapitel 12 30 Dynamische Programmierung Rekursive Formel für V[i,w]: • V[0,w]=0 für alle w>=0 • V[i,0]=0 für alle i>=0 • V[i,w]=V[i-1,w] falls w-wi<0 • V[i,w]=max{V[i-1,w], vi+V[i-1,w-wi]} sonst 07.11.2015 Kapitel 12 31 Dynamische Programmierung Rekursive Berechnung von V[i,w]: 0 w-wi w W 0 0 0 0 0 i-1 0 i 0 n 0 07.11.2015 V[i-1,w-wi] V[i-1,w] V[i,w] Ziel V[n,W] Kapitel 12 32 Dynamische Programmierung Berechnung der Tabelle: O(n¢W) Zeit Brute force: O(2n) Frage: Wie schaut optimale Packung aus? Fazit: solange W klein, viel bessere Laufzeit als brute force. Falls W groß, dann unterteile Objekte in große (wi>=W/(42) ) und kleine Objekte. Wende auf die großen Objekte dynamische Programmierung an (kleine Tabelle) und auf die kleinen eine Greedy Methode an, die wir später noch beschreiben werden. Damit ist in Zeit O(n ¢ poly(1/)) Lösung ermittelbar, die um maximal 1+ von Optimum abweicht. 07.11.2015 Kapitel 12 33 Greedy Verfahren Prinzip: teile Problem in mehrere kleine Entscheidungen auf, nimm immer lokales Optimum für jede kleine Entscheidung Vorteil: sehr schnell Nachteil: kann weit von optimaler Lösung entfernt sein 07.11.2015 Kapitel 12 34 Greedy Verfahren Beispiele: • Dijkstra-Algorithmus für kürzeste Wege • Jarnik-Prim-Algorithmus für minimale Spannbäume • Huffman-Bäume • Rucksackproblem 07.11.2015 Kapitel 12 35 Greedy Verfahren Alice muss Bob regelmässig wichtige Nachricht zukommen lassen. Bob wohnt leider ein paar Kilometer weit weg, es besteht aber Sichtkontakt. Alice hat eine Taschenlampe, und möchte die Nachricht „morsen“ mittels eines binären Alphabets (lang = „0“, kurz = „1“) Alice und Bob können eine Kodierung abmachen, wissen aber im voraus nur, dass die Nachrichten in deutsch sein werden, nicht aber deren Inhalt. Kodierung? 07.11.2015 Kapitel 12 36 Greedy Verfahren Huffman-Baum: • Eingabe: Wahrscheinlichkeitsverteilung p auf einem Alphabet A (e.g., A = {a,b,c,d,...}) • Ausgabe: optimaler Präfixcode f:A ! {0,1}* für A, d.h. a 2 A |f(a)|¢p(a) minimal Präfixcode: Kodierung f:A ! {0,1}*, für die es keine Zeichen a,b2 gibt, für die f(a) ein Präfix von f(b) ist (d.h. f(b) anfängt mit f(a) ) Präfixcodes wichtig für eindeutige Dekodierung! 07.11.2015 Kapitel 12 37 Greedy Verfahren Einsicht: jeder Präfixcode lässt sich als Binärbaum darstellen mit Zeichen in A an Blättern Beispiel: A={a,b,c,d} 0 a 0 c 07.11.2015 Kodierung f: • f(a) = 0 • f(b) = 110 • f(c) = 10 • f(d) = 111 1 1 0 b 1 d Kapitel 12 38 Greedy Verfahren Huffman-Baum: Baum für optimale Kodierung Strategie: • Anfangs ist jedes Zeichen in A ein Baum für sich • Wiederhole, bis ein einziger Baum übrig: – Bestimme die beiden Bäume T1 und T2 mit kleinsten Wahrscheinlichkeitswerten a p(a) ihrer Zeichen – Verbinde T1 und T2 zu neuem Baum T 07.11.2015 0 Kapitel 12 T1 1 T2 T 39 Greedy Verfahren Beispiel für Huffman-Baum: Zeichen A B C D _ Wkeit p 0,35 0,1 0,2 0,2 0,15 1,0 0 1 0,4 0 C 0,2 0,6 0 1 D 0,2 0,25 0 07.11.2015 B 1 0,1 12 Kapitel 0,35 A 1 0,15 _ 40 Greedy Verfahren Rucksackproblem: • Eingabe: n Objekte mit Gewichten w1,…,wn und Werten v1,…,vn und Rucksack mit Kapazität W • Ausgabe: Objektmenge M maximalen Wertes, die in Rucksack passt 07.11.2015 Kapitel 12 41 Greedy Verfahren Greedy Strategie: • Berechne Profitdichten d1=v1/w1,.., dn=vn/wn • Sortiere Objekte nach Profitdichten • Angefangen von dem Objekt mit höchster Profitdichte, füge Objekte zu Rucksack hinzu, bis kein Platz mehr da Problem: Greedy Strategie kann weit vom Optimum entfernt liegen 07.11.2015 Kapitel 12 42 Greedy Verfahren Beispiel: zwei Objekte mit v1=1 und v2=W-1 und w1=1 und w2=W, Rucksackkapazität ist W Greedy-Methode: berechnet d1=1 und d2 = 1-1/W und wird nur Objekt 1 in Rucksack packen, da Objekt 2 nicht mehr passt Optimale Lösung: packe Objekt 2 in Rucksack (viel besser da Wert W-1 statt 1) 07.11.2015 Kapitel 12 43 Greedy Verfahren Verbesserte Greedy-Methode: • Seien die Objekte 1 bis n absteigend nach Profitdichte sortiert • Bestimme maximale Objektmenge {1,…,i} wie bisher mit j<=i wj <=W • Gib entweder {1,…,i} oder {i+1} aus, je nachdem, welche Menge den maximalen (absoluten) Wert hat 07.11.2015 Kapitel 12 44 Greedy Verfahren Behauptung: die Lösung der verbesserten Greedy-Methode ist höchstens einen Faktor 2 von der optimalen Lösung entfernt Beweis: • Wenn beliebige Bruchteile der Objekte gewählt werden könnten, wäre die optimale Lösung {1,…,i+1} (da maximale Profitdichte), wobei von Objekt i+1 nur der Bruchteil genommen wird, der noch in den Rucksack passt. • Für den optimalen Wert OPT gilt demnach: OPT <= j<=i+1 vj. • Also ist max{j<=i vj, vi+1} >= OPT/2 da beides zusammen grössergleich OPT, und wir grösseres nehmen 07.11.2015 Kapitel 12 45 Lokale Suche Generische Verfahren (mit Nachbarschaft): • Backtracking • Branch-and-Bound • Hill climbing • Simulated annealing • Tabu search • Evolutionäre Verfahren (Mutation, Mating & Survival of the Fittest) 07.11.2015 Kapitel 12 46 Backtracking Prinzip: systematische Tiefensuche im Lösungsraum, bis gültige Lösung gefunden Vorteil: einfach zu implementieren Nachteil: kann sehr lange dauern 07.11.2015 Kapitel 12 47 Backtracking Beispiele: • n-Damen Problem • Hamiltonscher Kreis Problem 07.11.2015 Kapitel 12 48 Backtracking n-Damen Problem: • Eingabe: n 2 IN • Ausgabe: Antwort auf die Frage, ob sich n Damen so auf einem nxn-Schachbrett stellen lassen, dass keine die andere schlagen kann 07.11.2015 Kapitel 12 49 Backtracking Tiefensuche über Spalten (Nummern geben Reihenfolge an, in der Zustände 1 besucht werden) 07.11.2015 5 Keine Lösung 3 2 Keine Lösung für 3. Dame! Beispiel für n=4 0 6 7 4 Keine Lösung Keine Lösung Kapitel 12 8 Lösung 50 Backtracking Hamiltonscher Kreis Problem: • Eingabe: ungerichteter Graph G=(V,E) • Ausgabe: Kreis C ½ E, der jeden Knoten genau einmal besucht, falls dieser existiert 07.11.2015 Kapitel 12 51 Backtracking a b c d f e G=(V,E) 07.11.2015 Kapitel 12 52 Branch and Bound Prinzip: systematische Breitensuche im Lösungsraum (mit Bewertung der Zustände), bis optimale Lösung gefunden Vorteil: relativ einfach zu implementieren Nachteil: kann sehr lange dauern 07.11.2015 Kapitel 12 53 Now to s.th. completely different... 07.11.2015 Kapitel 12 54 Aufgabe 1 07.11.2015 Kapitel 12 55 Aufgabe 2 07.11.2015 Kapitel 12 56 Aufgabe 3 07.11.2015 Kapitel 12 57 Aufgabe 4 07.11.2015 Kapitel 12 58