Zum Inhalt springen

„Dynamische Programmierung“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Musterbeispiel: Nur zweimal.
 
(11 dazwischenliegende Versionen von 9 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
__NOTOC__
__NOTOC__
'''Dynamische Programmierung''' ist eine Methode zum [[Algorithmus|algorithmischen]] Lösen eines Optimierungsproblems durch Aufteilung in Teilprobleme und systematische Speicherung von Zwischenresultaten. Der Begriff wurde in den 1940er Jahren von dem amerikanischen Mathematiker [[Richard Bellman]] eingeführt, der diese Methode auf dem Gebiet der [[Regelungstheorie]] anwandte. In diesem Zusammenhang wird auch oft von ''Bellmans Prinzip der dynamischen Programmierung'' gesprochen.
'''Dynamische Programmierung''' ist eine Methode zum [[Algorithmus|algorithmischen]] Lösen eines Optimierungsproblems durch Aufteilung in Teilprobleme und systematische Speicherung von Zwischenresultaten. Der Begriff wurde in den 1950er Jahren von dem amerikanischen Mathematiker [[Richard Bellman]] eingeführt, der diese Methode auf dem Gebiet der [[Regelungstheorie]] anwandte. In diesem Zusammenhang wird auch oft von ''Bellmans Prinzip der dynamischen Programmierung'' gesprochen. Der Mathematiker Richard Bellman erfand in den 1950er Jahren bei der RAND Corporation, einem Think Tank der US Air Force, die Optimierungsmethode der Dynamischen Programmierung für ökonomische Modelle mit diskreter Zeitdimension<ref> Richard Ernest Bellman: The Theory of Dynamic Programming, Rand Paper 550, Santa Monica 1954. Dieses Papier ist der Text einer Rede von Richard Bellman vor der jährlichen Sommertagung der American Mathematical Society in Laramie, Wyoming, am 2. September 1954. </ref>. Man vermutete, Bellman könnte 10 Jahre nach Dantzigs [[Linearer Programmierung]] dessen Erfolg mit einem neuen Ansatz wiederholen. Dieser Ansatz bezog die Zeitdimension wirtschaftlichen Handelns explizit ein und zerlegte den zukünftigen Zeitablauf in verschiedene Perioden, in denen jeweils verschiedene Politikoptionen gewählt werden konnten. In einem Aufsehen erregenden, weil kontraintuitiven Vorgehen bestimmte Bellman zunächst in der Endperiode die optimale Politik und arbeitete sich schrittweise von dort zum Gegenwartszeitpunkt zurück (Rückwärtsrekursion). In jüngerer Zeit kritisierte Richard Vahrenkamp, dass die Dynamic Programmierung nur ein mathematisches Modell darstellt ohne Anwendungen in empirischen Projekten <ref> Richard Vahrenkamp: Nominal Science without Data: The Cold War Content of Game Theory and Operations Research, in: Real World Economics Review, vol. 88, 2019, pp. 19–50, (http://www.paecon.net/PAEReview/issue88/Vahrenkamp88.pdf). Deutsche Fassung unter Richard Vahrenkamp: Abstraktifizierung – Ein neuer Ansatz zur Evaluation der Wissenschaftsgeschichte von Operations Research in USA und Deutschland, Working Paper in the History of Computing No. 4/2019 (www.vahrenkamp.org/files/Wissenschaftsgeschichte_Operations_Research_Vahrenkamp_WP4_2019.pdf). </ref>. Wie mit der Methode der Linearen Programmierung konnte man auch mit der Dynamischen Programmierung optimale Lösungen wegen der aufwendigen Berechnungen nur mit Hilfe des Computers ermitteln. Christoph Schneeweiss wies im Jahre 1979 auf den hohen Hauptspeicherbedarf der Rückwärtsrekursion hin, der mit dem damaligen Technologiestand der Computertechnik nur für sehr kleine Modelle befriedigt werden konnte<ref> Schneeweis, Christoph: Dynamische Programmierung, in: Beckmann, Martin, Günter Menges und Reinhard Selten (Hersg.): Handwörterbuch der Mathematischen Wirtschaftswissenschaften, Teilband Unternehmensforschung, Wiesbaden 1979, S. 17–45. </ref>. Damit war die Dynamische Programmierung gar nicht in der Lage, Berechnungsprogramme für die weltweite Ersatzteilversorgung der Air Force zu leisten, wie Judith Klein in ihrer Studie zur Cold War Dynamic Programming unterstellte<ref> Klein, Judy: Cold War, Dynamic Programming, and the Science of Economizing: Bellman Strikes Gold in Policy Space, lecture at First Annual Conference on the History of Recent Economics (HISRECO), University of Paris X -Nanterre, France, 21-23 June 2007. </ref>.


Dynamische Programmierung kann erfolgreich eingesetzt werden, wenn ein [[Optimierungsproblem]] aus vielen gleichartigen Teilproblemen besteht und eine optimale Lösung des Problems sich aus optimalen Lösungen der Teilprobleme zusammensetzt. Dies nennt man [[Optimalitätsprinzip von Bellman]]. In der dynamischen Programmierung werden zuerst die optimalen Lösungen der kleinsten Teilprobleme direkt berechnet und dann geeignet zu einer Lösung eines nächstgrößeren Teilproblems zusammengesetzt. Dieses Verfahren setzt man fort, bis das ursprüngliche Problem gelöst wurde. Einmal berechnete Teilergebnisse werden in einer [[Tabelle]] gespeichert. Bei nachfolgenden Berechnungen gleichartiger Teilprobleme wird auf diese Zwischenlösungen zurückgegriffen, anstatt sie jedes Mal neu zu berechnen, was zu einer Senkung der Laufzeit führt. Wird die dynamische Programmierung konsequent eingesetzt, vermeidet sie kostspielige [[Rekursion]]en, weil bekannte Teilergebnisse wiederverwendet werden.
Dynamische Programmierung kann erfolgreich eingesetzt werden, wenn ein [[Optimierungsproblem]] aus vielen gleichartigen Teilproblemen besteht und eine optimale Lösung des Problems sich aus optimalen Lösungen der Teilprobleme zusammensetzt. Dies nennt man [[Optimalitätsprinzip von Bellman]]. In der dynamischen Programmierung werden zuerst die optimalen Lösungen der kleinsten Teilprobleme direkt berechnet und dann geeignet zu einer Lösung eines nächstgrößeren Teilproblems zusammengesetzt. Dieses Verfahren setzt man fort, bis das ursprüngliche Problem gelöst wurde. Einmal berechnete Teilergebnisse werden in einer [[Tabelle]] gespeichert. Bei nachfolgenden Berechnungen gleichartiger Teilprobleme wird auf diese Zwischenlösungen zurückgegriffen, anstatt sie jedes Mal neu zu berechnen, was zu einer Senkung der Laufzeit führt. Wird die dynamische Programmierung konsequent eingesetzt, vermeidet sie kostspielige [[Rekursion]]en, weil bekannte Teilergebnisse wiederverwendet werden.


In der Regelungstheorie und verwandten Gebieten kann man das Prinzip der dynamischen Programmierung einsetzen, um etwa eine Gleichung herzuleiten (Hamilton-Jacobi-Bellman-Gleichung), deren Lösung den optimalen Wert ergibt. Die Argumentation ist dabei etwa folgende: Wenn das Problem zeitabhängig ist, kann man den optimalen Wert des Ziel[[funktional]]s zu einem bestimmten Zeitpunkt betrachten. Man fragt sich dann, welche Gleichung die optimale Lösung erfüllen muss, damit das Zielfunktional auch zu einem späteren Zeitpunkt optimal bleibt, dies führt zur [[Hamilton-Jacobi-Bellman-Gleichung]]. Damit kann man das Problem in Zeitschritte einteilen, anstatt es auf einmal lösen zu müssen.
In der Regelungstheorie und verwandten Gebieten kann man das Prinzip der dynamischen Programmierung einsetzen, um etwa eine Gleichung herzuleiten (Hamilton-Jacobi-Bellman-Gleichung), deren Lösung den optimalen Wert ergibt. Die Argumentation ist dabei etwa folgende: Wenn das Problem zeitabhängig ist, kann man den optimalen Wert der Zielfunktion zu einem bestimmten Zeitpunkt betrachten. Man fragt sich dann, welche Gleichung die optimale Lösung erfüllen muss, damit das [[Funktional]] auch zu einem späteren Zeitpunkt optimal bleibt, dies führt zur [[Hamilton-Jacobi-Bellman-Gleichung]]. Damit kann man das Problem in Zeitschritte einteilen, anstatt es auf einmal lösen zu müssen.


In der [[Physik]] war dieses Prinzip schon seit Langem bekannt, allerdings nicht unter diesem Namen. Der Übergang von einer globalen (alle Zeitpunkte gleichzeitig) zu einer zeitabhängigen (dynamischen) Betrachtungsweise entspricht dort der Transformation der [[Lagrangefunktion|Lagrange-Funktion]] in die [[Hamilton-Funktion]] mit Hilfe der [[Legendre-Transformation]].
In der [[Physik]] war dieses Prinzip schon seit Langem bekannt, allerdings nicht unter diesem Namen. Der Übergang von einer globalen (alle Zeitpunkte gleichzeitig) zu einer zeitabhängigen (dynamischen) Betrachtungsweise entspricht dort der Transformation der [[Lagrangefunktion|Lagrange-Funktion]] in die [[Hamilton-Funktion]] mit Hilfe der [[Legendre-Transformation]].


== Beispiele ==
== Musterbeispiel ==
Durch die Nutzung von dynamischer Programmierung kann die Zeitkomplexität zur Berechnung der n-ten [[Fibonacci-Zahl]] drastisch verbessert werden.

Eine naive Implementation wäre:

'''function''' fib(n)
'''if''' n <= 1 '''return''' n
'''return''' fib(n − 1) + fib(n − 2)

Ein Aufruf von fib(4) zur Berechnung der vierten Fibonacci-Zahl erstellt folgenden Aufrufbaum:

# <code>fib(4)</code>
# <code>fib(3) + fib(2)</code>
# <code>(fib(2) + fib(1)) + fib(2)</code>
# <code>((fib(1)+fib(0)) + fib(1)) + fib(2)</code>
# <code>((fib(1)+fib(0)) + fib(1)) + (fib(1) + fib(0))</code>

Die Berechnung für <code>fib(2)</code> wurde doppelt ausgeführt. Für die Berechnung von größeren Fibonacci-Zahlen nimmt die Anzahl an mehrfachen Berechnungen entsprechend exponentiell zu, woraus die exponentielle Laufzeit dieses Programmes resultiert.

In einem möglichen dynamischen Programm berechnen wir erst die kleineren Fibonacci-Zahlen und bauen aus diesen die größeren Fibonacci-Zahlen, indem wir jede Berechnung nur einmal durchführen.

'''function''' fib(n)
'''if''' n = 0
'''return''' 0
'''else'''
'''var''' previousFib := 0, currentFib := 1
'''repeat''' n − 1 '''times''' ''// loop is skipped if n = 1''
'''var''' newFib := previousFib + currentFib
previousFib := currentFib
currentFib := newFib
'''return''' currentFib

Da wir jede Berechnung nur einmal durchführen, hat dieses Programm eine Laufzeit von O(n).

== Weitere Beispiele ==
* [[Cocke-Younger-Kasami-Algorithmus|CYK-Algorithmus]]
* [[Cocke-Younger-Kasami-Algorithmus|CYK-Algorithmus]]
* [[Earley-Algorithmus]]
* [[Earley-Algorithmus]]
Zeile 46: Zeile 80:


== Weblinks ==
== Weblinks ==
* [http://bibiserv.techfak.uni-bielefeld.de/adp/ ADP an der Uni Bielefeld]
* [https://bibiserv.cebitec.uni-bielefeld.de/adp/welcome.html ADP an der Uni Bielefeld]


== Einzelnachweise ==
== Einzelnachweise ==

Aktuelle Version vom 23. August 2024, 15:50 Uhr

Dynamische Programmierung ist eine Methode zum algorithmischen Lösen eines Optimierungsproblems durch Aufteilung in Teilprobleme und systematische Speicherung von Zwischenresultaten. Der Begriff wurde in den 1940er Jahren von dem amerikanischen Mathematiker Richard Bellman eingeführt, der diese Methode auf dem Gebiet der Regelungstheorie anwandte. In diesem Zusammenhang wird auch oft von Bellmans Prinzip der dynamischen Programmierung gesprochen.

Dynamische Programmierung kann erfolgreich eingesetzt werden, wenn ein Optimierungsproblem aus vielen gleichartigen Teilproblemen besteht und eine optimale Lösung des Problems sich aus optimalen Lösungen der Teilprobleme zusammensetzt. Dies nennt man Optimalitätsprinzip von Bellman. In der dynamischen Programmierung werden zuerst die optimalen Lösungen der kleinsten Teilprobleme direkt berechnet und dann geeignet zu einer Lösung eines nächstgrößeren Teilproblems zusammengesetzt. Dieses Verfahren setzt man fort, bis das ursprüngliche Problem gelöst wurde. Einmal berechnete Teilergebnisse werden in einer Tabelle gespeichert. Bei nachfolgenden Berechnungen gleichartiger Teilprobleme wird auf diese Zwischenlösungen zurückgegriffen, anstatt sie jedes Mal neu zu berechnen, was zu einer Senkung der Laufzeit führt. Wird die dynamische Programmierung konsequent eingesetzt, vermeidet sie kostspielige Rekursionen, weil bekannte Teilergebnisse wiederverwendet werden.

In der Regelungstheorie und verwandten Gebieten kann man das Prinzip der dynamischen Programmierung einsetzen, um etwa eine Gleichung herzuleiten (Hamilton-Jacobi-Bellman-Gleichung), deren Lösung den optimalen Wert ergibt. Die Argumentation ist dabei etwa folgende: Wenn das Problem zeitabhängig ist, kann man den optimalen Wert der Zielfunktion zu einem bestimmten Zeitpunkt betrachten. Man fragt sich dann, welche Gleichung die optimale Lösung erfüllen muss, damit das Funktional auch zu einem späteren Zeitpunkt optimal bleibt, dies führt zur Hamilton-Jacobi-Bellman-Gleichung. Damit kann man das Problem in Zeitschritte einteilen, anstatt es auf einmal lösen zu müssen.

In der Physik war dieses Prinzip schon seit Langem bekannt, allerdings nicht unter diesem Namen. Der Übergang von einer globalen (alle Zeitpunkte gleichzeitig) zu einer zeitabhängigen (dynamischen) Betrachtungsweise entspricht dort der Transformation der Lagrange-Funktion in die Hamilton-Funktion mit Hilfe der Legendre-Transformation.

Durch die Nutzung von dynamischer Programmierung kann die Zeitkomplexität zur Berechnung der n-ten Fibonacci-Zahl drastisch verbessert werden.

Eine naive Implementation wäre:

function fib(n)
    if n <= 1 return n
    return fib(n − 1) + fib(n − 2)

Ein Aufruf von fib(4) zur Berechnung der vierten Fibonacci-Zahl erstellt folgenden Aufrufbaum:

  1. fib(4)
  2. fib(3) + fib(2)
  3. (fib(2) + fib(1)) + fib(2)
  4. ((fib(1)+fib(0)) + fib(1)) + fib(2)
  5. ((fib(1)+fib(0)) + fib(1)) + (fib(1) + fib(0))

Die Berechnung für fib(2) wurde doppelt ausgeführt. Für die Berechnung von größeren Fibonacci-Zahlen nimmt die Anzahl an mehrfachen Berechnungen entsprechend exponentiell zu, woraus die exponentielle Laufzeit dieses Programmes resultiert.

In einem möglichen dynamischen Programm berechnen wir erst die kleineren Fibonacci-Zahlen und bauen aus diesen die größeren Fibonacci-Zahlen, indem wir jede Berechnung nur einmal durchführen.

function fib(n)
    if n = 0
        return 0
    else
        var previousFib := 0, currentFib := 1
        repeat n − 1 times // loop is skipped if n = 1
            var newFib := previousFib + currentFib
            previousFib := currentFib
            currentFib  := newFib
        return currentFib

Da wir jede Berechnung nur einmal durchführen, hat dieses Programm eine Laufzeit von O(n).

Weitere Beispiele

[Bearbeiten | Quelltext bearbeiten]

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. Kurt Mehlhorn, Peter Sanders: Algorithms and Data Structures. The Basic Toolbox. Springer, Berlin / Heidelberg 2008, ISBN 978-3-540-77977-3, S. 243–246, doi:10.1007/978-3-540-77978-0.