Dynamische Programmierung

Werbung
Dynamische Programmierung
Basierend auf dem Bellmansches Optimalitätsprinzip:
„Optimale Teillösungen bilden eine optimale Lösung.“
LgT
Geg.: Wörter a, b
Ges.: Längste gemeinsame Teilfolge LgT(a, b)
Idee:
C(i, j) ≡ LgT(a1…ai, b1…bj) sei bekannt
C (i, 0) = C (0, j) = 0
falls a i = b j
C (i - 1, j - 1) + 1
C (i, j) = 
max{ C (i - 1, j), C (i, j - 1) } falls a i ≠ b j
KgO
Geg.: Wörter a, b
Ges.: Kürzeste gemeinsame Oberfolge KgO(a, b)
Idee:
C(i, j) ≡ KgO(a1…ai, b1…bj) sei bekannt
C (i, 0) = i
C (0, j) = j
falls a i = b j
C (i - 1, j - 1) + 1
C (i, j) = 
min{ C (i - 1, j) + 1, C (i, j - 1) + 1} falls a i ≠ b j
Editierdistanz
Geg.: Wörter a, b
Ges.: Geringste Anzahl Operationen (Löschen, Einfügen, Umbenennen) zur Überführung
von Wort a nach b (= Maß für die Ähnlichkeit von a und b)
Idee:
C(i, j) ≡ Edd(a1…ai, b1…bj) sei bekannt
C(i-1, j-1) - Umbenennen von ai nach bj
C(i-1, j) - Löschen von ai
C(i, j-1) - Einfügen von bj
C (i, 0) = i
C (0, j) = j
falls a i = b j
C (i - 1, j - 1)
C (i, j) = 
min{ C (i - 1, j - 1) + 1, C (i - 1, j) + 1, C (i, j - 1) + 1} falls a i ≠ b j
TSP
Geg.: Kostenmatrix K mit K(a, b) = Kosten der „Strecke“ a nach b
Ges.: Optimale (günstigste) Rundreise
Idee:
Optimaler Pfad Pn(i, V) der Länge n vom Knoten 1 zum Knoten i bekannt,
wobei ∀ v∈V gilt: v∉Pn
Pn(i, ∅) = K(i, 1)
Pn(i, V) = min{K(i, v) + Pn+1(v, V \ v) | ∀ v∈V }
schließen des Kreises
expandieren des Pfades
Iterierte Matrizenmultiplikation
Geg.: n Matrizen Ai ∈ Νi-1×i
Ges.: Berechnung von B = A1×A2×…×An durch minimale Anzahl Multiplikationen M
Idee:
Ai
Ai×Ai+1
Ai×Aj×Ak
mit 0 Multiplikationen berechenbar
mit (i-1) × i × (i+1) Multiplikationen berechenbar ( p i-1 ⋅ p i ⋅ p i +1 )
durch Ai×(Aj×Ak) oder (Ai×Aj)×Ak berechenbar …
0
falls i ≥ j
M (i, j) = 
min{M (i, k) + M (k + 1, j) + p i-1 ⋅ p k ⋅ p j | i ≤ k < j } falls i < j
Optimaler binärer Suchbaum
Geg.: Knoten ai und dazu gehörige Häufigkeiten bi (i = 1,…,n)
Ges.: Optimaler Suchbaum S mit minimalen Kosten c ~ Häufigkeiten × Tiefe ∀ Knoten ai
Idee:
C(i, j) ≡ S(ai…aj) sei minimaler Suchbaum welcher die Knoten ai bis aj enthält
0
falls i > j

C (i, j) =  j
∑ c n + min{C (i, k - 1), C (k + 1, j) | i ≤ k ≤ j } falls i ≤ j
 n =i
Herunterladen