12 Dynamische Programmierung
Literatur:
Siehe Kapitel 43 aus [Sed90] und Kapitel 3 aus aus
[Ski97]. Zu dynamischer Programmierung findet sich
auch in [CLR90] etwas, vor allem in
Kapitel 16, aber auch sonst "uber das Buch verteilt.
Inhalt
Probleml"osung durch Zergliederung ·Optimierungsprobleme ·Ansatz der dynamischen Programmierung ·Rekursiver Probleme mit
gemeinsamen Teilstrukturen ·Beispiel: lineares Partitionieren
·Beispiel: k"urzeste Pfade ·Anwendungsbereich von DB
Dynamische Programmierung
|
Speicher-- vs. Laufzeit: das Karnickelproblem
|
-
die n-te Fibonacci-Zahl Fn:24:
F0 = 0, F1 = 1, Fn+2 = Fn + Fn+1.
fib(n) = // fibonacci; naive, recursive solution
if n=0 then return 0
else if n=1 then return 1
else return fib(n-1) + fib(n-2)
fi fi
- Problem: exponentielle Laufzeit
- Bild: Aufrufbaum
- alternativ: Speichere alle Werte
Fi:25
fib(n) = // Fibonacci: speichere alle $F_i$
$F_0 = 0$; $F_1 = 1$;
for i = 1 to n do
$F_i = F_{i-1} + F_{i-2}$
done;
- Þ lineare Laufzeitkomplexit"at.
Dynamische Programmierung
|
-
Probleml"osung durch Zerteilen (wie D& C)
- D&C: getrennte Teilprobleme, hier "uberlappenden
Unterprobleme
- Þ Vermeidung von wiederholter Berechnung durch
Speichern von Zwischenl"osungen.
- meist bei Optimierungproblemen
-
Charakterisiere die Struktur der optimalen L"osung
- Definiere rekursiv die optimale L"osung
- Berechne den Wert der opt. L"osung
bottom-up
- ggf: berechne/rekonstruiere die opt. L"osung selbst.
|
-
Problem: ``gerechte'' Aufteilung der B"ucher eines Buchregals,
Loadbalancing wechsel
- gegeben: Sequenz S = (s1, s2,..., sn), si Î
, und nat"urliche Zahl k ³ 1
- gesucht: Partition der Sequenz in k
Teilsequenzen S1, S2, ..., Sk, wobei die maximale
Teilsequenzen-Summe minimal sei Þ Problem der
linearen Partitionierung
- verschiedene Heuristiken denkbar, aber: um sicher das Optimum
zu finden: exhaustive Suche
- Rekursiver Ansatz:26: M(n,k) sei das gesuchte Optimum. Bild
|
M(n,k) |
= |
|
M(1,k) |
= |
s1 f"ur k>0 |
M(n,1) |
= |
|
|
Linear Partitionieren (2)
|
-
Komplexit"at: direkt "uber Rekurrenzgleichungen:
exponentiell
- Speichern u. Wiederverwendung von Zwischenergebnisse:
-
Darstellung der Funktionswerte von M(n,k) als Matrix
M[n,k].
- Komplexit"at:
-
Anzahl der Eintr"age: k n
- Zeit pro Berechnung eines Eintrags:27 O(n2)
- Þ Zeitkomplexit"at:28O(k n3)
- Berechnung ``bottom-up'': Durchlaufen der Matrix, da"s
Matrixeintr"age immer bereits da sind, wenn gebraucht Þ
Schleifen von kleineren Indizes zu gr"o"seren.
Partition(S,k) = // linear Partitionieren
p[0] = 0; // P = Teilsummen
for i = 1 to n do
p[i] := p[i-1] + $S_i$
done; // Initialisierung der ``Raender''
for i = 1 to n do M[i,1] := p[i] done;
for j = 1 to k do M[1,j] := $s_1$ done;
for i = 2 to n
do
for j = 2 to k do
M[i,j] := $\infty$;
for x = 1 to i-1
do
s = max(M[x,j-1],p[i]-p[x]);
if M[i,j] > s
then M[i,j] = s; // glob. Minimum
D[i,j] = x // Zur Rekonstruktion
fi
done
done
done
February 5, 2002