Académique Documents
Professionnel Documents
Culture Documents
Plan du Cours
Introduction (Chapitre 1)
Principe général
Souvent, pour résoudre un problème de taille n, on s'aperçoit
qu'il est composé de plusieurs sous problèmes identiques.
Idée de base :
Éviter de calculer la même chose
deux fois, normalement en utilisant
un tableau de résultats déjà
calculés, rempli au fur et à mesure
qu'on résout les sous problèmes.
Historique:
Richard E. Bellman (introduit d’une façon systématique
l’étude de la programmation dynamique dans les années
50. [RAND corporation]
programmation dynamique = planifier sur une période.
Programmation veut dire ordonnancement “scheduling” (a la
programmation linéaire)
Secrétaire de Défense était hostile a la recherche mathématique.
Bellman a choisi un nom impressionnant afin d’éviter toute confrontation.
impossible d’utiliser « dynamique » dans un sens péjoratif"
(x + y)2 = x2 + 2xy + y2
coefficients sont 1,2,1
(x + y)3 = x3 + 3x2y + 3xy2 + y3
coefficients sont 1,3,3,1
(x + y)4 = x4 + 4x3y + 6x2y2 + 4xy3 + y4
coefficients sont 1,4,6,4,1
(x + y)5 = x5 + 5x4y + 10x3y2 + 10x2y3 + 5xy4 + y5
coefficients sont 1,5,10,10,5,1
Dr. Nejib Zaguia - Automne 2016 7
CSI 3505
Programmation Dynamique
C(n-1,k-1) + C(n-1,k) si 0<k<n
C(n,k) =
1 si k =0 or k = n
C(n,k)
{
si k = 0 or k =n alors retourner 1
sinon retourner ( C(n-1,k-1) + C(n-1,k) )
}
7 8
C(3,1) C(3,2)
4 5 6
C(2,0) C(2,1) C(2,2)
2 3
C(1,0) C(1,1)
1
C(0,0)
n-1
n C(n,k)
1 1 1
2 1 2 1
3 1 3 3 1
C(6,3) 4 1 4 6 4
5 1 5 10 10
6 1 6 15 20
Exemple: M = M1 M2 M3 M4
10x20 20x50 50x1 1x100
Ordre 1: M1 x (M2 x (M3 x M4 ))
Coût(M3 x M4 ) = 50 x 1 x 100
Coût(M2 x (M3 x M4 )) = 20 x 50 x 100
Coût(M1 x (M2 x (M3 x M4 ))) = 10 x 20 x 100
Coût total = 125000
2n -2
T(n) = 1/n ( n-1 )
T(n) (4n/n3/2)
n 1 2 3 4 5 ... 10 ... 15
Raison:
S’il y avait une meilleure solution pour M1 x M2 x M3 alors on pourra
l’utiliser pour obtenir une meilleure solution pour M1 x M2 x M3 x M4 .
Contradiction avec l’optimalité de (M1 x (M2 x M3 )) x M4
Dr. Nejib Zaguia - Automne 2016 25
CSI 3505
Programmation Dynamique
m[1,6] = minimum de
Dr. Nejib Zaguia - Automne 2016 27
CSI 3505
Programmation Dynamique
0 (i = j)
m[i,j] =
min { m[i,k] + m[k + 1, j] + di-1dkdj } (i < j)
i<k<j
m[i, j] min
<
{ m[i, k] m[k 1, j] di-1dk dj }
i k j
n1
T(n) (T(k) T(n k) O(1))
k 1
( 2 )
n
Inacceptable:
beaucoup de répétitions!!
Dr. Nejib Zaguia - Automne 2016 29
CSI 3505
Programmation Dynamique
O(n2)
j
Remplir la tableau par étape:
1 2 3 4 5
les m[i,j] ou j-i = 0
les m[i,j] ou j-i = 1 i 1
les m[i,j] ou j-i = 2 2
3
4
5
M = M1 x M2 x M3 x M4
10x20 20x50 50x1 1x100
Étape 1: j-i = 1
m[1,2] = m[1,1] + m[2,2] + 10000 = 10000
m[2,3] = 20 x 50 = 1000
m[3,4] = 50 x 100 = 5000
Étape 2: j-i = 2
m[1,1] + m[2,3] + 10 x 20 x 1
m[1,3] = min
m[1,2] + m[3,3] + 10 x 50 x 1
k=1
= min {1200,10500} = 1200
m[2,2] + m[3,4] + 20 x 50 x 100
m[2,4] = min
m[2,3] + m[4,4] + 20 x 1 x 100
k=3 = min {10500,3000} = 3000
Dr. Nejib Zaguia - Automne 2016 35
CSI 3505
Programmation Dynamique
Étape 3: j-i = 3
case j-i = 3
m[1,1] + m[2,4] + 10 x 20 x 100
m[1,4] = min m[1,2] + m[3,4] + 10 x 50 x 100
m[1,3] + m[4,4] + 10 x 1 x 100
k=3
j- i =1: PosOpt[1, 2] = 1 M1 x M2 x M3 x M4
PosOpt[1, 4] = 3
PosOpt[2, 3] = 2
M1 x M2 x M3 M4
PosOpt[3, 4] = 3
PosOpt[1, 3] = 1
j- i =2: PosOpt[1, 3] = 1
M1 M2 x M3
PosOpt[2, 4] = 3
j- i =3: PosOpt[1, 4] = 3 M2 M3
Matrix-Chain-Order( p, n )
{
for i = 1 to n
m[i,i] = 0
for len = 2 to n
for i = 1 to n - len + 1
j = i + len - 1
m[i,j] = ∞
for k = i to j-1
q = m[i,k] + m[k+1,j] + d[i-1]*d[k]*d[j]
if q < m[i,j] then
m[i,j] = q
s[i,j] = k
return s
}
Dr. Nejib Zaguia - Automne 2016 38
CSI 3505
Programmation Dynamique
30
B G = (V,E) : graphe connexe.
E 100 A chaque arête est associée
20
10 une longueur non-négative.
5
Un des sommets est la source.
50
D C
Dr. Nejib Zaguia - Automne 2016 39
CSI 3505
Programmation Dynamique
C B
A
A 0 5
15 5
B 50 0 15 5 15
C 30 0 15 30
D 15 5 0
D 5
15
C
Dr. Nejib Zaguia - Automne 2016 41
CSI 3505
Programmation Dynamique
Itération k:
L = D0 , D1 , …….Dn = D
Cas 1. L’utilisation du sommet k n’ajoute rien au chemin le plus court déjà
trouvés de i vers j avec les sommets {1, 2, …, k-1}. (Au moins un des plus
court chemins (qui pourrait utiliser les sommets {1,2,…k}), n’utilise PAS le
sommet k.) D [i,j] = D [i,j]
k k-1
Cas 2. Tous les plus court chemins (qui pourraient utiliser les sommets
{1,2,…k}), UTILISENT le sommet k comme nœud intermédiaire.
i k j
Dk [i,j] = Dk-1[i,k]+ Dk-1[k,j]
Dr. Nejib Zaguia - Automne 2016 43
CSI 3505
Programmation Dynamique
l’algorithme de Floyd
Floyd(n, L[ ] [ ])
matrice D de taille n x n
D=L
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
D[i,j] = min {D[i,j], D[i,k]+D[k,j]}
retourner D
Exemple: A
5
0 5
15
D0=L
50
30
0
15
0
5
15
50 B
5
15 5 0
D
0 5 5 30
50 0 15 5 15
D1 30 35 0 15 15
15 20 5 0
C
0 5 20 10
D2 50 0 15 5
30 35 0 15
15 20 5 0
Dr. Nejib Zaguia - Automne 2016 46
CSI 3505
Programmation Dynamique
Cont …
0
50
5
0
20
15
10
5
A
D2 5
30 35 0 15
15
50 B
15 20 5 0
5
0 5 20 10 D
45 0 15 5
D3
30 35 0 15 5 30
15 20 5 0 15
15
0 5 15 10
D=D4 20 0 10 5 C
30 35 0 15
15 20 5 0
Dr. Nejib Zaguia - Automne 2016 47
CSI 3505
Programmation Dynamique
passe
Deuxième matrice P initialisée à 0.
Algorithme de Floyd
Floyd2(n, L[ ] [ ], P[ ][ ])
matrice D de taille n x n
matrice P de taille n x n
D = L; P=0
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if D[i,k]+D[k,j] < D[i,j]
D[i,j] = D[i,k]+D[k,j]
P[i, j] = k
retourner D Dr. Nejib Zaguia - Automne 2016 49
CSI 3505
Programmation Dynamique
Exemple: 0 0 4 2
4 0 4 0
P
A 0 1 0 0
5 0 1 0 0
15
50 B
5
D
5 30
15
15
C
Dr. Nejib Zaguia - Automne 2016 50
CSI 3505
Programmation Dynamique
Complexité? O(n3)
Floyd2(n, L[ ] [ ], P[ ][ ])
matrice D de taille n x n
matrice P de taille n x n
D = L; P=0
for(k=1; k<=n; k++) n
for(i=1; i<=n; i++) n
for(j=1; j<=n; j++) n
if D[i,k]+D[k,j] < D[i,j]
D[i,j] = D[i,k]+D[k,j] Constante
P[i, j] = k
retourner D
Dr. Nejib Zaguia - Automne 2016 51
CSI 3505
Programmation Dynamique
10 5 5 10 3
Nourriture+gaz 10 15
livre+first aid+chat 6 18
nourriture+livre+first aid 9 25
Dr. Nejib Zaguia - Automne 2016 52
CSI 3505
Programmation Dynamique
S: ensemble de n objets 1, 2, …, n
pi : poids de l'objet i
gi: gain de l'objet i
K: poids maximum que le sac peut supporter
pi, gi, K: entiers positifs
Applications de ce problème:
scheduling (ordonnancement),
allocation de l’espace dans un disque,
…
G[i, K]
Cas 1. Cas 2.
L'ensemble optimal qui L'ensemble optimal qui donne
donne G[i, K] utilise l'objet i G[i, K] n'utilise pas l'objet i
G[i,K] = G[i-1, K-pi] + gi G[i,K] = G[i-1,K]
(impossible si pi > K)
Exemple: K=10
Objets 1 2 3 4 5
gi 10 5 5 10 3
pi 5 5 2 2 2
Dr. Nejib Zaguia - Automne 2016 57
CSI 3505
Programmation Dynamique
K 0 1 2 3 4 5 6 7 8 9 10
i
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 10 10 10 10 10 10
2 0 0 0 0 0 10 10 10 10 10 15
3 0 0 5 5 5 10 10 15 15 15 15
4 0 0 10 10 15 15 15 20 20 25 25
5 0 0 10 10 15 15 18 20 20 25 25
Dr. Nejib Zaguia - Automne 2016 58
CSI 3505
Programmation Dynamique
Complexité
Taille du problème: n
Opérations: nombre d'entrées dans la table
Cas pire:
(n K)