FAV-ZCU/KIV PRO/04. Dynamické programování.md

1.7 KiB

Dynamické programování

  • trochu jako D&C, ale jde zdola nahoru, každý podproblém řeší jen 1x
  • v tabulce uložena nejlepší dílčí řešení, kombinují se pro získání větších řešení
  • dynamika - pro problémy, kde je čas výpočtu a pořadí operací důležité
  • tak trochu kombinace brutální síly a žravé strategie (greedy)
  • minimalizace úsilí důsledným využíváním dílčích výsledků

Příklad: $n$-té Fibbonaciho číslo

  • DP spočte
    • F(0), F(1), F(2) = F(1) + F(0), \dots F(n) = F(n-1) + F(n-2)
    • \implies O(n)
  • D&C spočte
    • F(n), F(n-1), F(n-2), F(n-2), \dots
    • \implies O(2^n)
    • některé dílčí výsledky se počítají zbytečně víckrát

Příklady

  • nejdelší rostoucí posloupnost
  • problém dělení

Použitelnost DP

  • problém výhodný pro DP:
    • princip optimality - podstatný je stav, ne způsob, jakým se do něj došlo
  • důležitá je cena operací, ne samotné operace
  • většina kombinatorických problémů
  • největší omezení
    • počet dílčích řešení, která je nutno sledovat
    • potřebujeme zastavovací místa, implicitní pořadí prvků
    • pokud není splněno, máme exponenciální počet možných dílčích řešení a nedostatek paměti

Typický problém pro DP

  • dekomponovatelný do posloupnosti rozhodnutí, přijatých v různých etapách
  • každá etapa má určitý počet možných stavů
  • rozhodnutí nás převádí ze stavu v jedné etapě do stavu v druhé etapě
  • nejlepší posloupnost rozhodnutí v určité etapě je nezávislá na rozhodnutích v dřívějších etapách
  • cena přechodu mezi stavy v různých etapách je jasně definována
  • existuje rekurentní vztah pro výběr nejlepšího rozhodnutí