Vous êtes sur la page 1sur 59

CSI 3505 / Automne 2016: Conception et Analyse des Algorithmes I.

 Plan du Cours
 Introduction (Chapitre 1)

 Techniques de résolution: Diviser pour régner (Chapitre 2)

 Techniques de résolution: Programmation dynamique (Chap 3)

 Techniques de résolution: Algorithmes voraces(Chapitre 4)

 Techniques de résolution: Algorithmes retour arrière (Chapitre 5)

 Introduction a la théorie de Complexité du calcul(Chapitre 9)

Dr. Nejib Zaguia - Automne 2016 1


CSI 3505
Programmation Dynamique

Exemples traités dans ce chapitre


 Le calcul du coefficient binomial

 Multiplication d’une chaîne de matrices.

 Les plus courts chemins dans un graphe (Algorithme de


Floyd)

 Problème du sac à dos

Dr. Nejib Zaguia - Automne 2016 2


CSI 3505
Programmation Dynamique

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.

 Si on résout chaque sous exemplaire séparément sans tenir


compte de cette duplication on obtient un algorithme très
inefficace.

 Par contre, si on résout chaque sous exemplaire différent une


seule fois (en sauvegardant les résultats) on obtient un
algorithme performant.

Dr. Nejib Zaguia - Automne 2016 3


CSI 3505
Programmation Dynamique

 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.

Dr. Nejib Zaguia - Automne 2016 4


CSI 3505
Programmation Dynamique

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"

 « même un Congresman ne peut avoir une objection"

Référence: Bellman, R. E. Eye of the Hurricane, An Autobiography.

Dr. Nejib Zaguia - Automne 2016 5


CSI 3505
Programmation Dynamique

Quelques algorithmes très connus de type programmation


dynamique.
 Viterbi pour les modèles cachés de Markov.

 Unix diff pour comparer deux fichiers.

 Smith-Waterman pour l’alignement de suite.

 Bellman-Ford pour le plus petit chemin dans les réseaux.

 Cocke-Kasami-Younger pour les arbres de syntaxe des

grammaires libre de contexte.

Dr. Nejib Zaguia - Automne 2016


6
CSI 3505
Programmation Dynamique

 (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

n c(n,0) c(n,1) c(n,2) c(n,3) c(n,4) c(n,5) c(n,6)


0 1
1 1 1
2 1 2 1
3 1 3 3 1
4 1 4 6 4 1
5 1 5 10 10 5 1
6 1 6 15 20 15 6 1

Dr. Nejib Zaguia - Automne 2016


8
CSI 3505
Programmation Dynamique

 le calcul du coefficient binomial: C(n, k) ou aussi n


k
Algorithme 1: Utiliser la formule
C(n, k) = n! / k!(n-k)! Pour tout k, 0  k  n
Mauvais algorithme et formule inutilisable : le problème de faire des
calculs avec des gros nombre “n!, k!, (n-k) !”

Algorithme 2: Utiliser la formule récursive


n - 1 + n - 1 Si 0 < k < n
n k-1 k
C(n, k) = k =
1 Sinon

Dr. Nejib Zaguia - Automne 2016 9


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) )
}

Dr. Nejib Zaguia - Automne 2016 10


CSI 3505
Programmation Dynamique
C(5,2)
Calcul de C(5,2)
C(4,2) Répétition C(4,1)

C(3,2) C(3,1) C(3,1) C(3,0)

C(2,1) C(2,0) C(2,1) C(2,0) C(2,1) C(2,0)

C(1,0) C(1,1) C(1,0) C(1,1) C(1,0) C(1,1)

Complexité de l’algorithme 2: le nombre d’appels est le même que C(n, k)


n

Dr. Nejib Zaguia - Automne 2016
k 11
CSI 3505
Programmation Dynamique

Meilleure idée: Algorithme 3

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)

Dr. Nejib Zaguia - Automne 2016 12


CSI 3505
Programmation Dynamique

Idée de l’algorithme 3: utiliser un tableau des résultats intermédiaires


0 1 2 3 … k-1 k
0 1
1 1 1
2 1 2 1
3 1 3 3 1
.
. C(n-1,k-1) C(n-1,k)

n-1
n C(n,k)

Dr. Nejib Zaguia - Automne 2016 13


CSI 3505
Programmation Dynamique

Remplir le tableau ligne par ligne


