---
title: "Dynamické programování"
source: "https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD"
wiki: "systems-analysis.info/int"
article: "Dynamické_programování"
language: "cs"
categories:
  - "Category:Czech"
  - "Category:Operations research"
revision_id: 1763
wiki_created_at: 2026-09-06T22:53:37Z
wiki_modified_at: 2026-09-06T22:53:37Z
downloaded_at: 2026-09-07T22:47:37Z
---

# 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<sup>[\[1\]](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_note-bigenc-dp-1)[\[2\]](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_note-ru-wiki-dp-2)</sup>. 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í<sup>[\[3\]](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_note-rechetnikov-dp-3)</sup>. 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<sup>[\[4\]](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_note-en-wiki-dp-4)</sup>.

## 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í<sup>[\[3\]](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_note-rechetnikov-dp-3)</sup>.

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**<sup>[\[1\]](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_note-bigenc-dp-1)</sup>. 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:

$$
V_{k - 1}(x) = \max\limits_{y \in U(x)}\{\varphi_{k}(x,y) + V_{k}(f_{k}(x,y))\}
$$

kde:

- $k$ — číslo kroku (od $m$ do 1);
- $x$ — stav systému v kroku $k - 1$;
- $y$ — řídící rozhodnutí přijímané v kroku $k$;
- $\varphi_{k}(x,y)$ — zisk (nebo cena) v k-tém kroku;
- $f_{k}(x,y)$ — funkce určující nový stav systému;
- $V_{k}(s)$ — optimální hodnota účelové funkce pro podúlohu začínající v kroku $k$ ve stavu $s$.

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<sup>[\[5\]](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_note-mit-amp-5)</sup>.
- **Ú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<sup>[\[6\]](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_note-ru-wiki-curse-6)[\[7\]](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_note-utexas-ormm-7)</sup>. 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.  <span id="cite_note-bigenc-dp-1">↑ <sup>[1.0](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_ref-bigenc-dp_1-0)</sup> <sup>[1.1](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_ref-bigenc-dp_1-1)</sup> "Динамическое программирование". *Большая российская энциклопедия*. <a href="https://bigenc.ru/c/dinamicheskoe-programmirovanie-00423a" class="external autonumber" rel="nofollow">[1]</a></span>
2.  <span id="cite_note-ru-wiki-dp-2">[↑](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_ref-ru-wiki-dp_2-0) "Динамическое программирование". *Википедия*. <a href="https://ru.wikipedia.org/wiki/Динамическое_программирование" class="external autonumber" rel="nofollow">[2]</a></span>
3.  <span id="cite_note-rechetnikov-dp-3">↑ <sup>[3.0](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_ref-rechetnikov-dp_3-0)</sup> <sup>[3.1](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_ref-rechetnikov-dp_3-1)</sup> Решетников А. Н., Коченков А. В., Пиров Д. М., Рябоконь Д. А. (2011). *Динамическое программирование. Примеры применения*. Учебное пособие, ННГУ им. Лобачевского (ВМиК). <a href="https://itslearningakarmazyan.files.wordpress.com/2015/09/dynamic-programming.pdf" class="external autonumber" rel="nofollow">[3]</a></span>
4.  <span id="cite_note-en-wiki-dp-4">[↑](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_ref-en-wiki-dp_4-0) "Dynamic programming". *Wikipedia*. <a href="https://en.wikipedia.org/wiki/Dynamic_programming" class="external autonumber" rel="nofollow">[4]</a></span>
5.  <span id="cite_note-mit-amp-5">[↑](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_ref-mit-amp_5-0) Bradley S. P., Hax A. C., Magnanti T. L. (1977). *Applied Mathematical Programming*. Addison-Wesley. <a href="http://web.mit.edu/15.053/www/AMP-Chapter-11.pdf" class="external autonumber" rel="nofollow">[5]</a></span>
6.  <span id="cite_note-ru-wiki-curse-6">[↑](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_ref-ru-wiki-curse_6-0) "Проклятие размерности". *Википедия*. <a href="https://ru.wikipedia.org/wiki/Проклятие_размерности" class="external autonumber" rel="nofollow">[6]</a></span>
7.  <span id="cite_note-utexas-ormm-7">[↑](https://systems-analysis.info/int/Dynamick%C3%A9_programov%C3%A1n%C3%AD#cite_ref-utexas-ormm_7-0) Jensen P. A. (2004). *Dynamic Programming – Models*. Operations Research Models and Methods, Univ. of Texas. <a href="https://utw11041.utweb.utexas.edu/ORMM/models/unit/dynamic/index.html" class="external autonumber" rel="nofollow">[7]</a></span>
