• Aucun résultat trouvé

a empiler et d´epiler les arguments de la fonction. La programmation dynamique propose un algorithme modifi´e :

T := Tableau d’entier T[0...n]

T[0] <= 0 T[1] <= 1

pour i allant de 2 a n T[i] <= T[i-1] + T[i-2]

Cette solution est en θ(n) pour le temps processeur, mais demande une m´ e-moire additionnelle en O(n).

6.2 Exemple : Multiplication de matrices

Le but de cet algorithme est multiplier une suite de matrice r´eelles, de fa¸con optimale.

SoitA0A1. . . An−1 nmatrices compatibles pour la multiplication, c’est `a dire que pour une matriceAi (avec 1≤i≤n−2 donn´ee dont les dimensions sont (mi, ni), alors mi =ni1 et ni =mi+1.

On admet que la multiplication de 2 matrices de dimension (m, n) et (n, p) se fait en mnpop´erations.

La multiplication de matrice n´etant pas commutative, on ne peut pas ´echanger 2 matrices dans la suite.

6.2.1 Exemple de l’importance du parenth` esage

L’ordre dans lequel on va proc´eder aux multiplications peut influer l’optimalit´e du calcul, en effet :

Soit 3 matricesA,B,C, dont les dimensions respectices sont (p, q), (q, r) et (r, s).

Ces dimensions bien compatibles pour la multiplication.

Nous devons ´evaluerT =A∗B∗C. La multiplication de matrices ´etant associative, on peut proc´eder soit de la mani`ere T =A∗(B∗C) ou T = (A∗B)∗C.

Le cout total de cette m´ethode estT =pqr + prs = pr(q+s).

Deuxi`eme m´ethode (T =A∗(B∗C)):

A

p,q

∗ (B

q,r

∗ C

r,s

)

| {z }

qrs

| {z }

pqs

Le cout total de cette m´ethode estT =qrs + pqs = qs(p+r).

On a un cout total pour ces 2 m´ethodes diff´erent. Prenons un exemple : p= 10 ; q = 104 ; r= 1 ; s= 104

Premi`ere m´ethode : T = 10(104 + 104) = 2∗104 Deuxi`eme m´ethode :T = 108(10 + 1) = 11∗108

Le rapport est donc de 5,5∗103, ce qui est tr`es significatif, d’o`u l’importance du parenth`esage.

6.2.2 Algorithme de calcul.

Cet algorithme va proc´eder en 2 temps :

1 - D´eterminer le coˆut minimum du produit < A0. . . An−1 >.

2 - Calculer < A0. . . An1 > selon le parenth`esage optimal.

6.2.3 Coˆ ut minimum

Notation : Soitmij le nombre minimum de multiplications scalaires pour mul-tipliers les matrices Ai. . . Aj−1.

mi i+1 = 0∀i.

On note m(k)ij le cout du produit parenth´es’e (Ai. . . Ak−1)(Ak. . . Aj−1). On a m(k)ij =mik+mkj +PiPkPj.

Pour touti, j tels que j > i+ 1, on notemij le coˆut optimal pour la multiplication des matrices Ai· · ·Aj1. Ce coˆut est le plus petit mkij.

mij =i < k < jmin (mik+mkj+PiPkPj) On peut en d´eduire le code source de cette fonction ais`ement :

1 int m(int i, int j, tabDimMat P) recouvrement des sous probl`emes : certains coˆuts seront calcul´es plusieurs fois Pour contrer cela, nous allons stocker dans un tableau lesmij dans une matrice :

Les ´el´ements Mii de la diagonale repr´esentent les coˆuts des produitsmii= 0. La diagonale est donc nulle De mˆeme, la diagonale inferieure (Mi i+1) est nulle. On utilise l’algorithme suivant pour remplir la partie inf´erieure du tableau :

// Calcul des problemes de taille 1 pour i allant de 0 a n-1

M[i][i+1] = 0

// Calcul par taille t croissant pour t allant de 2 a n

// calcul pour chaque taille t de tous les problemes de taille t pour i allant de 0 a (n-t)

j = i+t

M[i][i+t] = min( M[i][k] + M[k][i+t] +P[i]*P[i+t]*P[k] )

Chaque diagonale t (´el´ements du tableau m[i][i+t]) repr´esente le coˆut d’un probl`eme de taille t.

On peut maintenant ´etablir l’invariant de l’algorithme de remplissage de la ma-trice des coˆuts :

6.2.4 Calcul optimal du produit

Nous venons de calculer les coˆuts optimaux pour le produits de matrices. Ces coˆuts sont stock´es dans la partie inf´erieure d’une matrice M

Nous allons faire en sorte que la partie sup´erieure de la matrice M contient les valeurs kij tels que l’ont ait le coˆut minimum mij. M[i][j] = mij; M[j][i] = kij. Le coˆutm0n de la multiplication des n−1 matrices se trouve donc en M[0][n].

Il nous reste donc maintenant `a calculer effectivement le produits de ces n−1 matrices en utilisant les informations sur le parenth´esage optimal contenu dans M.

Calcul du produit Ai∗ · · · ∗Aj

1 void multopt(matrice resultat, matrice_couts M, matrice *A, int i, int j)

2 {

3 matrice P1, P2;

4

5 if (j=i+1) resultat= A[i];

6 else {

7 multopt(P1,M,A,M[j][i],j);

8 multopt(P2,M,A,i,M[j][i]);

9 mult_matrice(resultat,P1,P2);

10 }

11 }