Taille du problème: n
Opérations: nombre d’entrées dans la matrice
0 1 2 3
0 1

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

Dr. Nejib Zaguia - Automne 2016 14


CSI 3505
Programmation Dynamique

 Complexité (n-k-1) fois

W(n) = 1+2+3+….+k+ (k+1) + (k+1) +….+ (k+1)  O(k n )

Cas pire, lorsque k est d’ordre O(n) W(n)  O(n2)

En fait la matrice n'est pas nécessaire, il suffit de mettre a jour de droite


à gauche un tableau de longueur k représentant la ligne courante
Temps: O(nk) Espace: O(k)
Dr. Nejib Zaguia - Automne 2016 15
CSI 3505
Programmation Dynamique

La méthode Diviser pour régner: une méthode descendante


subdiviser le problème en sous-problèmes indépendants,
résoudre récursivement et combiner
Programmation dynamique: une méthode ascendante
éviter de recalculer la même chose plus qu’une
fois, en utilisant une table des résultats déjà
calculés, Cette table est remplie au fur et à mesure
qu'on résout les sous- problèmes.
Une technique qui s’applique typiquement aux problèmes d’optimisation
Dr. Nejib Zaguia - Automne 2016 16
CSI 3505
Programmation Dynamique

Il y a 4 étapes dans un algorithme de type Programmation


dynamique.

1. Caractériser la structure d’une solution optimale

2. Définir la valeur de la solution optimale récursivement

3. Calculer la valeur de la solution optimale du bas vers le haut

4. Construire une solution optimale à partir des informations


obtenues

Dr. Nejib Zaguia - Automne 2016 17


CSI 3505
Programmation Dynamique

Multiplication chaînée de matrices


Problème: On veut calculer le produit de n matrices données :
M = M1 * M2 * ... Mn
Important: pour tout i<n, nombre de colonnes de Mi = nombre de lignes de Mi+1
(La taille de la matrice Mi : di-1 x di)

Comme le produit matriciel est associatif, il y a plusieurs façon de


calculer ce produit :
M = (...(M1 * M2 )* M3)... Mn)
M = (M1 * M2 )*(M3 * M4) * ... Mn)
.........
M = (M1 * (M2 * ... (Mn-1 * Mn)...)
Dr. Nejib Zaguia - Automne 2016 18
CSI 3505
Programmation Dynamique

Multiplication chaînée de matrices


 Un produit de deux matrice A(p,q) et B(q,r)
nécessite p*q*r multiplications et donne comme
résultat une matrice C(p,r)

 Il en découle que le nombre d’opérations


élémentaires nécessaire pour calculer
M = M1 * M2 * ... Mn
dépend de la façon dont on a inséré les parenthèses
Dr. Nejib Zaguia - Automne 2016 19
CSI 3505
Programmation Dynamique

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

Ordre 2: (M1 x (M2 x M3)) x M4


Coût(M2 x M3 ) = 20 x 50 x 1
Coût(M1 x (M2 x M3 )) = 10 x 20 x 1
Coût((M1 x (M2 x M3)) x M4 ) = 10 x 1 x 100
Coût total = 2200
Dr. Nejib Zaguia - Automne 2016 20
CSI 3505
Programmation Dynamique

Multiplication chaînée de matrices

 Le problème est de trouver la meilleur façon d’insérer les


parenthèses pour calculer M, c-a-d celle qui minimise le
nombre de multiplications élémentaires.

 Une méthode directe pour résoudre ce problème est de


générer tous les cas possibles et choisir le meilleur d’entre
eux.

Dr. Nejib Zaguia - Automne 2016 21


CSI 3505
Programmation Dynamique

 Idée 1: approche directe

Il y a 5 possibilités pour le produit M1 M2 M3 M4 :


 (M1 (M2(M3M4)))
 ((M1 M2)(M3M4))
 (M1 ((M2M3)M4))
 ((M1 (M2M3))M4)
 (((M1 M2)M3)M4)

Dr. Nejib Zaguia - Automne 2016 22


CSI 3505
Programmation Dynamique

Pour un produit de n matrices il existe T(n) manière d’insérer


des parenthèses

M = (M1 M2 … Mi) (Mi+1 Mi+2 … Mn)


T(i) n-1 T(n-i)
T(1) = 1 T(n) =  T(i) T(n-i)
i=1

Donc la méthode directe pour trouver la meilleure façon d’insérer


des parenthèses dans un produit de n matrices est très inefficace.

Dr. Nejib Zaguia - Automne 2016 23


CSI 3505
Programmation Dynamique

 Complexité: (nombres de Catalan)

2n -2
T(n) = 1/n ( n-1 )
T(n)  (4n/n3/2)

n 1 2 3 4 5 ... 10 ... 15

T(n) 1 1 2 5 14 ... 4862 ... 2674440

Dr. Nejib Zaguia - Automne 2016 24


CSI 3505
Programmation Dynamique

 Idée 2: Programmation dynamique


1) Caractériser la structure d'une solution optimale
Principe d’optimalité:
Si
(M1 x (M2 x M3 )) x M4 est une solution optimale pour M1 x M2 x M3 x
M4 ,
Alors
(M1 x (M2 x M3 )) est une solution optimale pour M1 x M2 x M3

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

