Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

4 Dynam

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 30

Programmation dynamique

A. Principe général
B. Application
Triangle de Pascal
Série mondiale
Multiplication chaînée de matrices
Les plus courts chemins
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.

• Idée de base :

Éviter de calculer deux fois la même chose, normalement en


utilisant une table de résultats déjà calculés, remplie au fur et à
mesure qu'on résout les sous problèmes.
Programmation dynamique

Principe général
• Remarques

— C'est une méthode ascendante :On commence d'habitude par les


sous problèmes les plus petits et on remonte vers les sous
problèmes de plus en plus difficile.

— La programmation dynamique est souvent employée pour


résoudre des problèmes d'optimisation satisfaisant le principe
d'optimalité : " Dans une séquence optimale (de décisions ou de
choix), chaque sous-séquence doit aussi être optimale".
Programmation dynamique

Application 1 : Calcul de Cnp

• Formules
Cnp = Cn-1p-1 + Cn-1p

C00 = Cn0 = Cnn = 1

• On peut donner un algorithme récursif.


Programmation dynamique

Application 1 : Calcul de Cnp


• On peut aussi faire le calcul par programmation dynamique.
(triangle de Pascal)

0 1 2 3 4
0! 1
1! 1 1
2! 1 2 1
3! 1 3 3 1
4! 1 4 6 4 1
Programmation dynamique

Application 2 : Série mondiale

• A et B disputent une série de matchs( au maximum 2n-1).

• L'équipe gagnante est celle qui reporte n victoires.

• La probabilité que A gagne est une partie = q1


• La probabilité que B gagne est une partie = q2
Programmation dynamique

Application 2 : Série mondiale

• On définit P(i, j) comme la probabilité que A remporte la série,


sachant qu'elle doit encore gagner i victoires contre B j victoires.

• On a ainsi :

P(0, j) = 1 ( A a déjà gagné la série et j > 0)


P(i, 0) = 0 ( A a déjà perdu la série et i > 0)

• P(0, 0) indéfini
• P(i, j) = q1*P(i-1, j) + q2*P(i, j-1) i, j > 0
Programmation dynamique

Application 2 : Série mondiale


• Algorithme récursif :
P(i, j) :
Si i = 0 et j > 0 :
P := 1
Sinon
Si i > 0 et j = 0 : P := 1
Sinon
Si i > 0 et j > 0 :
P:=q1*P(i-1,j) + q2*P(i, j-1)
Programmation dynamique

Application 2 : Série mondiale


• T(k) = temps d'exécution de P(i, j) avec k = i+j
• Équation de récurrence :

T(k) = 2T(k-1) + b
• Solution :
T(k) = C12k + C2
==> O(2k) = O(2i+j)

• P(n, n) = O(4n)
Programmation dynamique

Application 2 : Série mondiale


• Programmation dynamique
P(i, j)
Pour S = 1, i+j
P[0, S] := 1
P[S, 0] := 0
Pour k=1, S-1
P[k, S-k] := q1P[k-1, S-k] + q2P[k, S-k-1]
Finpour
Finpour

• C'est O(n2)
Programmation dynamique

Application 2 : Série mondiale


• Utilisation d'une table:

0 1 2 3 4
0 1 1 1 1
1 0 1/2 3/4 7/8 15/16
2 0 1/4 1/2 11/16 13/16
3 0 1/8 5/16 1/2 21/32
4 0 1/16 3/16 11/32 1/2
Programmation dynamique

Application 3 : Les plus courts chemins (Algorithme de Floyd)

• Le problème consiste à trouver les plus courts chemins entre


chaque couple de sommets d’un graphe.

• C’est un problème d’optimisation et il 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.
Programmation dynamique

Application 3 : Les plus courts chemins (Algorithme de Floyd)

• Soit L la matrice associée à un graphe G, on a donc L[i,j]


représentant le coût de l’arc entre i et j. Si i=j on prendra L[i,j] = 0
et s’il n’y a pas d’arc entre les sommet i et j alors L[i,j] = ∞.
Programmation dynamique

Application 3 : Les plus courts chemins (Algorithme de Floyd)


• Le principe de l’algorithme et de construire une matrice D
(initialisée à L) et qui contiendra après chaque itération k, les plus
courts chemins entre chaque paire de sommets (i,j), ne passant que
par les sommets appartenant à l’ensemble {1,2,3,..k}.

• Après l’itération n, D contiendra les plus courts chemins entre


chaque paire de sommets.

• A l’étape k on calcule les nouvelle valeurs de D pour chaque paire


de sommet de la façon suivante :

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


Programmation dynamique

Application 3 : Les plus courts chemins (Algorithme de Floyd)


Exemple :
Programmation dynamique

Application 3 : Les plus courts chemins (Algorithme de Floyd)

• La matrice associée est L ( = D0) :

0 1 3
∞ 0 1
1 3 0
Programmation dynamique

Application 3 : Les plus courts chemins (Algorithme de Floyd)

• - Étape 1 on vérifie si le sommet 1 peu améliorer les chemins


