Dynamické programování
Dynamické programování (DP; angl. dynamic programming, DP) — je metoda řešení složitých optimalizačních úloh, založená na rozkladě původní úlohy na posloupnost jednodušších podúloh[1][2]. Metoda se používá pro vícekorové procesy rozhodování, kde optimální řešení celé úlohy lze sestavit z optimálních řešení jejích podúloh.
Termín zavedl americký matematik Richard Bellman v 50. letech 20. století[3]. V tomto kontextu slovo „programování" označuje „plánování" nebo „sestavení optimálního plánu činnosti", nikoli psaní počítačového kódu[4].
Klíčové vlastnosti a věty
Použitelnost dynamického programování pro danou úlohu je určena přítomností dvou základních vlastností.
Bellmanův princip optimality
Ústředním konceptem metody je Bellmanův princip optimality (angl. Bellman's principle of optimality). Říká: bez ohledu na to, jaký je počáteční stav a počáteční rozhodnutí, musí následující rozhodnutí tvořit optimální strategii vzhledem ke stavu vzniklému v důsledku prvního rozhodnutí[3].
Jinými slovy, každá část optimální trajektorie je sama o sobě optimální. Tato vlastnost umožňuje rozložit celkovou úlohu na posloupnost jednodušších podúloh a řešit je rekurzivně.
Překrývající se podúlohy
Úloha má vlastnost překrývajících se podúloh (angl. overlapping subproblems), pokud se při jejím rekurzivním řešení tytéž podúlohy opakovaně vyskytují. DP umožňuje vyhnout se opakovaným výpočtům tím, že ukládá řešení již vyřešených podúloh (tato technika se nazývá memoizace nebo tabelace), což výrazně zvyšuje efektivitu oproti naivnímu rekurzivnímu prohledávání.
Bellmanova rovnice
Z principu optimality vyplývá základní rekurentní vztah metody — Bellmanova rovnice[1]. Spojuje „hodnotu" (optimální zisk nebo cenu) aktuálního stavu s hodnotami následujících stavů. V obecné podobě pro deterministický vícekorový proces s aditivní účelovou funkcí má tvar:
kde:
- — číslo kroku (od do 1);
- — stav systému v kroku ;
- — řídící rozhodnutí přijímané v kroku ;
- — zisk (nebo cena) v k-tém kroku;
- — funkce určující nový stav systému;
- — optimální hodnota účelové funkce pro podúlohu začínající v kroku ve stavu .
Rovnice se řeší postupně, zpravidla „od konce", přičemž se postupuje od posledního kroku k prvnímu.
Příklady použití
- Úloha o nejkratší cestě v grafu: Tato úloha má vlastnost optimální podstruktury, protože každý úsek nejkratší cesty je sám nejkratší. Bellmanův-Fordův algoritmus a Floydův-Warshallův algoritmus jsou klasickými příklady použití DP pro řešení této úlohy[5].
- Úloha o batohu: Úloha o optimálním naplnění batohu s omezenou kapacitou předměty s různou hodnotou a hmotností. DP umožňuje řešit tuto úlohu postupným procházením předmětů a výpočtem maximální hodnoty pro všechny možné hodnoty zbývající kapacity v každém kroku.
- Úloha o rozdělení zdrojů: Rozdělení omezeného zdroje (například investic) mezi několik projektů za účelem maximalizace celkového efektu.
Omezení
Hlavním omezením metody je prokletí dimenzionality (angl. curse of dimensionality) — termín zavedený Bellmanem pro označení exponenciálního růstu počtu stavů a v důsledku toho i výpočetní složitosti při zvyšování počtu proměnných popisujících stav systému[6][7]. Toto omezení zužuje praktické použití přesného DP pro úlohy velmi velké dimenze.
Související pojmy
- Operační výzkum
- Teorie optimálního řízení
- Markovský rozhodovací proces (stochastické zobecnění)
- Hamiltonova–Jacobiho–Bellmanova rovnice (analogie pro spojitý čas)
Poznámky
- ↑ 1.0 1.1 "Динамическое программирование". Большая российская энциклопедия. [1]
- ↑ "Динамическое программирование". Википедия. [2]
- ↑ 3.0 3.1 Решетников А. Н., Коченков А. В., Пиров Д. М., Рябоконь Д. А. (2011). Динамическое программирование. Примеры применения. Учебное пособие, ННГУ им. Лобачевского (ВМиК). [3]
- ↑ "Dynamic programming". Wikipedia. [4]
- ↑ Bradley S. P., Hax A. C., Magnanti T. L. (1977). Applied Mathematical Programming. Addison-Wesley. [5]
- ↑ "Проклятие размерности". Википедия. [6]
- ↑ Jensen P. A. (2004). Dynamic Programming – Models. Operations Research Models and Methods, Univ. of Texas. [7]