1) Caractériser la structure d'une solution optimale

Si M = (M1 M2 … Mi) (Mi+1 Mi+2 … Mn) est une solution


optimale pour le produit M1 M2 … Mn alors :

(M1 M2 … Mi) est optimale pour le produit M1 … Mi


ET
(Mi+1 Mi+2 … Mn) est optimale pour le produit Mi+1 … Mn
Pour 1  i  j  n,, m[i, j] dénote une solution optimale
pour le produit Mi Mi+1 … Mj
Dr. Nejib Zaguia - Automne 2016 26
CSI 3505
Programmation Dynamique

2) Définir récursivement la valeur d'une solution optimale en


fonction des solutions optimales des sous- problèmes.
(M1 M2 M3 M4 M5 M6 ) m[1 ,6] = ?

( (M1) (M2 M3 M4 M5 M6 ) ) m[1,1] + m[2,6] + d0 d1 d6


( (M1 M2) (M3 M4 M5 M6 ) ) m[1,2] + m[3,6] + d0 d2 d6
( (M1 M2 M3) (M4 M5 M6 ) ) m[1,3] + m[4,6] + d0 d3 d6
( (M1 M2 M3 M4) (M5 M6 ) ) m[1,4] + m[5,6] + d0 d4 d6
( (M1 (M2 M3 M4 M5) (M6 ) ) m[1,5] + m[6,6] + d0 d5 d6

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, k] = Coût optimal pour Mi x … x Mk


m[k+1, j] = Coût optimal pour Mk+1 x … x Mj
di-1dkdj = Coût pour (Mi x … x Mk) x (Mk+1 x … x Mj)

Dr. Nejib Zaguia - Automne 2016 28


CSI 3505
Programmation Dynamique

Utilisant une méthode récursive du haut vers le bas:

m[i, j]  min
 <
{ m[i, k]  m[k  1, j]  di-1dk dj }
i k j

n1
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

 du haut vers le bas:

 m[1,6] --> m[1,1], m[2,6], m[1,2], m[3,6], m[1,3],


m[4,6],m[1,4], m[5,6], m[1,5], m[6,6]

 m[2,6] --> m[2,2], m[3,6], m[2,3], m[4,6],m[2,4],


m[5,6], m[2,5], m[6,6]

Dr. Nejib Zaguia - Automne 2016 30


CSI 3505
Programmation Dynamique

On utilise l'approche ascendante (du bas vers


le haut): la programmation dynamique
Le nombre de sous problèmes?
Combien de m[i,j] doit on calculer?

O(n2)

Dr. Nejib Zaguia - Automne 2016 31


CSI 3505
Programmation Dynamique

Construire un tableau 2-dimentionelle (m[i; j]).

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

Dr. Nejib Zaguia - Automne 2016 32


CSI 3505
Programmation Dynamique

 Comment calculer m[1, 6]?


m[i, j]  min{ m[i, k]  m[k  1, j]  di-1dkd j }
ik< j
1 2 3 4 5 6 Solution
m[1,6]
1 0 x x x x x
2 0 x x x x
3 0 x x x
4 0 x x
5 0 x
6 0

Dr. Nejib Zaguia - Automne 2016 33


CSI 3505
Programmation Dynamique

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

Dr. Nejib Zaguia - Automne 2016 34


CSI 3505
Programmation Dynamique

 É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

= min {23000,65000,2200} = 2200

k=3

