Optimierung Algorithmik III Algorithmen und Modelle für kontinuierliche Datenstrukturen Optimierung I Dynamisches Programmieren Günther Greiner Lehrstuhl für Graphische Datenverarbeitung Sommersemester 8 G. Greiner, U. Rüde FAU Erlangen-Nürnberg Optimierung ist ein Grundproblem der Informatik Diskrete Optimierung Diskrete Variablen (z.b. binär, ganzzahlig) Endlich viele Zustände zu durchsuchen Enge Beziehungen zu diskreten Strukturen, wie Bäumen, Graphen, Kontinuierliche Optimierung Kontinuierliche Variablen Unbeschränkte vs. Optimierung mit Nebenbedingungen Enge Verwandtschaft zur Nullstellensuche Bei dynamischen Systemen: Optimalsteuerung - Bezüge zur Regelungstechnik G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg Diskrete Optimierung: Dynamisches Programmieren Im Gegensatz zu Divide-and-Conquer eine Bottom-Up- Methode Idee - um ein Problem der Größe n zu optimieren: Erstelle eine Tabelle, in der alle relevanten Probleme der Größe,,,..., n- gelöst werden Greife auf diese Teil-Lösungen zurück um das Größe-n-Problem zu optimieren. Oft eingesetzt zur Optimierung Wenn Lösungen aus kleineren Teil-Lösungen zusammengesetzt Name ist historisch bedingt -- heißt eigentlich nichts anderes als tabellenbasierter Algorithmus. Rekursion mit Memorieren der Teillösungen Vermeidung von Mehrfachberechnungen Vorgehen: Dynamische Programmierung Charakterisiere den Lösungsraum Definiere rekursiv, wie sich eine optimale Lösung aus kleineren zusammensetzt Konzipiere den Algorithmus bottom-up, so dass tabellarisch optimale Teillösungen für aufsteigende Problemgrößen gefunden werden Dabei wird jeweils auf die schon existierenden Teillösungen zurückgegriffen. Wir studieren das Verfahren der dynamischen Programmierung anhand von Beispielen. Als erstes kommen wir zum Problem der Matrix-Kettenmultiplikation zurück. G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg
Matrizen-Kettenmultiplikation Beispiel zum Dynamischen Programmieren: Matrizen-Kettenmultiplikation Gegeben seien n Matrizen M, M,..., M n, die miteinander multipliziert werden sollen Dimensionen unterschiedlich: M : p p, M : p p,..., M n : p n- p n Aufwand für eine Multiplikation einer p q mit einer q r Matrix ist p q r (Mult+Add). Gesamtaufwand hängt stark von der assoziativen Klammerung ab: Beispiel: M :, M :, M : (M M ) M kostet + = Operationen M (M M ) kostet + = Operationen G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg Matrizen-Kettenmultiplikation Naiver Algorithmus: Durchprobieren aller Klammerungen Wie viele Möglichkeiten gibt es, ein Produkt mit n Faktoren zu klammern? Die Anzahl ist durch die Catalanschen Zahlen C n gegeben. Die Folge beginnt mit den Zahlen,,,,,, 9,, 8, 79,... Catalansche Zahlen Anzahl der Triangulierungen eines konvexen Polygons C = C = Herleitung siehe z.b. U. Schöning: Algorithmik, Spektrum Verlag,. Durchprobieren hat exponentielle Komplexität - ist also für größere n ungeeignet. C = G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 7 G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 8
Matrizen-Kettenmultiplikation Definiere m(i,j) - die minimale Zahl von Multiplikationen, mit der man bei optimaler Klammerung das Teilprodukt M i... M j mit der Dimensionsfolge p i-, p i,..., p j berechnen kann. Es gilt m(i,i) =. Nehmen wir an, die optimale (äußere) Klammerung des Produkts M i... M j sei (M i... M k ) (M k+... M j ) mit i k < j. Es gilt dann m(i, j) = min (m(i, k) + m(k+, j) + p i- p k p j : i k<j ) Optimaler Aufwand: Rekursionsformel Im Algorithmus verwenden wir deshalb eine Tabelle (d.h einen D- array) m(i,j), von dem allerdings nur das obere Dreieck benötigt wird. Algorithmus errechnet die Tabellenwerte (i, j) in der Reihenfolge j-i =,,,..., n- und unter Verwendung der bereits errechneten Tabelleneinträge. G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 9 G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg Algorithmus for i=,..., n: m[i,i]= for r=,..., n-: for i=,..., n-r: j= i+r m[i,j] = for k= i,..., j-: q= m[i,k] + m[k+,j] + p[i-]*p[k]*p[j] if q < m [i,j] then m[i,j]= q Am Ende steht in m[,n] die optimale Anzahl an Operationen Die optimale Klammerung kann man bestimmen, in dem man sich bei jedem Tabelleneintrag zusätzlich merkt, für welches k das Minimum zu Stande kam. Algorithmus for i=..n: m[i,i]= for r=..n-: for i=..n-r: j= i+r r= r= r= r=n- m[i,j] = for k= i..j-: q= m[i,k] + m[k+,j] + p[i-i]*p[k]*p[j] if q < m [i,j] then m[i,j]= q m ij = min(m ik +m k+j +p i- *p k *p j i<=k<j) i= n-r G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg
Algorithmus for i=..n: m[i,i]= for r=..n-: for i=..n-r: j= i+r m[i,j] = for k= i..j-: q= m[i,k] + m[k+,j] + p[i-i]*p[k]*p[j] if q < m [i,j] then m[i,j]= q m ij = min(m ik +m k+j +p i- *p k *p j i<=k<j) r= r= Algorithmus for i=..n: m[i,i]= for r=..n-: for i=..n-r: j= i+r r= r= r= m ij = min(m ik +m k+j +p i- *p k *p j i<=k<j) r= r= G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg Beispiel Matrizenmultiplikation M : x M : x M : x M : x M : x (p i )= (,,,,, ) 7 8 7 7 G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 7 m Komplexität Aufwand = O((Größe der Tabelle) (Aufwand pro Eintrag)). Hier konkret: O(n n) = O(n ) Vergleich mit dem Aufwand, wenn man die Rekursionsformel direkt in einen Divide-et-Impera-Algorithmus umsetzt: Proc mat(i,j) if i=j then return else r= for k=i to j- q= mat(i,k) + mat(k+,j) + p i- * p k * p j if q < r then r= q return r Hier werden innerhalb der Rekursion wiederholt die gleichen Optimierungsprobleme gelöst, deshalb wächst der Aufwand exponentiell. G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 8
Traveling Sales Person (TSP) Beispiel zum Dynamischen Programmieren: Traveling Salesperson Das Problem des Handlungsreisenden: Ein berühmtes NP-vollständiges Problem der Informatik Problem: Finde die optimale Rundreise durch n gegebene Städte, so dass jede Stadt genau einmal besucht wird, und die zurückgelegte Strecke (oder Kosten, oder Zeit) minimal wird. Entfernungstabelle m i,j ist Nicht notwendig symmetrisch, Erfüllt nicht unbedingt die Dreiecksungleichung, Kann Einträge von haben. Gesucht also eine Permutation G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 9 G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg Traveling Sales Person (TSP) Es kann (wegen der -Einträge) durchaus vorkommen, dass keine Lösung existiert. Ein naiver Algorithmus würde alle Permutationen durchspielen, also Komplexität O(n!) - also sehr schnell exponentiell wachsend. Da es ein NP-vollständiges Problem ist, können wir nicht erwarten, dass wir (wie bei der Kettenmultiplikation) einen polynomialen Algorithmus finden. Trotzdem kann man den naiven Algorithmus mit Hilfe der dynamischen Programmierung wesentlich verbessern. TSP - Beispiellösung zufällig plazierte Städte im Einheitsquadrat. Kostenfunktion: Euklidische Entfernung Lösung mit heuristischem Verfahren bestimmt. Optimalität nicht sichergestellt G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg
Dynamische Programmierung für das TSP-Problem Grundidee: Wenn eine optimale Rundreise (obda) bei Stadt beginnt und dann die Stadt k besucht, dann muss der Weg von k zurück nach durch die Städte {,..., n} - {k} ebenfalls optimal sein. Deshalb sei g(i,s) die Länge des kürzesten Weges, der bei der Stadt i beginnt, dann durch jede Stadt der Menge S genau einmal geht, um dann bei Stadt zu enden. Dynamische Programmierung für das TSP-Problem for i=,..., n do: g[i, ] = m i, for k=,..., n-: for S, S =k, S: for i {,..., n} \ S: Berechne g[i,s] nach obiger Formel. Berechne g[,{,..., n}] nach obiger Formel. G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg TSP Beispiel () TSP Beispiel () Hannover Berlin Frankfurt Nürnberg München G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 8
TSP Beispiel () TSP Beispiel () G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 9 G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg Dynamische Programmierung für das TSP-Problem Komplexität = O((Größe Tabelle) (Aufwand pro Eintrag)). Hier konkret: O(n n n) = O(n n ) Der Aufwand ist immer noch exponentiell (darüber sollten wir uns nicht wundern), aber weniger schnell anwachsend exponentiell als im naiven Algorithmus Die optimale Tour erhält man, wenn man mitverfolgt, über welche Minimumsbildung die Tabelle aufgebaut wurde. Man beachte, wie der Aufwand mit größeren n wächst. Beispiel zum Dynamischen Programmieren: Rucksackproblem G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg
Das /-Rucksackproblem Eingabe: n+ Zahlen: v,..., v n : Wert von n Objekten g,..., g n : Gewicht der n Objekte G: Größe des Rucksacks Gesucht: ein Vektor (a,..., a n ) aus -en und -en, so dass Dynamische Programmierung: Rucksackproblem Wenn der Rucksack der Größe G mit einer Auswahl I {,..., n} optimal gepackt ist, so gilt für jedes i I, dass ein (G-g i )-großer Rucksack optimal mit einer Auswahl aus den Objekten {,,..., n}-{i} gepackt ist, wenn man die Auswahl I-{i} annimmt. Sei w(i,h) der optimale Wert beim Packen eines Rucksacks h G mit einer Auswahl der Objekte,..., i; i n, also Wir suchen nach einem Optimalitätsprinzip, das uns einen Ansatz mit dynamischer Programmierung erlaubt G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg Algorithmus für das Rucksackproblem Beispiel - Rucksackproblem Reihenfolge g ν oder for i=,..., n: for h=,..., G: Berechne w[i,h] nach obiger Formel Die optimale Auswahl ergibt sich wiederum daraus, welcher Fall bei der Berechnung der w[n,g] jeweils aufgetreten ist. Komplexität = O((Größe der Tabelle) (Aufwand pro Eintrag)). Hier konkret: O(n G) O() = O(nG) 7 8 9 8 G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 7
Beispiel - Rucksackproblem Zusammenfassung: Dynamische Programmierung g ν Dynamische Programmierung ist ein nützliches Prinzip um diskrete Optimierungsprobleme zu lösen 7 8 9 Grundprinzip: Rekursion bottom-up Memorieren, d.h. Speichern der Zwischenergebnisse in einer Tabelle Implementierung: Bottom-up-Aufbau der Tabelle. G= :, g = ν = G=7 :,, g = 7 ν = G= :,,, g = 8 ν = G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 8 G. Greiner, U. Rüde Algorithmik III, Sommer 8 FAU Erlangen-Nürnberg 9