Programare dinamică
Programarea dinamică (PD; engl. dynamic programming, DP) — este o metodă de rezolvare a problemelor complexe de optimizare, bazată pe descompunerea problemei inițiale într-o secvență de subprobleme mai simple[1][2]. Metoda se aplică proceselor de luare a deciziilor în mai mulți pași, unde soluția optimă a întregii probleme poate fi construită din soluțiile optime ale subproblemelor sale.
Termenul a fost introdus de matematicianul american Richard Bellman în anii 1950[3]. În acest context, cuvântul „programare" este folosit cu sensul de „planificare" sau „elaborarea unui plan optim de acțiune", și nu de scriere a unui cod de calculator[4].
Proprietăți cheie și teoreme
Aplicabilitatea programării dinamice la o problemă este determinată de prezența a două proprietăți fundamentale ale acesteia.
Principiul optimalității Bellman
Conceptul central al metodei este principiul optimalității Bellman (engl. Bellman's principle of optimality). Acesta afirmă: indiferent de starea inițială și de decizia inițială, deciziile ulterioare trebuie să constituie o strategie optimă în raport cu starea obținută ca urmare a primei decizii[3].
Cu alte cuvinte, orice porțiune a traiectoriei optime este, prin ea însăși, optimă. Această proprietate permite descompunerea problemei generale într-o secvență de subprobleme mai simple și rezolvarea lor recursivă.
Subprobleme suprapuse
O problemă posedă proprietatea subproblemelor suprapuse (engl. overlapping subproblems) dacă, în cursul rezolvării sale recursive, aceleași subprobleme apar în mod repetat. PD permite evitarea calculelor redundante prin stocarea soluțiilor subproblemelor deja întâlnite (această tehnică se numește memoizare sau tabulare), ceea ce crește semnificativ eficiența față de căutarea recursivă naivă.
Ecuația Bellman
Din principiul optimalității decurge relația de recurență fundamentală a metodei — ecuația Bellman[1]. Aceasta leagă „valoarea" (câștigul optim sau costul) stării curente de valorile stărilor ulterioare. În forma sa generală, pentru un proces determinist în mai mulți pași cu funcție obiectiv aditivă, ea are forma:
unde:
- — numărul pasului (de la la 1);
- — starea sistemului la pasul ;
- — decizia controlabilă luată la pasul ;
- — câștigul (sau costul) la pasul k;
- — funcția care determină noua stare a sistemului;
- — valoarea optimă a funcției obiectiv pentru subproblema care începe la pasul în starea .
Ecuația se rezolvă secvențial, de regulă „de la sfârșit", deplasându-se de la ultimul pas către primul.
Exemple de aplicare
- Problema drumului cel mai scurt într-un graf: Această problemă posedă proprietatea substructurii optime, deoarece orice porțiune a drumului cel mai scurt este ea însăși cel mai scurt drum. Algoritmii Bellman-Ford și Floyd-Warshall sunt exemple clasice de aplicare a PD pentru rezolvarea acestei probleme[5].
- Problema rucsacului: Problema umplerii optime a unui rucsac cu capacitate limitată cu obiecte de valori și greutăți diferite. PD permite rezolvarea acestei probleme prin examinarea secvențială a obiectelor și calcularea, la fiecare pas, a valorii maxime pentru toate valorile posibile ale capacității rămase.
- Problema alocării resurselor: Distribuirea unei resurse limitate (de exemplu, investiții) între mai multe proiecte în vederea maximizării efectului total.
Limitări
Principala limitare a metodei este blestemul dimensionalității (engl. curse of dimensionality) — termen introdus de Bellman pentru a desemna creșterea exponențială a numărului de stări și, implicit, a complexității computaționale, odată cu creșterea numărului de variabile care descriu starea sistemului[6][7]. Aceasta limitează aplicarea practică a PD exacte pentru probleme de dimensiuni foarte mari.
Noțiuni conexe
- Cercetarea operațională
- Teoria controlului optim
- Procesul de decizie Markov (generalizare stochastică)
- Ecuația Hamilton — Jacobi — Bellman (analogul pentru timp continuu)
Note
- ↑ 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]