Dynamische Programmierung 9 9.1 Dynamische Programmierung Dynamische Programmierung (Tabellierung) Grundlagen . Rekursionen mit sih uberlappenden Teilaufgaben werden eÆzienter durh systematishes Durhlaufen der Teilaufgaben und Tabellierung ihrer Losungen ausgewertet, um wiederholte Berehnungen zu vermeiden. Prinzip Teilaufgabe shon gelost wurde. Die Tabellen konnen statish (fester Indexbereih, z.B. Feld) oder dynamish (listenartig) organisiert sein. Probleme bei letzterem Vorgehen sind die eÆziente Ansteuerung der bereits gelosten Teilaufgaben bzw. die Prufung, ob eine c B. Möller {1{ Informatik III WS 2011/12 Dynamische Programmierung Informatik III WS 2011/12 Dynamische Programmierung 9.2 Um b (n) zu berehnen, berehne der Reihe nah b (0), b (1), b (2) usw. • Hier ist wegen der Rekurrenz auf nur zwei Werte gar niht eine volle Tabelle fib[n+1] notig; es reihen zwei Variablen, die je b (i − 2) und b (i − 1) enthalten. • Werden dagegen viele b -Werte benotigt, so kann sih das Anle⊓ ⊔ gen der vollen Tabelle lohnen. Beispiel 9.1.1 (Die Fibonacci-Folge) {3{ Informatik III WS 2011/12 Alle kürzesten Wege Ein kantenmarkierter Graph G mit Knotenmenge [0, n − 1], dargestellt durh die Adjazenzmatrix A (also A[i][j] = g(i, j) , A[i][i] = 0 , A[i][j] = ∞ f ur ij ∈/ E). Gegeben: Gesucht: • • c B. Möller {2{ c B. Möller Alle Distanzen d(i, j) mit i, j ∈ V . Mit n-maliger Anwendung des Dijkstra-Algorithmus kann man das in O(n3 ) erreihen. Damit ist aber einiger Organisationsaufwand verbunden. Geht es auh direkter? c B. Möller {4{ Informatik III WS 2011/12 Dynamische Programmierung Dynamische Programmierung Dijkstras Algorithmus kennt in jedem Iterationsshritt die Lange von KW, die nur durh Knoten in der Menge OK laufen. U bershreibt man diese Information niht, sondern tabelliert sie, so erhalt man den Algorithmus von Floyd. • Idee (∗): Tabelliere in Dk [i][j] die Lange eines KW von i nah j, der im Inneren, d.h. auer i und j selbst, nur Knoten in [0, k − 1] verwendet. • Damit ist D0 = A (denn [0, −1] = ∅). {5{ c B. Möller Informatik III WS 2011/12 Dynamische Programmierung Dk+1 [i][j] = Dk [i][k] + Dk [k][j] c B. Möller {6{ Informatik III WS 2011/12 Dynamische Programmierung In Shleifenform: D[0] = A ;\\ for (k = 0 ; k < n ; k++) for (i = 0 ; i < n ; i++) for (j = 0 ; j < n ; j++) D[k+1][i][j] = min(D[k][i][j], D[k][i][k]+D[k][k][j]) ; c B. Möller Betrahte nun einen KW fur Dk+1[i][j]: • Sind alle Wege von i nah j u ber den Knoten k langer als die bisherigen, so gilt Dk+1[i, j] = Dk[i][j]. • Andernfalls setzt sih ein KW u ber k zusammen aus KW von i nah k und k nah j. Dann gilt {7{ Informatik III WS 2011/12 Kann man Teile der Dk zusammenlegen? • Dk+1 hangt nur von Dk ab und niht von fr uheren Dl mit l < k. • Daher gen ugen zwei Matrizen fur die vershiedenen D-Versionen. • Genauere Analyse: Alle Wege, die zur Bestimmung von Dk+1 [i][k] dienen, enthalten den Knoten k niht im Inneren (sonst lage ein trivialer Weg bzw. gar kein Weg vor). • Also gilt wegen (∗) Dk+1 [i][k] = Dk [i][k] und Dk+1 [k][j] = Dk [k][j]. c B. Möller {8{ Informatik III WS 2011/12 Dynamische Programmierung Dynamische Programmierung 9.2.1 • • Zur Berehnung von Dk+1[i][j] brauht man also Dk[i][j] aus der vorigen Iteration (und Dk[i][j] wird nur an dieser Stelle gebrauht) und zwei Werte, fur die Dk und Dk+1 ubereinstimmen. Damit kann der U bergang von Dk zu Dk+1 am Platz geshehen; man benotigt somit nur eine Matrix fur D. Implementierung Der Matrixeintrag path[i][j] gibt zu i,j einen ehten Zwishenknoten auf einem KW von i nah j an. Existiert kein solher Knoten (weil die Kante ij bereits einen KW darstellt), wird ersatzweise −1 abgeliefert. Der vollstandige Weg ergibt sih durh rekursives Verfolgen der Teilwege von i zum Zwishenknoten und von dort nah j. {9{ c B. Möller Informatik III WS 2011/12 Dynamische Programmierung c B. Möller { 10 { Informatik III WS 2011/12 Dynamische Programmierung for (i = 0 ; i < n ; i++) for (j = 0 ; j < n ; j++) Floyds Algorithmus funktioniert auh fur gerihtete Graphen; dort auh fur negative Kantengewihte, wenn keine (gerihteten) Kreise mit negativem Gesamtgewiht existieren. Bemerkung 9.2.1 { D[i][j] = A[i][j] ; path[i][j] = -1 ; } ⊓ ⊔ for (k = 0 ; k < n ; k++) for (i = 0 ; i < n ; i++) for (j = 0 ; j < n ; j++) Fur jeden Wert von k sind alle Zuweisungen in Floyds Algorithmus von einander unabhangig und konnen parallel ausgefuhrt werden. ⊓ ⊔ Bemerkung 9.2.2 if (D[i][k] + D[k][j] < D[i][j]) { D[i][j] = D[i][k] + D[k][j] ; path[i][j] = k ; } c B. Möller { 11 { Informatik III WS 2011/12 c B. Möller { 12 { Informatik III WS 2011/12 Dynamische Programmierung Dynamische Programmierung Verfahren bei Hinzunahme von k . Ein Weg von i nah j in existiert, wenn ein solher shon in [0, k − 1] existiert oder andernfalls ein Weg von i nah k und einer von k nah j in [0, k−1] existieren. Zusammen: [0, k] 9.2.2 Existenz von Wegen • Oft sind die exakten Weglangen gar niht erheblih; es genugt die Aussage, ob zwei Knoten verbunden sind oder niht. • Diese Information kann in einer Booleshen Matrix gehalten werden. • Ersatzweise kann man ganzzahlige Matrizen mit den Eintragen 0 statt false und 1 statt true (oder umgekehrt) verwenden. • Die KW-Aufgabe wird dann zu einer Wege-Existenz-Aufgabe: D[i][j] = 1 ⇔ i 6= j ∧ ∃ Weg von i nah j c B. Möller { 13 { Informatik III WS 2011/12 Dynamische Programmierung • • Dk+1 [i, j] = Dk [i, j] ∨ (Dk [i, k] ∧ Dk [k, j]) Auf 0/1-wertigen Matrizen: Dk+1 [i, j] = max(Dk [i, j], min(Dk [i, k], Dk [k, j])) Dieses Verfahren heit Algorithmus von Warshall. • Allgemeiner Hintergrund: Kleene-Algebren bzw. vollstandige Halbringe, Erreihbarkeit entspriht der ∗-Bildung. c B. Möller { 14 { Informatik III WS 2011/12 Dynamische Programmierung Seien p = 6, q = 10, r = 9, s = 2. Fur die Multiplikation einer p × q-Matrix mit einer q × r-Matrix im naiven Verfahren sind p q r Skalarmultiplikationen notig. Also: • F ur A B brauht man 540 Multiplikationen; es entsteht eine 6×9Matrix. Fur (A B) C brauht man nohmals 108 Multiplikationen. Summe: 648 Multiplikationen. • F ur B C sind 180 Multiplikationen notig. Es ergibt sih eine 10×2Matrix; Bilden von A (B C) brauht nohmals 120 Multiplikationen. Insgesamt sind bei dieser Klammerung nur 300 Multiplikationen erforderlih. ⊓ ⊔ Beispiel 9.3.1 9.3 Multiplikation mehrerer Matrizen Sei A eine p × q-Matrix, B eine q × r-Matrix und C eine r × s-Matrix. Zu berehnen: A B C, als (A B) C oder A (B C). Was ist gunstiger? Damit ist die Klammerung A (B C) wesentlih eÆzienter. c B. Möller { 15 { Informatik III WS 2011/12 c B. Möller { 16 { Informatik III WS 2011/12 Dynamische Programmierung 9.3.1 Dynamische Programmierung Aufgabenstellung Finde eine optimale Klammerung zur Berehnung von A1 A2 · · · An . • Jede Klammerung fuhrt auf eine Gruppierung (A1 · · · Ai ) (Ai+1 · · · An ) mit i ∈ {1, n}. • Ist sie optimal, so m ussen auh die Klammerungen von A1 · · · Ai und Ai+1 · · · An darin optimal sein. • F ur die Anzahl k(n) der moglihen optimalen Klammerungen gilt k(1) = 1 und k(n) = n−1 X • • • • 2n 1 Dies sind die sog. Catalanshen Zahlen k(n) = n−1 n . Sie wahsen exponentiell mit n. Also sollte man niht alle Klammerungsmoglihkeiten untersuhen. Die Teilaufgaben sind aber gleihartig, namlih: Klammere Produkte der Art Ai · · · Aj optimal. Es gibt nur n2 (n − 1) solhe Teilaufgaben. k(i) k(n − i) . i=1 { 17 { c B. Möller Informatik III WS 2011/12 Dynamische Programmierung 9.3.2 c B. Möller { 18 { Informatik III WS 2011/12 Dynamische Programmierung Detaillierung Matrizen A1 · · · An mit Spaltenanzahlen c1 · · · cn. Damit das Produkt gebildet werden kann, mussen die Ai jeweils ci−1 Zeilen haben (i = 2 · · · n). A1 habe c0 Zeilen. Gegeben: Die Minimalzahl M von Skalarmultiplikationen fur das Produkt A1 · · · An bei gewohnliher Matrixmultiplikation. Gesucht: Sei Mij die Minimalzahl fur Ai · · · Aj. Dann ist M = M1n. Es gilt Mij = min (Mik + M(k+1),j + ci−1 ck cj ) i≤k<j Fur die dabei benotigten M-Werte gilt Lösung: • • • • • Deswegen kann man die n2 (n − 1) Werte Mij geordnet nah der Groe von j − i tabellieren, beginnend mit den Mii = 0. Es werden also Θ(n2 ) Werte mit Aufwand je O(n) berehnet, d.h. der Gesamtaufwand liegt in O(n3). Es gibt auh eine Losung in O(n log n), allerdings wird der Aufwand fur die eigentlihe Matrixmultiplikation O(n3 ) ohnehin ubersteigen. k − i, j − (k + 1) < j − i c B. Möller { 19 { Informatik III WS 2011/12 c B. Möller { 20 { Informatik III WS 2011/12 Dynamische Programmierung 9.4 Schlussbemerkungen Die Tabellierungen werden je nah Bedarf gespeihert oder gelosht. Weitere Beispiele, die sih mit der Tabellierungstehnik gut losen lassen, sind • Pasal'shes Dreiek zur Berehnung der BinomialkoeÆzienten n 0 =1= n n n+1 n n k+1 = k + k+1 • • Aitken-Neville-Shema zur Polynominterpolation Coke-Kasami-Younger-Algorithmus zur Syntaxanalyse bei kontextfreien Grammatiken bzw. Syntaxdiagrammen. c B. Möller { 21 { Informatik III WS 2011/12