Program Dynamique PDF
Program Dynamique PDF
Program Dynamique PDF
dynamique
Ahlem Ben Cherifa
-FST-
Programmation dynamique
• Programmation dynamique inventée par Bellman (~ 1954)
pour résoudre des pbs de chemins optimaux (longueur
max. ou min.)
• La programmation dynamique est une méthode de
construction d’algorithme très utilisée en optimisation
combinatoire (→ recherche de solution optimale dans un
ensemble fini de solutions mais très grand).
• Il s’agit d’une méthode d’énumération implicite : on retient
ou rejette des sous-ensembles de solutions mais on ne
construit pas toutes les solutions. On rejette certaines
solutions sans les avoir construites explicitement si elles
appartiennent à un sous-ensemble qui n’est pas
intéressant.
Programmation dynamique
Diviser-pour-régner:
1) on décompose un problème en sous-problèmes pertinents (dont la
taille est une fraction de celle de départ),
2) on résout les sous-problèmes,
3) on construit une solution pour le problème initial…
Approche “top-down”
Programmation dynamique:
1) on résout des sous-problèmes et on stocke leurs solutions,
2) on voit quels sous-problèmes sont pertinents et
3) on les utilise pour construire une solution pour le problème initial…
Approche “bottom-up”
Exemple : la suite de Fibonacci
“top-down”
Exemple : la suite de Fibonacci
F0=1 F1=1 Fn = Fn-1 + Fn-2
fib(n) :
T [0]:=1
T [1]:=1
pour i de 2 à n
T[i]:=T[i-1]+T[i-2]
fpour
fib := T[n]
“bottom-up”
Comparaison avec diviser-pour-régner
• Diviser-pour-régner divise le problème en sous-problèmes
indépendants, résout-les et combine les solution en une
solution du problème de départ
• Diviser-pour-régner est une approche top-down
• Programmation dynamique calcule des solutions de petits
sous-problèmes pour les combiner en une solution d’un
problème plus grand. C’est donc une approche bottom-up.
• Contrairement à Diviser-pour-régner, les sous-problèmes sont
dépendants
• Principe d’optimalité : solution optimale d’un problème
contient des solutions optimales de tous les sous-problèmes
• Il reste de trouver une décomposition en sous-problèmes
• Les solutions des sous-problèmes sont mémorisées dans un tableau
Le problème du sac à dos
Le problème:
Input: un poids maximal M (entier), un ensemble de N objets
ayant chacun un poids et une valeur
Output: la valeur maximale pouvant être stockée dans le
sac (sans dépasser sa capacité !).
Solutions :
{5, 2, 1} a un poids 10 et une valeur 35
{3, 4} a un poids 11 et une valeur 40
Le problème du sac à dos
• soit F(k,m), 0 ≤ k ≤ n et 0 ≤ m ≤ M, le bénéfice
maximum qu’on peut obtenir avec les objets
1,. . . ,k et un sac de charge maximale m
• Deux cas :
On ne sélectionne pas l’objet k : F(k,m) est le bénéfice maximum en
sélectionnant parmi les k − 1 premiers objets avec comme limite m
(F(k − 1,m))
On sélectionne l’objet k : F(k,m) est la valeur de
l’objet k plus le bénéfice maximum en
sélectionnant parmi les k − 1 premiers objets
avec la limite m − pk
0 si i=0
F(k,m) = F(k-1,m) si pi > m
Max( F(k-1,m) , F(k-1,m-pk)+ vk sinon
Le problème du sac à dos
0 si i=0
F(k,m) = F(k-1,m) si pi > m
i 1 2 3 4 5
Max( F(k-1,m) , F(k-1,m-pk)+ vk
sinon pi 1 2 5 6 7
vi 1 6 18 22 28
M 0 1 2 3 4 5 6 7 8 9 10 11
Ø 0 0 0 0 0 0 0 0 0 0 0 0
{1} 0 1 1 1 1 1 1 1 1 1 1 1
{1,2} 0 1 6 7 7 7 7 7 7 7 7 7
{1,2,3] 0 1 6 7 7 18 19 24 25 25 25 25
{1,2,3,4} 0 1 6 7 7 18 22 24 28 29 29 40
{1,2,3,4,5} 0 1 6 7 7 18 22 28 29 34 35 40
Problème algorithmique :
Entrée : une longueur n > 0 et une table de prix pi, pour i = 1, 2,..., n
8 1 1 1 5 1 5 1
5 1 1 1 1 1 1
Approche par force brute
Enumérer toutes les découpes, calculer leur
revenu, déterminer le revenu maximum
Complexité : exponentielle en n :
Il y a 2n-1 manières de découper une tige de
longueur n
Plusieurs découpes sont équivalentes (1+1+2 et
1+2+1 par exemple) mais même en prenant cela
en compte, le nombre de découpes reste
exponentiel
Infaisable pour n un peu grand
Idée:
Soit ri le revenu maximum pour une tige de longueur i
Peut-on formuler rn de manière récursive ?
Déterminons ri pour notre exemple :
i ri solution optimale
1 1 1 (pas de découpe)
2 5 2 (pas de découpe)
3 8 3 (pas de découpe)
4 10 2+2
5 13 2+3
6 17 6 (pas de découpe)
7 18 1+6 ou 2+2+3
8 22 2+6 . . .
Formulation récursive de rn : version naïve
rn peut être calculé comme le maximum de :
pn : le prix sans découpe
r1 + rn-1 : le revenu max pour une tige de 1 et une
tige de n – 1
r2 + rn-2 : le revenu max pour une tige de 2 et une
tige de n – 2
...
rn-1 + r1
C’est à dire
rn = max(pn,r1 + rn-1,r2 + rn-2,...,rn-1 + r1)
Rod Cutting
Exemple:
Longueur i 1 2 3 4 5 6 7 8 9 10
Prix pi 1 5 8 9 10 17 17 20 24 30
Formule de récurrence :
r0 = 0
rn = max (pi + rn-i) 1≤ i ≤ n
Soit n = 8
i 0 1 2 3 4 5 6 7 8
p[i] 0 1 5 8 9 10 17 17 20
r[i] 0 1 5 8 10 13 17 18 22
s[i] 0 1 2 3 2 2 6 1 2
i := n
Tant que i > 0 faire
ecrire ( S[i] )
i := i – S[i]
fait
Cut-rod := R[n]
UN AUTRE EXEMPLE: LA PLUS LONGUE SOUS-
SUITE COMMUNE
Le problème:
Une sous-suite d’un mot u est un mot w obtenu à partir de u
en effaçant des lettres: