Datenstrukturen & Algorithmen Matthias Zwicker Universität Bern Frühling 2010
Übersicht Dynamische Programmierung Einführung Ablaufkoordination von Montagebändern Längste gemeinsame Teilsequenz Optimale binäre Suchbäume Eigenschaften der dynammischen Programmierung 2
Dynamische Programmierung Entwurfsstrategie, wie divide-and-conquer (teile-und-beherrsche) Programmierung bedeutet Tabellieren (historischer Hintergrund) Teile-und-beherrsche: Teilprobleme sind unabhängig Dynamische Programmierung: Teilprobleme bestehen ihrerseits aus gemeinsamen Teilproblemen 3
Dynamische Programmierung Lösung von Optimierungsproblemen Finde eine Lösung mit optimalen Eigenschaften Kleinster oder grösster Wert (Minimierung oder Maximierung) 4
Dynamische Programmierung Vier Schritte, um Algorithmus zu entwickeln 1. Beschreibe Struktur einer optimalen Lösung 2. Definiere Wert der optimalen Lösung rekursiv 3. Berechne Wert der optimalen Lösung bottom-up up 4. Konstruiere optimale Lösung basierend auf den vorherigen Berechnungen 5
Dynamische Programmierung Begriffe Optimale Teilstruktur Überlappende Teilprobleme Memoisierung 6
Übersicht Dynamische Programmierung Einführung Ablaufkoordination von Montagebändern Längste gemeinsame Teilsequenz Optimale binäre Suchbäume Eigenschaften der dynammischen Programmierung 7
Ablaufkoord. von Montagebändern Autofabrik mit zwei Montagebändern Bänder haben dieselben Stationen, aber unterschiedliche Bearbeitungszeiten Autos können von einem zum anderen Band verschoben werden Problem: bestimme optimalen Ablauf durch die Bänder Bestimme, welche Stationen von welchem Band verwendet werden sollen 8
Optimaler Ablauf Alle Möglichkeiten ausprobieren? Jeder Ablauf gegeben durch Menge der Stationen von Band 1 (oder Band 2) Bänder haben n Stationen 2 n Teilmengen Exponentielle Anzahl Kandidaten Unpraktisch wenn n gross 9
1. Struktur der optimalen Lösung Betrachte schnellsten Weg zur Station S 1,j j=1: einfach Zeit zu S 1,1 j>=2: zwei Möglichkeiten zu S 1,j Via S 1,j-1 j 1, dann direkt zu S 1,j j Via S 2,j-1, dann Transfer zu zu S 1,j 10
1. Struktur der optimalen Lösung Annahme: Schnellster Weg zu S 1,j ist durch S 1,j-1 Beobachtung Müssen schnellsten Weg zu S 1,j-1 genommen haben Falls es einen schnelleren Weg zu S 1,j-1 gäbe, hätten wir diesen verwendet um einen noch schnelleren Weg zu S 1,j zu erhalten 11
1. Struktur der optimalen Lösung Annahme: Schnellster Weg zu S 1,j ist durch S 1,j-1 Beobachtung Müssen schnellsten Weg zu S 1,j-1 genommen haben Falls es einen schnelleren Weg zu S 1,j-1 gäbe, hätten wir diesen verwendet um einen noch schnelleren Weg zu S 1,j zu erhalten Selbes Argument für Weg zu S 1,j über S 2,j-1 12
1. Struktur der optimalen Lösung Optimale Teilstruktur: Optimale Lösung für ein Problem (Weg zu S 1,j ) enthält optimale Lösung zu Teilproblemen (Weg zu S 1,j-1 oder S 1,j-2 ) Benütze optimale Teilstruktur um optimale Lösung zu einem Problem aus optimalen Lösungen von Unterproblemen zu finden Um schnellsten Pfad zu S 1,j j zu finden, bestimme schnellsten Pfad zu S 1,j-1 und S 2,j-1 13
2. Rekursive Lösung Sei f i [j] kürzeste Zeit um S i,j zu durchlaufen Ziel: finde kürzeste Zeit f * durch alle Stationen 14
Analyse der rekursiven Lösung Anzahl Zugriffe auf f i [j] ist 2 n-j Gesamtzahl der Zugriffe auf alle f i [j] ist 2 n+1-2 Siehe Übung Exponentielle Laufzeit! 15
3. Bottom-up Algorithmus Speichere Zusatzinformation, um später Lösung rekonstruieren zu können Sei l i [j] = Band 1 oder 2, dessen Station j-1 auf dem Weg durch S i,j verwendet wird S li[j],j-1j 1 ist vor S ij i,j Beispiel 16
3.Bottom-up Algorithmus 17
4. Rekonstruktion der Lösung Verwende Zusatzinformation l i [j], um Lösung zu rekonstruieren 18
Übersicht Dynamische Programmierung Einführung Ablaufkoordination von Montagebändern Längste gemeinsame Teilsequenz Optimale binäre Suchbäume Eigenschaften der dynammischen Programmierung 19
Längste gemeinsame Teilsequenz Gegeben zwei Sequenzen X=<x 1,...,x m > und Y=<y 1,...,y n >. Finde eine Sequenz von maximaler Länge, die in X und Y vorkommt Elemente der Sequenz müssen nicht konsekutiv, jedoch in korrekter Reihenfolge in X und Y vorkommen Longest common subsequence (LCS) Beispiele 20
Naive Lösung Für jede Teilsequenz von X, prüfe ob sie in Y vorkommt Aufwand Θ(n2( m ) 2 m Teilsequenzen in X Jeder Bitvektor der Länge m definiert eine Teilsequenz Überprüfen jeder Teilsequenz braucht Θ(n) Gesamte Sequenz Y muss durchlaufen werden Exponentiell! 21
Optimale Teilstruktur Notation X i bezeichnet Präfix <x 1,...,x i > Y i bezeichnet Präfix <y 1,...,y i > i y 1 y i Theorem Sei Z=<z 1,...,z k > LCS von X m und Y n 1. Falls x m=yy n, dann z k=x m=yy n und Z k-1 1 ist LCS von X m-1 und Y n-1 2. Falls x m y y n, dann bedeutet z k x x m, dass Z LCS von X m-1 und Y n 3. Falls x m y n, dann bedeutet z k y n, dass Z LCS von X m und Y n-1 22
Beweis Theorem 23
Optimale Teilstruktur Ein LCS von zwei Reihen hat ein Präfix, welches ein LCS von Präfixen der Reihen ist Jeder Präfix eines LCS von zwei Reihen ist ein LCS von Präfixen der Reihen => Das Problem erfüllt das Kriterium der optimalen Substruktur 24
Rekursive Formulierung Idee Berechne zuerst nur Länge der LCS Rekonstruiere nachher die LCS selbst Sei c[i,j] Länge LCS von X und Y Gesucht c[m,n] 25
Rekursive Formulierung Worst-case: x[i]=y[i] Evaluiere zwei Teilprobleme, je nur ein Parameter dekrementiert 26
Rekursionsbaum 27
Überlappende Unterprobleme Rekursive Lösung enthält eine kleine Anzahl verschiedener Unterprobleme, die wiederholt gelöst werden Anzahl verschiedener Unterprobleme für das LCS Problem mit Reihen der Länge m und n ist nur mn Dynamisches Programmieren stützt sich auf optimale Substruktur und überlappende Unterprobleme 28
Memoisierung Speichere Lösung von Teilproblemen in einer Tabelle Bei wiederholten Aufrufen des Teilproblems, lese Lösung aus Tabelle 29
Memoisierung Speichere Lösung von Teilproblemen in einer Tabelle c[ij] c[i,j] Bei wiederholten Aufrufen des Teilproblems, lese Lösung aus Tabelle Wie vorher! Aufwand Θ(mn) (Zeit und Platz) 30
Beispiel s a p a n k i n g a m p u t a t i o n 31
Rekonstruktion der LCS Jeder Eintrag c[i,j] hängt nur von drei anderen Einträgen c[i-1,j-1], 1 1] c[i-1,j], 1 und c[i,j-1] ab Gegeben c[ij] c[i,j], können in konstanter Zeit bestimmen, welcher vorhergehende Eintrag zur Berechnung verwendet wurde 32
Übersicht Dynamische Programmierung Einführung Ablaufkoordination von Montagebändern Längste gemeinsame Teilsequenz Optimale binäre Suchbäume Eigenschaften der dynammischen Programmierung 33
Optimale binäre Suchbäume Gegeben Sequenz K=<k 1,k 2,..,k n > von Schlüsseln, sortiert nach k 1 <k 2 <... Wahrscheinlichkeit p i für Suche nach k i Problem: konstruiere binären Suchbaum mit minimalem erwartetem Aufwand für Suche Anwendung: Wörterbuch für automatische Übersetzungen Worthäufigkeiten bekannt 34
Erwartete Suchkosten Tatsächliche Kosten = #untersuchter Knoten Für k i, Kosten = depth(k i)+1 Erwartete Kosten 35
Beispiel 36
Beobachtungen Optimaler BST hat nicht unbedingt kleinste Höhe hat nicht unbedingt Schlüssel mit grösster Suchwahrscheinlichkeit an der Wurzel Naive Konstruktion Teste alle Möglichkeiten Aufwand exponentiell 37
Optimale Teilstruktur Gegeben ein optimaler BST T mit Teilbaum T Behauptung: Falls T ein optimaler BST ist, muss T auch optimal sein Beweis durch Widerspruch Falls T nicht optimal wäre, könnten wir ihn durch einen optimalen Teilbaum T ersetzen Dies würde die Gesamtkosten von T reduzieren, und somit wäre T nicht optimal 38
Teilprobleme Problem : gegeben Schlüssel k i,..,k j Sei k r Wurzel von k i,..,k j Teilprobleme Linker Teilbaum k i,..,k r-1 < k r Rechter Teilbaum k r+1,..,k j >k r Mögliche Lösung Für jedes Problem k i,..,k j, untersuche alle möglichen Wurzeln Bestimme jeweils optimale BST für linke und rechte Teilbäume 39
Rekursive Lösung Sei e[i,j] = erwartete Suchkosten für k i,..,k j Falls j=i-1, dann e[i,j]=0 Sei k r Wurzel für optimalen BST von k i,..,k j wobei Beachte Somit Rekursionsgleichung 40
Dynamische Programmierung Berechne Tabellen e[i,j] erwartete Kosten w[i,j] [ Wahrscheinlichkeit für Suche root[i,j] Wurzel Bottom-up Strategie, drei Schleifen Über alle Teilbäume mit l=i-j Schlüsseln, beginnend bei l=1 Über alle Teilbäume [i,j] der Grösse l Über alle möglichen Wurzeln jedes Teilbaums» Evaluiere Kosten, berechne Tabelleneinträge 41
Dynamische Programmierung 42
Beispiel 43
Rekonstruktion der Lösung Mittels einfachem rekursivem Algorithmus aus der root Tabelle Übung 44
Übersicht Dynamische Programmierung Einführung Ablaufkoordination von Montagebändern Längste gemeinsame Teilsequenz Optimale binäre Suchbäume Eigenschaften der dynammischen Programmierung 45
Dynamische Programmierung Optimale Teilstruktur Überlappende Teilprobleme Memoisierung Rekonstruktion der optimalen Lösung 46
Optimale Substruktur Optimale Lösung eines Problems beinhaltet optimale Lösungen von Teilproblemen Rezept um zu zeigen, dass Problem Eigenschaft der optimalen Substruktur besitzt 1. Zeige, dass Problem gelöst werden kann, indem Teilprobleme ausgewählt werden können (Annahme, dass Teilprobleme bekannt sind, welche Teil der optimalen Lösung sind) 2. Zeige, dass Lösung der Teilprobleme optimal sein muss, um Optimale Lösung des Problems zu erhalten 47
Optimale Substruktur Wieviele Teilprobleme werden in einer optimalen Lösung benutzt? Wieviele Kandidaten für Teilprobleme gibt es? Fliessbänder 1 Teilproblem (um eins kürzeres Band) 2 Kandidaten (Teilproblem das auf Band 1 oder 2 endet) LCS 1 Teilproblem (LCS für Reihen, wo mindestens eine um eins kürzer ist) 1 oder 2 Kandidaten (welche Reihe wird um eins gekürzt) 48
Optimale Substruktur Dynamisches Programmieren verwendet optimale Teilstruktur bottom up Zuerst: finde Lösungen zu Teilproblemen Dann: wähle welche Teilprobleme zur optimalen Lösung des Problems gehören e Greedy Algorithmen arbeiten top down Nächstes Mal Nicht alle Optimierungsprobleme haben Eigenschaft der optimalen Substruktur! 49
Überlappende Teilprobleme Treten auf, wenn rekursiver Algorithmus dasselbe Problem mehrmals löst Effiziente Teile-und-beherrsche Algorithmen generieren ein neues Teilproblem in jedem Aufruf (Merge Sort, Quicksort) 50
Memoisierung Varianteder Reihenfolge, in welcher die Tabelle mit Lösung von Teilproblemen gefüllt wird Bevorzugter Ansatz im dynamischen Programmieren: bottom-up Berechnung der Teilprobleme ohne Rekursion Memoisierung Verwende Rekursiven Algorithmus Speichere Lösung von Teilproblemen in Tabelle Verfolge Rekursion nur dann weiter, wenn Lösung des Teilproblems in Tabelle noch nicht gespeichert LCS Problem Buch hat bottom up Algorithmus ohne Memoisierung 51
Nächstes Mal Greedy Algorithmen 52