L’appel initial `a cette fonction estmultopt(resultat, A, M,0, n).

6.3 Exemple : Recherche du plus long sous-mot commun ` a 2 chaines

Soit 2 mots A etB. Ces mots sont compos´es de caract`eres ai etbj. A≡a0a1a2· · ·am1

B ≡b0b1b2· · ·bm−1

Le probl`eme que nous nous posons ici est de calculer le plus long sous motM commun `a 2 mots A et B.

Soit L(x, y) la longueur du plus long sous-mot commun `a A(x) et B(y) Ainsi pour touti, j on a les propositions suivantes :

i >0et j >0 :ai−1 6=bj−1 ⇒ L(i, j) = max(L(i−1, j), L(i, j−1)) i >0et j >0 :i > ai−1 =bj−1 ⇒ L(i, j) = 1 +L(i−1, j−1))

i= 0 : L(0, j) = 0 j = 0 : L(i,0) = 0

6.3.1 Taille du probl` eme

Le but est de calculer L(m, n) longueur du probl`eme (A(m), B(n)). ∀i, j, L(i, j) sera calcul´e, par taille de probl`eme croissant.

Il faut que chaque valeur L(i, j) ne soit calcul´e qu’une seule fois. C’est pourquoi nous stockerons ces valeurs dans une matriceM[0· · ·m][0· · ·n].

6.3.2 Reconstruction de la solution

// Calcul des pbs de taille 0

pour i allant de 0 a m L[i][0] = 0 pour j allant de 0 a n L[0][j] = 0

// Calcul de tous les probl\‘emes par taille croissant pour t allant de 1 a m

La complexit´e de cet algorithme estθ(m∗n).

6.3.3 Exemple

Voici la matrice g´en´er´ee pour les deux chaˆınes : A= ”bca” B = ”cabd”

6.3.4 Affichage du plus long sous mot

Appelons M(p) le plus long sous-mot commun a A(m) et B(n). La longueur de deM(p) a d´ej`a `et´e calcul´ee et se trouve `a l’emplacement (m, n) de la matrice Ldont la construction vient d’ˆetre d´etaill´ee.

M(p) = m0m1· · ·mp1

. En appelant M(k) le k-pr´efixe, etM(k) le k-suffixe :M(k) =m0m1· · ·mk−1 M(k) =mpmp1· · ·mpk

M(p) =M(k).M(k)

Nous allons construire le programme de reconstruction de la plus longue sous chaˆıne commune, bas´e sur l’invariant suivant :

Invariant : I(k, i, j)≡(M(k) affich´e)∧(M(k) =P LSM(A(i), B(j))reste `a afficher)∧ (M(k).M(k) =M(p))

Init : (k =L[m][n])∧(i=m)∧(j =n) Arrˆet : k = 0

Implications : I(k, i, j)∧(k 6= 0)∧ (L(i, j) = 1 + L(i− 1, j −1)) ∧ (A[i− 1]affich´e)⇒I(k−1, i−1, j−1)

I(k, i, j)∧(k 6= 0)∧(L(i−1, j)> L(i, j−1)) ⇒I(k, i−1, j) I(k, i, j)∧(k 6= 0)∧(L(i−1, j)≤L(i, j−1))⇒I(k, i, j−1)

Le code source de ce programme s’´ecrit tout simplement grˆace `a cet invariant : 1 int k = L[m][n];

2 int i = m;

3 int j = n;

4

5 while (k != 0)

6 {

7 if ( L[i][j] == L[i-1][j-1] )

8 {

9 printf("%c ", A[i-1]);

10 i--; j--; k--;

11 } else if (L[i-1][j] > L[i][j-1]) i--;

12 else j--;

13 }

On peut remarquer que ce programme affiche la plus longe sous-chaˆıne commune dans l’ordre inverse. Toutefois, ce n’est pas si grave car on sait inverser des chaines en temps lin´eaire.

Deuxi` eme partie

IN311 - Programmation

dynamique

Introduction au cours de programmation dynamique

Extrait de la brochure ”Programme des enseignements de 3o Ann´ee” :

La programmation dynamique est une m´ethode d’optimisation op´erant par phases (ou s´equences) dont l’efficacit´e repose sur le principe d’optimalit´e de Bell-man : ”toute politique optimale est compos´ee de sous-politiques optimales”

Cette unit´e met l’accent sur la diversit´e des domaines et des probl`emes d’appa-rence tr`es ´eloign´es qui lorsqu’ils sont correctement mod´elis´es rel`event de la mˆeme technique. Elle permet de mettre en pratique sur des probl`emes de traitement du signal, de contrˆole et d’informatique les concepts abord´es dans les cours d’infor-matique logicielle et mat´erielle des deux premi`eres ann´ees du tronc commun.

R´esoudre un probl`eme d’optimalit´e par la programmation dynamique est, dans ce contexte pr´ecis, une mise en oeuvre significative de la diversit´e des comp` e-tences attendues d’un ing´enieur : mod´elisation du probl`eme, proposition d’une

´equation de r´ecurrence, proposition d’un algorithme efficace de r´esolution du pro-bl`eme (mod´elisation informatique des donn´ees, ´evaluation de complexit´e) ; ´etude des diff´erentes optimisations possibles de l’algorithme ; programmation effective ; possibilit´es d’implantation sur architectures sp´ecifiques d´eduites de l’algorithme et des contraintes de programmation.

Chapitre 7

Applications de la

programmation dynamique

Documents relatifs