Kaj je dinamično programiranje?

Dinamično programiranje, ko se nanaša na področje računalništva, opisuje skupino podobnih računalniških algoritmov, namenjenih reševanju kompleksnih problemov z razčlenitvijo problema na nize manjših problemov. Dinamično programiranje, ki ga je prvi ustvaril Richard Bellman v petdesetih letih prejšnjega stoletja, deluje s problemi, ki so bodisi prekrivajoči se podproblemi ali optimalne podstrukture. Da bi razumeli, kako deluje dinamično programiranje, je najbolje razumeti koncept teh dveh izrazov.

Prekrivajoči se podproblemi opisujejo zapletene enačbe, ki, ko so razčlenjene na manjše skupine enačb, večkrat ponovno uporabijo dele manjših enačb, da dosežejo odgovor. Na primer, matematična enačba za izračun vseh možnih rezultatov z uporabo niza številk lahko isti rezultat izračuna večkrat, medtem ko druge rezultate izračuna samo enkrat. Dinamično programiranje bi tej težavi povedalo, da mora po prvem izračunu rezultata ta rezultat shraniti in pozneje vstaviti odgovor v enačbo, namesto da bi ga ponovno izračunal. Pri dolgotrajnih zapletenih procesih in enačbah to prihrani čas in ustvari hitrejšo rešitev z veliko manj koraki.

Optimalne podstrukture ustvarijo rešitev tako, da najdejo najboljši odgovor na vse podprobleme in nato ustvarijo najboljši splošni odgovor. Po razčlenitvi kompleksnega problema na manjše probleme računalnik nato z matematičnim sistemom ugotovi, kateri je najboljši odgovor za vsako težavo. Iz manjših odgovorov izračuna odgovor na prvotni problem. Pri tem postopku obstajajo pomanjkljivosti. Čeprav daje rešitev, ki matematično deluje najbolje, je lahko najboljša rešitev v resničnem življenju ali pa tudi ne, odvisno od vrste problema in njegove povezave z resničnim svetom.

Med katero koli od teh operacij algoritem za dinamično programiranje poskuša najti najkrajšo pot do rešitve. Za to je lahko potreben eden od dveh pristopov. Pristop od zgoraj navzdol razčleni enačbo na manjše enačbe in po potrebi ponovno uporabi odgovore za te enačbe. Pristop od spodaj navzgor poskuša rešiti najmanjšo matematično vrednost po razčlenitvi enačbe in se nato pomakne navzgor proti največji. Oba pristopa prihranita čas, vendar dinamično programiranje deluje le, če se lahko izvirni problem razgradi na manjše enačbe, ki se na neki točki ponovno uporabijo za rešitev enačbe.