Programowanie dynamiczne

From Systems analysis Wiki
Jump to navigation Jump to search

Programowanie dynamiczne (PD; ang. dynamic programming, DP) — to metoda rozwiązywania złożonych zadań optymalizacyjnych, oparta na podziale wyjściowego problemu na ciąg prostszych podproblemów[1][2]. Metoda stosowana jest do wieloetapowych procesów decyzyjnych, w których optymalne rozwiązanie całego zadania może być zbudowane z optymalnych rozwiązań jego podproblemów.

Termin został wprowadzony przez amerykańskiego matematyka Richarda Bellmana w latach 50. XX wieku[3]. W tym kontekście słowo „programowanie" używane jest w znaczeniu „planowanie" lub „opracowywanie optymalnego planu działań", a nie pisanie kodu komputerowego[4].

Kluczowe właściwości i twierdzenia

Możliwość zastosowania programowania dynamicznego do danego zadania określana jest przez obecność dwóch fundamentalnych właściwości.

Zasada optymalności Bellmana

Centralnym pojęciem metody jest zasada optymalności Bellmana (ang. Bellman's principle of optimality). Głosi ona: niezależnie od stanu początkowego i decyzji początkowej, kolejne decyzje muszą tworzyć optymalną strategię względem stanu uzyskanego w wyniku pierwszej decyzji[3].

Innymi słowy, każda część optymalnej trajektorii jest sama w sobie optymalna. Właściwość ta pozwala podzielić ogólne zadanie na ciąg prostszych podproblemów i rozwiązywać je rekurencyjnie.

Nakładające się podproblemy

Zadanie posiada właściwość nakładających się podproblemów (ang. overlapping subproblems), jeśli przy jego rekurencyjnym rozwiązywaniu te same podproblemy pojawiają się wielokrotnie. PD pozwala uniknąć powtórnych obliczeń poprzez zapamiętywanie rozwiązań już napotkanych podproblemów (technika ta nazywana jest memoizacją lub tabulacją), co znacznie zwiększa efektywność w porównaniu z naiwnym rekurencyjnym przeszukiwaniem.

Równanie Bellmana

Z zasady optymalności wynika podstawowa relacja rekurencyjna metody — równanie Bellmana[1]. Wiąże ono „wartość" (optymalny zysk lub koszt) bieżącego stanu z wartościami stanów następnych. W ogólnej postaci dla deterministycznego procesu wieloetapowego z addytywną funkcją celu ma ono postać:

Vk1(x)=maxyU(x){φk(x,y)+Vk(fk(x,y))}

gdzie:

  • k — numer kroku (od m do 1);
  • x — stan systemu na kroku k1;
  • y — sterowana decyzja podejmowana na kroku k;
  • φk(x,y) — zysk (lub koszt) na k-tym kroku;
  • fk(x,y) — funkcja wyznaczająca nowy stan systemu;
  • Vk(s) — optymalna wartość funkcji celu dla podproblemu rozpoczynającego się na kroku k w stanie s.

Równanie rozwiązywane jest sekwencyjnie, zazwyczaj „od końca", przechodząc od ostatniego kroku do pierwszego.

Przykłady zastosowania

  • Zadanie o najkrótszej ścieżce w grafie: Zadanie to posiada właściwość optymalnej podstruktury, ponieważ każdy fragment najkrótszej ścieżki jest sam w sobie najkrótszy. Algorytmy Bellmana-Forda i Floyda-Warshalla są klasycznymi przykładami zastosowania PD do rozwiązania tego zadania[5].
  • Zadanie plecakowe: Zadanie optymalnego wypełnienia plecaka o ograniczonej pojemności przedmiotami o różnych wartościach i wagach. PD pozwala rozwiązać to zadanie, rozpatrując przedmioty kolejno i obliczając na każdym kroku maksymalną wartość dla wszystkich możliwych wartości pozostałej pojemności.
  • Zadanie alokacji zasobów: Podział ograniczonego zasobu (np. inwestycji) między kilka projektów w celu maksymalizacji łącznego efektu.

Ograniczenia

Głównym ograniczeniem metody jest przekleństwo wymiarowości (ang. curse of dimensionality) — termin wprowadzony przez Bellmana dla określenia wykładniczego wzrostu liczby stanów, a w konsekwencji złożoności obliczeniowej, wraz ze wzrostem liczby zmiennych opisujących stan systemu[6][7]. Ogranicza to praktyczne zastosowanie dokładnego PD dla zadań o bardzo dużej wymiarowości.

Pojęcia powiązane

  • Badania operacyjne
  • Teoria optymalnego sterowania
  • Markowski proces decyzyjny (stochastyczne uogólnienie)
  • Równanie Hamiltona — Jacobiego — Bellmana (analog dla czasu ciągłego)

Przypisy

[1] [2] [3] [4] [5] [6] [7] </references>

  1. 1.0 1.1 1.2 "Динамическое программирование". Большая российская энциклопедия. [1]
  2. 2.0 2.1 "Динамическое программирование". Википедия. [2]
  3. 3.0 3.1 3.2 Решетников А. Н., Коченков А. В., Пиров Д. М., Рябоконь Д. А. (2011). Динамическое программирование. Примеры применения. Учебное пособие, ННГУ им. Лобачевского (ВМиК). [3]
  4. 4.0 4.1 "Dynamic programming". Wikipedia. [4]
  5. 5.0 5.1 Bradley S. P., Hax A. C., Magnanti T. L. (1977). Applied Mathematical Programming. Addison-Wesley. [5]
  6. 6.0 6.1 "Проклятие размерности". Википедия. [6]
  7. 7.0 7.1 Jensen P. A. (2004). Dynamic Programming – Models. Operations Research Models and Methods, Univ. of Texas. [7]