kap09_text

Werbung
9
DYNAMISCHE PROGRAMMIERUNG (TABELLIERUNG)
9
91
Dynamische Programmierung (Tabellierung)
9.1
Grundlagen
. Rekursionen mit sich uberlappenden Teilaufgaben werden ezienter durch systematisches Durchlaufen
der Teilaufgaben und Tabellierung ihrer Losungen ausgewertet, um wiederholte Berechnungen zu vermeiden.
Prinzip
Die Tabellen konnen statisch (fester Indexbereich, z.B. Feld) oder dynamisch (listenartig) organisiert sein.
Probleme bei letzterem Vorgehen sind die eziente Ansteuerung der bereits gelosten Teilaufgaben bzw. die
Prufung, ob eine Teilaufgabe schon gelost wurde.
Beispiel 9.1.1 (Die Fibonacci-Folge) Um b (n) zu berechnen, berechne der Reihe nach b (0), b (1), b (2)
usw.
• Hier ist wegen der Rekurrenz auf nur zwei Werte gar nicht eine volle Tabelle fib[n+1] n
otig; es reichen
zwei Variablen, die je b (i − 2) und b (i − 1) enthalten.
• Werden dagegen viele b -Werte ben
otigt, so kann sich das Anlegen der vollen Tabelle lohnen.
t
u
9.2
Alle kürzesten Wege
Ein kantenmarkierter Graph mit Knotenmenge [0, n − 1], dargestellt durch die Adjazenzmatrix
fur ij ∈/ E).
Gegeben:
G
A
A[i][j] = g(i, j) , A[i][i] = 0 , A[i][j] = ∞
(also
Gesucht:
Alle Distanzen d(i, j) mit i, j ∈ V .
Mit n-maliger Anwendung des Dijkstra-Algorithmus kann man das in O(n3) erreichen.
• Damit ist aber einiger Organisationsaufwand verbunden. Geht es auch direkter?
Dijkstras Algorithmus kennt in jedem Iterationsschritt die Lange von KW, die nur durch Knoten in der Menge
OK laufen.
U berschreibt man diese Information nicht, sondern tabelliert sie, so erhalt man den Algorithmus von Floyd.
• Idee (∗): Tabelliere in Dk [i][j] die Lange eines KW von i nach 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] = ∅).
Betrachte nun einen KW fur Dk+1[i][j]:
• Sind alle Wege von i nach j u
ber den Knoten k langer als die bisherigen, so gilt Dk+1[i, j] = Dk[i][j].
• Andernfalls setzt sich ein KW u
ber k zusammen aus KW von i nach k und k nach j. Dann gilt
•
In Schleifenform:
Dk+1 [i][j] = Dk [i][k] + Dk [k][j]
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]) ;
Kann man Teile der Dk zusammenlegen?
• Dk+1 hangt nur von Dk ab und nicht von fr
uheren Dl mit l < k.
• Daher gen
ugen zwei Matrizen fur die verschiedenen D-Versionen.
9
92
DYNAMISCHE PROGRAMMIERUNG (TABELLIERUNG)
•
•
•
•
Genauere Analyse: Alle Wege, die zur Bestimmung von Dk+1[i][k] dienen, enthalten den Knoten k nicht
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].
Zur Berechnung von Dk+1[i][j] braucht man also Dk[i][j] aus der vorigen Iteration (und Dk[i][j] wird nur
an dieser Stelle gebraucht) und zwei Werte, fur die Dk und Dk+1 ubereinstimmen.
Damit kann der U bergang von Dk zu Dk+1 am Platz geschehen; man benotigt somit nur eine Matrix fur
D.
9.2.1
Implementierung
Der Matrixeintrag path[i][j] gibt zu i,j einen Zwischenknoten auf einem KW von i nach j an.
Der vollstandige Weg ergibt sich durch rekursives Verfolgen der Teilwege von i zum Zwischenknoten und von
dort nach j.
for (i = 0 ; i < n ; i++)
for (j = 1 ; j < n ; j++)
{ 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++)
if (D[i][k] + D[k][j] < D[i][j])
{ D[i][j] = D[i][k] + D[k][j] ;
path[i][j] = k ;
}
Floyds Algorithmus funktioniert auch fur gerichtete Graphen; dort auch fur negative Kantengewichte, wenn keine (gerichteten) Kreise mit negativem Gesamtgewicht existieren.
Bemerkung 9.2.1
Fur jeden Wert von k sind alle Zuweisungen in Floyds Algorithmus von einander unabhangig und konnen parallel ausgefuhrt werden.
Bemerkung 9.2.2
9.2.2
Existenz von Wegen
Oft sind die exakten Weglangen gar nicht erheblich; es genugt die Aussage, ob zwei Knoten verbunden sind
oder nicht.
• Diese Information kann in einer Booleschen 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 nach j
Verfahren bei Hinzunahme von k. Ein Weg von i nach j in [0, k] existiert, wenn
• ein solcher schon in [0, k − 1] existiert oder
• andernfalls ein Weg von i nach k und einer von k nach j in [0, k − 1] existieren.
• Zusammen:
D
[i, j] = D [i, j] ∨ (D [i, k] ∧ D [k, j])
k+1
k
k
k
9
93
DYNAMISCHE PROGRAMMIERUNG (TABELLIERUNG)
•
Auf 0/1-wertigen Matrizen:
max(Dk[i, j], min(Dk[i, k], Dk[k, j]))
Dieses Verfahren heit Algorithmus von Warshall.
Dk+1 [i, j] =
Allgemeiner Hintergrund: Kleene-Algebren bzw. vollstandige Halbringe, Erreichbarkeit entspricht der ∗-Bildung.
9.3
Multiplikation mehrerer Matrizen
Sei A eine p × q-Matrix, B eine q × r-Matrix und C eine r × s-Matrix.
Zu berechnen: A B C, als (A B) C oder A (B C).
Was ist gunstiger?
Beispiel 9.3.1 Seien p = 6, q = 10, r = 9, s = 2. F
ur die Multiplikation einer p × q-Matrix mit einer
q × r-Matrix im naiven Verfahren sind p q r Skalarmultiplikationen n
otig. Also:
• F
ur A B braucht man 540 Multiplikationen; es entsteht eine 6 × 9-Matrix. Fur (A B) C braucht man
nochmals 108 Multiplikationen. Summe: 648 Multiplikationen.
• F
ur B C sind 180 Multiplikationen notig. Es ergibt sich eine 10 × 2-Matrix; Bilden von A (B C) braucht
nochmals 120 Multiplikationen. Insgesamt sind bei dieser Klammerung nur 300 Multiplikationen erforderlich.
t
u
Damit ist die Klammerung A (B C) wesentlich ezienter.
9.3.1
Aufgabenstellung
Finde eine optimale Klammerung zur Berechnung von A1 A2 · · · An.
• Jede Klammerung f
uhrt auf eine Gruppierung (A1 · · · Ai) (Ai+1 · · · An) mit i ∈ {1, n}.
• Ist sie optimal, so m
ussen auch die Klammerungen von A1 · · · Ai und Ai+1 · · · An darin optimal sein.
• F
ur die Anzahl k(n) der moglichen Klammerungen gilt k(1) = 1 und
k(n) =
n−1
X
k(i) k(n − i) .
i=1
•
•
•
•
2n
1
Dies sind die sog. Catalanschen Zahlen k(n) = n−1
n .
Sie wachsen exponentiell mit n. Also sollte man nicht alle Klammerungsmoglichkeiten untersuchen.
Die Teilaufgaben sind aber gleichartig, namlich: Klammere Produkte der Art Ai · · · Aj optimal.
Es gibt nur n2 (n − 1) solche Teilaufgaben.
9.3.2
Detaillierung
Gegeben: 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.
Die Minimalzahl M von Skalarmultiplikationen fur das Produkt A1
trixmultiplikation.
Gesucht:
Lösung:
Sei Mij die Minimalzahl fur Ai · · · Aj.
· · · An
bei gewohnlicher Ma-
9
DYNAMISCHE PROGRAMMIERUNG (TABELLIERUNG)
•
Dann ist M = M1n. Es gilt
min
Fur die dabei benotigten M-Werte gilt
Mij =
•
94
i≤k<j
(Mik + M(k+1),j + ci−1 ck cj )
k − i, j − (k + 1) < j − i
•
•
•
9.4
Werte Mij geordnet nach der Groe von j − i tabellieren, beginnend mit
Deswegen kann man die
den Mii = 0.
Es werden also Θ(n2) Werte mit Aufwand je O(n) berechnet, d.h. der Gesamtaufwand liegt in O(n3).
Es gibt auch eine Losung in O(n log n), allerdings wird der Aufwand fur die eigentliche Matrixmultiplikation O(n3) ohnehin ubersteigen.
n
2 (n − 1)
Schlussbemerkungen
Die Tabellierungen werden je nach Bedarf gespeichert oder geloscht.
Weitere Beispiele, die sich mit der Tabellierungstechnik gut losen lassen, sind
• Pascal'sches Dreieck zur Berechnung der Binomialkoezienten
• Aitken-Neville-Schema
• Cocke-Kasami-Younger-Algorithmus zur Syntaxaynalyse bei kontextfreien Grammatiken bzw. Syntaxdiagrammen.
Herunterladen