Académique Documents
Professionnel Documents
Culture Documents
39 langues
Article
Discussion
Lire
Modifier
Modifier le code
Voir l’historique
Cet article traite d'un paradigme algorithmique. Pour une classe particulière de
langages de programmation, voir langage de programmation dynamique
En informatique, la programmation dynamique est une
méthode algorithmique pour résoudre des problèmes d'optimisation. Le concept a
été introduit au début des années 1950 par Richard Bellman1. À l'époque, le terme
« programmation » signifie planification et ordonnancement1. La programmation
dynamique consiste à résoudre un problème en le décomposant en sous-problèmes,
puis à résoudre les sous-problèmes, des plus petits aux plus grands en stockant les
résultats intermédiaires. Elle a d'emblée connu un grand succès, car de nombreuses
fonctions économiques de l'industrie étaient de ce type, comme la conduite et
l'optimisation de procédés chimiques, ou la gestion de stocks1.
Le graphe de dépendance des sous-problèmes pour le calcul de F5, le 5ème terme de la suite de Fibonacci.
Le graphe de dépendance montré sur la droite n'est pas un arbre : cela illustre que
les sous-problèmes se chevauchent. Par exemple, pour calculer F5, nous avons
besoin de F3 et F4. Mais pour calculer F4, nous avons besoin de F2 et F3. Ainsi, F3 est
utile à la fois pour le calcul de F4 et pour le calcul de F5. La programmation
dynamique consiste alors à stocker les valeurs des sous-problèmes pour éviter les
recalculs3. Il existe alors deux méthodes pour calculer effectivement une solution : la
méthode ascendante et la méthode descendante. Dans la méthode ascendante, on
commence par calculer des solutions pour les sous-problèmes les plus petits, puis,
de proche en proche, on calcule les solutions des problèmes en utilisant le principe
d'optimalité et on mémorise les résultats dans un tableau F[.]. Par exemple :
fonction fibonacci(n)
F[0] = 0
F[1] = 1
pour tout i de 2 à n
F[i] := F[i-1] + F[i-2]
retourner F[n]
fonction fibonacci(n)
si F[n] n'est pas défini
si n = 0 ou n = 1
F[n] := n
sinon
F[n] := fibonacci(n-1) + fibonacci(n-2)
retourner F[n]
3
7 4
2 4 6
9 5 9 3
3 23
7 4 20 19 20 19
2 4 6 11 13 15 11 13 15
9 5 9 3 9 5 9 3