Dr. Nejib Zaguia - Automne 2016 36


CSI 3505
Programmation Dynamique

Comment construire une solution optimale?


On a besoin de garder les valeurs de k représentant la coupure
optimale pour m[i, j]

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

(M1 x (M2 x M3)x M4)


Dr. Nejib Zaguia - Automne 2016 37
CSI 3505
Programmation Dynamique

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

Le problème des plus courts chemins: Algorithme de Floyd


Problème: Trouver les plus courts chemins entre chaque couple de
sommets d’un graphe.
A
10 50

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’est un problème d’optimisation et vérifie le principe d’optimalité:


Si le plus court chemin entre A et B passe par un sommet C, alors
les sous-chemins A-C et C-B sont aussi optimaux.

C B
A

Si C ----- B est plus court que C ----- B


alors
A ----- C ----- B est plus court que A-----C-----B
Dr. Nejib Zaguia - Automne 2016 40
CSI 3505
Programmation Dynamique

Les plus courts chemins (Algorithme de Floyd)


 Soit L la matrice associée à un graphe G, L[i, j] est le coût de l’arc de i vers j.
 Si i=j Alors L[i, j] = 0 et s’il n’y a pas d’arc entre i et j alors L[i, j] =.
5
A B
A B C D 50

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

Principe de l’algorithme de Floyd:


 Construire une matrice D (initialisée à L).
 Après chaque itération k de l’algorithme, la matrice D contiendra
les plus courts chemins entre chaque paire de sommets (i, j), ne
passant que par les sommets appartenant à l’ensemble {1, 2, ..., k}.
 Après l’itération n, D contiendra les plus courts chemins entre
chaque paire de sommets.

A l'itération k, et pour chaque paire de sommets (i, j), il faut


vérifier si l'on peut trouver un chemin passant par le sommet k
et qui soit meilleur que le chemin actuel.

Dr. Nejib Zaguia - Automne 2016 42


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

 A l’étape k de l’algorithme on calcule les nouvelle


valeurs de D pour chaque paire de sommets de la
façon suivante:

Dk[i,j] = min ( Dk-1[i,j] , Dk-1[i,k] + Dk-1[k,j] )

Dr. Nejib Zaguia - Automne 2016 44


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

Dr. Nejib Zaguia - Automne 2016 45


CSI 3505
Programmation Dynamique

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

Comment construire une solution optimale (plus court chemin)?


 On a besoin de garder les sommets par où le plus court chemin

passe
 Deuxième matrice P initialisée à 0.

si D[i,k]+D[k,i] < D[i,j]


alors
D[i,j] = D[i,k]+D[k,i]
P[i,j] = k

Dr. Nejib Zaguia - Automne 2016 48


CSI 3505
Programmation Dynamique

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

Problème du sac à dos


Objets a apporter dans un sac de Capacité 10?
nourriture gaz first aid livre chat
Poids 5 5 2 2 2

10 5 5 10 3

Des solutions admissibles: Poids

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

Problème: Déterminer un sous-ensemble A


de S qui peut être mis dans le sac et qui
maximise les gains.
Dr. Nejib Zaguia - Automne 2016 53
CSI 3505
Programmation Dynamique

Le problème est de trouver un sous ensemble d’objets A,


 qui maximise  (gi: objet i est dans A)

 Avec la condition que :  (pi : objet i est dans A)  K

Applications de ce problème:
scheduling (ordonnancement),
allocation de l’espace dans un disque,

Dr. Nejib Zaguia - Automne 2016 54


CSI 3505
Programmation Dynamique

Propriété récursive du problème:

G[i, K] = gains maximum avec conditions:


1. le choix est parmi les objets {1, …, i},
2. le poids maximal ne doit pas dépasser K.

Le problème est de calculer : G[n, K]


CSI 3505
Programmation Dynamique

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)

Base: Si i = 0 ou K = 0, alors G[i, K] = 0

Dr. Nejib Zaguia - Automne 2016 56


CSI 3505
Programmation Dynamique

Pour i=0 ou K=0, G[i,K] = 0

Pour i>0, K>0


max{gi+G[i-1,K-pi], G[i-1,K]) pi  K
G[i,K] =
G[i-1,K] 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)

Dépend de K, la capacité maximale du sac !

Dr. Nejib Zaguia - Automne 2016 59

Vous aimerez peut-être aussi