Programmazione dinamica
La programmazione dinamica (PD; ingl. dynamic programming, DP) è un metodo per la risoluzione di problemi complessi di ottimizzazione, basato sulla scomposizione del problema originale in una sequenza di sottoproblemi più semplici[1][2]. Il metodo si applica a processi decisionali a più fasi, in cui la soluzione ottimale dell'intero problema può essere costruita a partire dalle soluzioni ottimali dei suoi sottoproblemi.
Il termine fu introdotto dal matematico americano Richard Bellman negli anni '50[3]. In questo contesto, la parola «programmazione» è usata nel significato di «pianificazione» o «elaborazione di un piano d'azione ottimale», e non di scrittura di codice informatico[4].
Proprietà fondamentali e teoremi
L'applicabilità della programmazione dinamica a un problema è determinata dalla presenza di due proprietà fondamentali.
Principio di ottimalità di Bellman
Il concetto centrale del metodo è il principio di ottimalità di Bellman (ingl. Bellman's principle of optimality). Esso afferma: qualunque siano lo stato iniziale e la decisione iniziale, le decisioni successive devono costituire una strategia ottimale rispetto allo stato risultante dalla prima decisione[3].
In altre parole, qualsiasi parte di una traiettoria ottimale è essa stessa ottimale. Questa proprietà consente di scomporre il problema generale in una sequenza di sottoproblemi più semplici e di risolverli in modo ricorsivo.
Sottoproblemi sovrapposti
Un problema possiede la proprietà dei sottoproblemi sovrapposti (ingl. overlapping subproblems) se, durante la sua risoluzione ricorsiva, gli stessi sottoproblemi si presentano più volte. La PD permette di evitare calcoli ripetuti memorizzando le soluzioni dei sottoproblemi già incontrati (questa tecnica è chiamata memoizzazione o tabulazione), il che aumenta significativamente l'efficienza rispetto alla ricerca ricorsiva ingenua.
Equazione di Bellman
Dal principio di ottimalità deriva la relazione di ricorrenza fondamentale del metodo: l'equazione di Bellman[1]. Essa collega il «valore» (guadagno ottimale o costo) dello stato corrente con i valori degli stati successivi. In forma generale, per un processo deterministico a più fasi con funzione obiettivo additiva, essa assume la forma:
dove:
- — numero del passo (da a 1);
- — stato del sistema al passo ;
- — decisione di controllo presa al passo ;
- — guadagno (o costo) al passo k;
- — funzione che definisce il nuovo stato del sistema;
- — valore ottimale della funzione obiettivo per il sottoproblema che inizia al passo nello stato .
L'equazione viene risolta in modo sequenziale, di norma «partendo dalla fine», procedendo dall'ultimo passo al primo.
Esempi di applicazione
- Problema del cammino minimo in un grafo: Questo problema possiede la proprietà della sottostruttura ottimale, poiché qualsiasi segmento del cammino minimo è esso stesso un cammino minimo. Gli algoritmi di Bellman-Ford e di Floyd-Warshall sono esempi classici di applicazione della PD per la risoluzione di questo problema[5].
- Problema dello zaino: Il problema del riempimento ottimale di uno zaino di capacità limitata con oggetti di diverso valore e peso. La PD consente di risolvere questo problema esaminando gli oggetti in sequenza e calcolando a ogni passo il valore massimo per tutti i possibili valori della capacità rimanente.
- Problema di allocazione delle risorse: Distribuzione di una risorsa limitata (ad esempio, investimenti) tra più progetti al fine di massimizzare l'effetto complessivo.
Limitazioni
Il principale limite del metodo è la maledizione della dimensionalità (ingl. curse of dimensionality) — termine introdotto da Bellman per designare la crescita esponenziale del numero di stati e, di conseguenza, della complessità computazionale, all'aumentare del numero di variabili che descrivono lo stato del sistema[6][7]. Ciò limita l'applicazione pratica della PD esatta a problemi di dimensioni molto elevate.
Concetti correlati
- Ricerca operativa
- Teoria del controllo ottimale
- Processo decisionale di Markov (generalizzazione stocastica)
- Equazione di Hamilton — Jacobi — Bellman (analogo per il tempo continuo)
Note
[1] [2] [3] [4] [5] [6] [7] </references>
- ↑ 1.0 1.1 1.2 "Динамическое программирование". Большая российская энциклопедия. [1]
- ↑ 2.0 2.1 "Динамическое программирование". Википедия. [2]
- ↑ 3.0 3.1 3.2 Решетников А. Н., Коченков А. В., Пиров Д. М., Рябоконь Д. А. (2011). Динамическое программирование. Примеры применения. Учебное пособие, ННГУ им. Лобачевского (ВМиК). [3]
- ↑ 4.0 4.1 "Dynamic programming". Wikipedia. [4]
- ↑ 5.0 5.1 Bradley S. P., Hax A. C., Magnanti T. L. (1977). Applied Mathematical Programming. Addison-Wesley. [5]
- ↑ 6.0 6.1 "Проклятие размерности". Википедия. [6]
- ↑ 7.0 7.1 Jensen P. A. (2004). Dynamic Programming – Models. Operations Research Models and Methods, Univ. of Texas. [7]