kap09_4 - Informatik

Werbung
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
Herunterladen