existant, on aura la matrice D1 :

0 1 3
∞ 0 1
1 2 0
Programmation dynamique

Application 3 : Les plus courts chemins (Algorithme de Floyd)

• - Étape 2, construction de D2 :

0 1 2
∞ 0 1
1 2 0
Programmation dynamique

Application 3 : Les plus courts chemins (Algorithme de Floyd)

• - Étape 3, construction de D3 :

0 1 2
2 0 1
1 2 0
Programmation dynamique

Application 3 : Les plus courts chemins(Algorithme de Floyd)


• PROCEDURE Floyd ( L , var D )

D := L;
Pour k := 1 , n
Pour i := 1 , n
Pour j := 1 , n
D[i,j] := min ( D[i,j] , D[i,k] + D[k,j] )
Fpour
Fpour
Fpour

• Cet algorithme est en o(n3).


Programmation dynamique

Application 4 : Multiplication chaînée de matrices


• On veut calculer le produit de n matrices données :
M = M1 * M2 * ... Mn

• 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)...)
Programmation dynamique

Application 4 : Multiplication chaînée de matrices

• Un produit de deux matrice A(p,q) et B(q,r) nécessite p*q*r


multiplications de scalaires 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, dépend de la façon dont on a inséré les
parenthèses.
Programmation dynamique

Application 4 : Multiplication chaînée de matrices


• Exemples : Soit à calculer M = A * B * C * D , A(13,5) B(5,89)
C(89,3) D(3,34)
• Il existe 5 façons de calculer M et pour chacune d’elles on donnera
le nombre de multiplications nécessaire :

— ((A B) C) D nécessite 10 582 mult.


— (A B) (C D) nécessite 54 201 mult.
— (A (B C)) D nécessite 2 856 mult.
— A ((B C) D) nécessite 4 055 mult.
— A (B (C D)) nécessite 26 418 mult.
Programmation dynamique

Application 4 : 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.
Programmation dynamique

Application 4 : Multiplication chaînée de matrices


• Pour un produit de n matrices il existe T(n) manière d’insérer des
parenthèses,
n −1
T( n ) = ∑ T( i ) T( n − i )
i=1

n 1 2 3 4 10 15
T(n) 1 1 2 5 4862 2 674 440
Nombres de Catalan.
avec T(1) = 1 on a T(10) = 4 862 et T(15) = 2 674 440, en fait ce
nombre croît en Ω(4n/n2)

• Donc trouver la meilleure façon d’insérer des parenthèses dans un


produit de n matrices la méthode directe est très inefficace.
Programmation dynamique

Application 4 : Multiplication chaînée de matrices


• On remarque que ce problème vérifie le principe d’optimalité :
• Si la meilleure façon d’insérer des parenthèses consiste à couper
entre la matrice Mi et Mi+1, c’est à dire M = Prod (M1,M2 ... Mi) *
Prod (Mi+1,...Mn); alors les deux sous produits doivent être
découpés de façon optimale.

• En procédant par programmation dynamique, on construit une


table m(i,j) (1 ≤ i ≤ j ≤ n)

• où chaque élément m[i,j] donnera le plus petit nombre de


multiplications nécessaire pour calculer le produit Mi * Mi+1 * ...
Mj
Programmation dynamique

Application 4 : Multiplication chaînée de matrices


• Les dimensions des matrices Mj sont données dans un vecteur d(i)
(0 ≤ i ≤ n) tel que Mk est de dimension (d[k-1] , d[k] ).
• La construction de la matrice se fera diag / diag . La diagonale s
contient les m[i,j] tel que j-i=s.

• Pour s = 0 m[i,i] = 0
• Pour s = 1 m[i,i+1] = d[i-1] * d[i] * d[i+1]
• pour 1<s<n
m[i,i+s] = min (m[i,k]+m[k+1,i+s] + d[i-1]*d[k]*d[i+s])
≤ k ≤ i+s-1
i = 1, 2, …n-s
Programmation dynamique

Application 4 : Multiplication chaînée de matrices


• Exemple
• d = ( 13, 5, 89, 3, 34 )
• pour s = 1
m12 = 5785 m23=1335 m34=9078

• pour s = 2
m13=min(m11+m23+13*5*3, m12+m33 +13*89*3 )
=min(1350, 9256) = 1530

m24=min(m22+m34+5*89*34, m23+m44+5*3*34)
=min(24208, 1845) = 1845
Programmation dynamique

Application 4 : Multiplication chaînée de matrices


• pour s = 3
m14= min ( m11 + m24 + 13 * 5 * 34,
m12 + m34 + 13 * 89 * 34,
m13 + m44 + 13 * 3 * 34 )

= min (4055, 54201, 2856) = 2856


Programmation dynamique

Application 4 : Multiplication chaînée de matrices

J=1 2 3 4
i= 1 0 5785 1530 2856
S=3
2 0 1335 1845
S=2
3 0 9078
S=1
4 0
S=0

Vous aimerez peut-être aussi