Zum Inhalt springen

Informatik · Klasse 11–13 · aktualisiert

Dynamische Programmierung einfach erklärt

Du erkennst, wann dynamische Programmierung passt, baust Fibonacci-Zahlen aus Teilproblemen auf und siehst, warum Greedy nicht immer optimal ist.

0 von 12 Aufgaben gelöst

Dynamische Programmierung einfach erklärt

Kurz gesagt

Dynamische Programmierung löst ein Optimierungsproblem, indem sie es in Teilprobleme zerlegt und Zwischenergebnisse speichert. Man startet bei den kleinsten Teilproblemen und setzt größere daraus zusammen. Greedy wählt dagegen nur den jetzt besten Schritt und findet oft nur ein lokales Optimum.

Ein Programm rechnet dieselbe kleine Aufgabe oft immer wieder neu aus. Schon bei den Fibonacci-Zahlen sind das sehr viele Wiederholungen: Bei einer einfachen rekursiven Variante wären es für n = 43 über 1,4 Milliarden Aufrufe. Dynamische Programmierung vermeidet diese Wiederholungen. Außerdem lernst du, warum die „gierige“ Methode nicht immer die beste Lösung findet.

Deine Lernziele

Hake ab, was du schon kannst. Löst du alle Aufgaben eines Abschnitts, hakt Mela das Ziel für dich ab.

4 Abschnitte

Dynamische Programmierung ist eine Methode für Optimierungsprobleme. Bei einem Optimierungsproblem suchst du die beste Lösung. Die Methode teilt das Problem in Teilprobleme auf und speichert Zwischenresultate systematisch.

Sie kann erfolgreich eingesetzt werden, wenn zwei Dinge zusammenkommen: Das Problem besteht aus vielen gleichartigen Teilproblemen. Und eine optimale Lösung des Problems setzt sich aus optimalen Lösungen der Teilprobleme zusammen. Das nennt man Optimalitätsprinzip von Bellman. Es gilt bei einigen Optimierungsproblemen, nicht bei allen.

Dann rechnest du zuerst die kleinsten Teilprobleme direkt aus und setzt daraus nächstgrößere zusammen, bis das ursprüngliche Problem gelöst ist. Einmal berechnete Teilergebnisse stehen in einer Tabelle. Kommt ein gleichartiges Teilproblem noch einmal vor, nutzt du die gespeicherte Lösung, statt sie neu zu berechnen. Das senkt die Laufzeit.

Definition

Optimalitätsprinzip von Bellman

Bei einigen Optimierungsproblemen setzt sich jede Optimallösung aus optimalen Teillösungen zusammen. Auf diesem Prinzip basieren Algorithmen der dynamischen Programmierung.

Beispiel: Kürzester Weg im Straßennetz

  1. 1Ein Straßennetz hat die Städte A, B, X und Y.
  2. 2Der kürzeste Weg P von A nach B führt durch X und Y.
  3. 3Dann muss P zwischen X und Y auch einen kürzesten Teilweg verwenden.
  4. 4Sonst könnte man P mit einem kürzeren Teilweg verkürzen. Dann wäre P kein kürzester Weg gewesen.

Merke: Dynamische Programmierung kann erfolgreich eingesetzt werden, wenn ein Optimierungsproblem aus vielen gleichartigen Teilproblemen besteht und sich eine optimale Lösung aus optimalen Teillösungen zusammensetzt.

Teste dich

LeichtWelche Eigenschaft sollte ein Optimierungsproblem haben, damit dynamische Programmierung erfolgreich einsetzbar ist?

Alles auf einen Blick

Dynamische Programmierung

  • Passende Probleme

    Viele gleichartige Teilprobleme, und eine optimale Lösung setzt sich aus optimalen Teillösungen zusammen.

  • Fibonacci

    F₀ = 0 und F₁ = 1 sind direkt bekannt, danach gilt Fₙ = Fₙ₋₁ + Fₙ₋₂.

  • Speichern

    Einmal berechnete Teilergebnisse werden gespeichert und wiederverwendet.

  • Memoisierung

    Die Vorgehensweise bleibt, Rückgabewerte werden zwischengespeichert.

  • Aufbauen

    Von den kleinsten Teilproblemen aufwärts, jede Berechnung nur einmal.

  • Greedy

    Wählt das jetzt beste Ergebnis, nimmt nichts zurück und findet oft nur ein lokales Optimum.

Musteraufgabe · Schritt für Schritt

F₈ von unten aufbauen

  1. 1Gegeben: F₀ = 0, F₁ = 1 und Fₙ = Fₙ₋₁ + Fₙ₋₂ für n ≥ 2. Gesucht: F₈.
  2. 2Direkt bekannt sind die kleinsten Teilprobleme F₀ = 0 und F₁ = 1.
  3. 3F₂ = 1 + 0 = 1 · F₃ = 1 + 1 = 2 · F₄ = 2 + 1 = 3
  4. 4F₅ = 3 + 2 = 5 · F₆ = 5 + 3 = 8 · F₇ = 8 + 5 = 13
  5. 5F₈ = 13 + 8 = 21
  6. 6Jeder Wert wurde nur einmal berechnet, immer aus den beiden letzten Werten.

Fehler finden

Prüfe die Aussagen zu Memoisierung und Aufbauen von unten In einer Zeile steckt ein Fehler. Tippe sie an.

Lückentext

Wähl in jeder Lücke das passende Wort und prüf dann deine Antworten.

In der dynamischen Programmierung werden zuerst die Teilprobleme direkt berechnet. Die behält die ursprüngliche Vorgehensweise des Verfahrens bei. Ein Greedy-Algorithmus findet bei vielen Problemen nur ein Optimum.

Karteikasten

Erst selbst überlegen, dann umdrehen.

Übung mit Feedback

Abschluss-Check: Dynamische Programmierung

LeichtWas bringt es in der dynamischen Programmierung, einmal berechnete Teilergebnisse in einer Tabelle zu speichern?
MittelWelche Funktion kann man memoisieren?
SchwerWelche Aussage über Greedy-Algorithmen stimmt?

Weiterlesen in Informatik