La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Module 6 : Programmation dynamique. 26/7/2006Programmation dynamique2 Plan du module De lefficacité dalgorithmes Algorithme de somme minimum Programmation.

Présentations similaires


Présentation au sujet: "Module 6 : Programmation dynamique. 26/7/2006Programmation dynamique2 Plan du module De lefficacité dalgorithmes Algorithme de somme minimum Programmation."— Transcription de la présentation:

1 Module 6 : Programmation dynamique

2 26/7/2006Programmation dynamique2 Plan du module De lefficacité dalgorithmes Algorithme de somme minimum Programmation dynamique Nombres de Fibonacci Problème du partitionnement Plus longue séquence croissante Multiplication de matrices Plus longue sous-suite commune Problème 10131

3 26/7/2006Programmation dynamique3 Algorithme de somme minimum Soit un tableau t[0..n-1] dentiers de longueur n. Une section de t[0..n-1] est le sous-tableau t[i..j] avec 0 ij

4 26/7/2006Programmation dynamique4 Algorithme de somme minimum Première approche Concevoir un algorithme qui calcule S i, j pour i et j fixés Utiliser le programme développé au point précédent pour tous les couples (i,j) possibles et conserver la valeur minimum trouvée.

5 26/7/2006Programmation dynamique5 Algorithme de somme minimum 1. smin := t[0]; 2. i := 0; 3. WHILE i

6 26/7/2006Programmation dynamique6 Algorithme de somme minimum Pour une valeur m donnée, la boucle sur j calcule les sommes S m, m, S m, m+1,… S m, n-1. Chaque somme S m, h est calculée par la boucle (sur k) la plus interne en ignorant quà létape précédente, on a calculé S m, h-1

7 26/7/2006Programmation dynamique7 Algorithme de somme minimum 1. smin := t[0]; 2. i := 0; 3. WHILE i

8 26/7/2006Programmation dynamique8 Algorithme de somme minimum smin_kvaleur minimum de S i, k avec 0ik sminsomme minimum parmi toutes les sommes S i, h dans le sous-tableau t[0..k-1] 0 n-1 k-1k t

9 26/7/2006Programmation dynamique9 Algorithme de somme minimum Le fait dexaminer lélément k introduit un nouvel ensemble de sections : toutes les sections de bornes [i..k] avec 0ik. smin_k := min(smin_k+t[k],t[k])

10 26/7/2006Programmation dynamique10 Algorithme de somme minimum Il ne reste quà mettre à jour smin : smin := min(smin,smin_k)

11 26/7/2006Programmation dynamique11 Algorithme de somme minimum 1. smin := t[0]; 2. smin_k := t[0]; 3. k := 1; 4. WHILE k<>n DO BEGIN 5. smin_k := minimum(smin_k+t[k],t[k]); 6. smin := minimum(smin,smin_k); 7. k := k+1 8. END; 9. somme_minimale := smin Complexité proportionnelle à n

12 26/7/2006Programmation dynamique12 Conclusion Un algorithme peut « souvent/parfois » être amélioré de manière tout à fait notable.

13 26/7/2006Programmation dynamique13 Nombres de Fibonacci F(n) = F(n – 1) + F(n – 2) pour n > 1 F(0) = 0 F(1) = 1

14 26/7/2006Programmation dynamique14 Nombres de Fibonacci 1. FUNCTION fibonacci(n : integer) : longint; 2. BEGIN 3. IF n = 0 4. THEN fibonacci := 0 5. ELSE IF n = 1 6. THEN fibonacci := 1 7. ELSE fibonacci := fibonacci(n-1)+fibonacci(n-2) 8. END;

15 26/7/2006Programmation dynamique15 Nombres de Fibonacci

16 26/7/2006Programmation dynamique16 Nombres de Fibonacci Cette façon de faire est très peu intéressante car les mêmes valeurs sont recalculées sans cesse On peut montrer que pour calculer F(n) le nombre dappels de fonctions dépasse 1.6 n Complexité exponentielle !

17 26/7/2006Programmation dynamique17 Nombres de Fibonacci Amélioration : On peut calculer F(n) en un temps linéaire en mémorisant des valeurs déjà calculées et nécessaires aux calculs suivants On perd de lespace mémoire, mais on gagne du temps

18 26/7/2006Programmation dynamique18 Nombres de Fibonacci F 0 =0 F 1 =1 FOR i:=2 TO n DO F i = F i-1 +F i-2 Complexité proportionnelle à n

19 26/7/2006Programmation dynamique19 Nombres de Fibonacci 1. IF n = 0 2. THEN fibonacci := 0 3. ELSE IF n = 1 4. THEN fibonacci := 1 5. ELSE BEGIN 6. twoback := 0; 7. oneback := 1; 8. FOR i := 2 TO n DO 9. BEGIN 10. current := oneback+twoback; 11. twoback := oneback; 12. oneback := current 13. END; 14. fibonacci := current 15. END

20 26/7/2006Programmation dynamique20 Programmation dynamique La programmation dynamique est une technique dans laquelle on mémorise des résultats déjà obtenus et quon réutilise pour trouver de nouveaux résultats, généralement sur des récurrences

21 26/7/2006Programmation dynamique21 Problème du partitionnement Exemple : On a neuf livres qui ont respectivement 100, 200, 300…900 pages. Trois personnes doivent scanner ces livres. Comment effectuer la répartition de manière à ce que chacun des trois ait à peu près le même nombre de pages à traiter?

22 26/7/2006Programmation dynamique22 Problème du partitionnement Soit un arrangement S de nombres non- négatifs s 1 …s n et un entier k. Le but est de partitionner S en k parties de manière à minimiser la somme des valeurs de chacune des k parties.

23 26/7/2006Programmation dynamique23 Problème du partitionnement Il sagit de placer k-1 séparateurs pour obtenir les k parties. Où placer le dernier séparateur ? Entre le ième et le (i+1)ème élément de S Quel est le coût de cette opération? Le maximum entre le coût de la dernière partie le coût de la plus grande partie à gauche de i

24 26/7/2006Programmation dynamique24 Problème du partitionnement Quel est le coût de la plus grande partie à gauche de i ? Il suffit de placer les k-2 séparateurs restants optimalement sur la partie s 1 …s i On est en présence du problème de départ mais sur une instance plus petite Solution récursive !

25 26/7/2006Programmation dynamique25 Problème du partitionnement Solution récursive exhaustive: Soit M[n,k] le coût minimum du partitionnement de s 1 …s n en k parties

26 26/7/2006Programmation dynamique26 Problème du partitionnement Désavantage : temps de calcul exponentiel puisquon recalcule tout le temps les mêmes valeurs Solution: Stocker les valeurs déjà calculées Nécessite un tableau de k fois n éléments

27 26/7/2006Programmation dynamique27 Problème du partitionnement Optimisation: Pour accélérer les calculs, on se donne un tableau daide p[1..n] avec et : ce qui permet de calculer plus rapidement la récurrence

28 26/7/2006Programmation dynamique28 Problème du partitionnement 1. { compute prefix sums } 2. p[0] := 0; 3. FOR i := 1 TO n DO p[i] := p[i-1] + s[i]; 4. { initialize boundary conditions } 5. FOR i := 1 TO n DO m[i,1] := p[i]; 6. FOR i := 1 TO k DO m[1,i] := s[1]; 7. FOR i := 1 TO n DO 8. FOR j := 1 TO k DO d[i,j] := -1; 9. FOR i := 2 TO n DO 10. FOR j := 2 TO k DO 11. BEGIN 12. m[i,j] := maxint; 13. FOR x := 1 TO i-1 DO 14. BEGIN 15. t := max(m[x,j-1],p[i]-p[x]); 16. IF t < m[i,j] 17. THEN BEGIN 18. m[i,j] := t; 19. d[i,j] := x 20. END 21. END 22. END; Complexité proportionnelle à kn 2

29 26/7/2006Programmation dynamique29 Problème du partitionnement En fait lalgorithme nécessite une deuxième matrice qui mémorise lendroit où les séparateurs sont placés. Le chemin se construit à lenvers à laide dune procédure récursive.

30 26/7/2006Programmation dynamique30 Problème du partitionnement 1. PROCEDURE reconstructPartition(n,k: integer); 2. VAR i : integer; 3. BEGIN 4. IF k = 1 5. THEN FOR i := 1 TO n DO write(s[i]:4) 6. ELSE BEGIN 7. reconstructPartition(d[n,k],k-1); 8. write('|'); 9. FOR i := d[n,k]+1 TO n DO write(s[i]:4) 10. END 11. END;

31 26/7/2006Programmation dynamique31 Problème du partitionnement Voici le résultat du problème de départ | | M D

32 26/7/2006Programmation dynamique32 Plus longue séquence croissante But : trouver une plus longue séquence croissante dans une séquence de n nombres. Attention : les éléments sélectionnés ne doivent pas nécessairement être consécutifs! Exemple : PLSC : ou 2 3 6

33 26/7/2006Programmation dynamique33 Plus longue séquence croissante Que faut-il connaître sur les n-1 premiers élements de la séquence pour pouvoir donner la réponse pour lentièreté de la séquence des n éléments?

34 26/7/2006Programmation dynamique34 Plus longue séquence croissante 1. La longueur de la plus grande séquence dans s 1, s 2 … s n-1 2. La longueur de la plus grande séquence se terminant avec s n !

35 26/7/2006Programmation dynamique35 Plus longue séquence croissante Soit l i la longueur de la plus longue séquence se terminant avec le ième caractère Séquence Longueur l i Prédécesseur

36 26/7/2006Programmation dynamique36 Plus longue séquence croissante Comment calculer l i ? Longueur de la PLSC:

37 26/7/2006Programmation dynamique37 Plus longue séquence croissante Temps de calcul ? Proportionnel à n 2 Peut être amélioré en nlg(n)

38 26/7/2006Programmation dynamique38 Multiplication de matrices On cherche à effectuer un produit de matrices de réels M 1 x M 2 x … M n M i comporte p i-1 lignes et p i colonnes Le nombre de multiplications réelles doit être minimal (la multiplication de 2 matrices se fait de manière usuelle)

39 26/7/2006Programmation dynamique39 Multiplication de matrices Exemple : M 1 (50x10)M 2 (10x20)M 3 (20x5) Comme la multiplication matricielle est associative, il faut trouver la façon optimale deffectuer les multiplications (M 1 M 2 )M 3 50·0· ·20·5 = M 1 (M 2 M 3 )10·20·5 + 50·10·5 = 3500

40 26/7/2006Programmation dynamique40 Multiplication de matrices Soit m(i, j) le nombre minimal de multiplications réelles nécessaires au calcul de M i x M i+1 x … M j Soit (M i … M k ) x (M k+1 … M j ) un parenthésage optimal, alors :

41 26/7/2006Programmation dynamique41 Multiplication de matrices Solution récursive :

42 26/7/2006Programmation dynamique42 Multiplication de matrices La solution qui consiste à explorer toutes les possibilités est à rejeter car cela donne un algorithme de complexité exponentielle. Mieux : stocker les valeurs m[i,j] au fur et à mesure dans un tableau bi- dimensionnel, en fait une matrice triangulaire supérieure

43 26/7/2006Programmation dynamique43 Multiplication de matrices Pour notre exemple, M aura les valeurs suivantes : Ordre de calcul

44 26/7/2006Programmation dynamique44 Multiplication de matrices Pour les matrices M 1 …M 6 de dimensions respectives 6, 12, 20, 3, 10, 5, 18 Solution : ((1*(2*3))*((4*5)*6))

45 26/7/2006Programmation dynamique45 Multiplication de matrices 1. FOR i := 1 TO n DO m[i,i] := 0; 2. FOR l := 2 TO n DO 3. FOR i := 1 TO n-l+1 DO 4. BEGIN 5. j := i+l-1; 6. m[i,j] := maxint; 7. FOR k := i TO j-1 DO 8. BEGIN 9. q := m[i,k]+m[k+1,j] + p[i-1]*p[k]*p[j]; 10. IF q < m[i,j] 11. THEN BEGIN 12. m[i,j] := q; 13. s[i,j] := k 14. END 15. END 16. END; Complexité proportionnelle à n 3

46 26/7/2006Programmation dynamique46 Multiplication de matrices Pour afficher le parenthésage optimal, il suffit deffectuer un parcours récursif dans la matrice m.

47 26/7/2006Programmation dynamique47 Multiplication de matrices 1. PROCEDURE print_matrix_chain_multiply(i,j : integer); 2. BEGIN 3. IF j > i 4. THEN BEGIN 5. write('('); 6. print_matrix_chain_multiply(i,s[i,j]); 7. write('*'); 8. print_matrix_chain_multiply(s[i,j]+1,j); 9. write(')') 10. END 11. ELSE write(i) 12. END; Appel : print_matrix_chain_multiply(1,n)

48 26/7/2006Programmation dynamique48 Plus longue sous-suite commune Une sous-suite dune suite est la suite en question dont éventuellement certains éléments sont manquants. Exemple : BCDB est une sous-suite de la suite ABCBDAB Soit deux suites X et Y. On appelle sous-suite commune une suite qui est sous-suite de X et de Y Exemple : X = ABCBDAB Y=BDCABA BCA est une sous-suite commune à X et Y alors que BCBA et BDAB sont deux sous-suites les plus longues communes à X et à Y

49 26/7/2006Programmation dynamique49 Plus longue sous-suite commune Calculer la PLSSC de deux suites par la force brute nest pas praticable dû au nombre exponentiel de possibilités.

50 26/7/2006Programmation dynamique50 Plus longue sous-suite commune Soit X i = x 1 x 2 …x i le ième préfixe de X=x 1 x 2..x m Soit c[i,j] la longueur de la PLSSC de X i et Y j. Si x i y j alors la PLSSC ne peut inclure à la fois x i et y j. Donc elle doit être soit une PLSSC de x 1 x 2 …x i-1 et y 1 y 2 …y j une PLSSC de x 1 x 2 …x i et y 1 y 2 …y j-1

51 26/7/2006Programmation dynamique51 Plus longue sous-suite commune Si i ou j vaut 0, alors c[i,j] = 0. Si x i = y j et i,j >0, alors c[i,j] = c[i-1,j-1]+1 Si x i y j et i,j >0, alors C[i,j] = max(c[i,j-1], c[i-1,j])

52 26/7/2006Programmation dynamique52 Plus longue sous-suite commune 1. FOR i := 0 TO m DO c[i,0] := 0; 2. FOR j := 0 TO n DO c[0,j] := 0; 3. FOR i := 1 TO m DO 4. FOR j := 1 TO n DO 5. IF x[i] = y[j] 6. THEN BEGIN 7. c[i,j] := c[i-1,j-1]+1; 8. b[i,j] := upleft 9. END 10. ELSE IF c[i-1,j] >= c[i,j-1] 11. THEN BEGIN 12. c[i,j] := c[i-1,j]; 13. b[i,j] := up 14. END 15. ELSE BEGIN 16. c[i,j] := c[i,j-1]; 17. b[i,j] := left 18. END; 19. lcs := c[m,n] Complexité proportionnelle à m·n

53 26/7/2006Programmation dynamique53 Plus longue sous-suite commune Laffichage du résultat (la sous-suite commune) se fait à laide dun parcours récursif dans le tableau daide B à deux entrées (pour X et pour Y) rempli des valeurs (left, up, upleft).

54 26/7/2006Programmation dynamique54 Plus longue sous-suite commune B D C A B A A 0 0U 0U 0U 1\ 1L 1\ B 0 1\ 1L 1L 1U 2\ 2L C 0 1U 1U 2\ 2L 2U 2U B 0 1\ 1U 2U 2U 3\ 3L D 0 1U 2\ 2U 2U 3U 3U A 0 1U 2U 2U 3\ 3U 4\ B 0 1\ 2U 2U 3U 4\ 4U début

55 26/7/2006Programmation dynamique55 Plus longue sous-suite commune 1. PROCEDURE print_lcs(s : string200; i,j : integer); 2. BEGIN 3. IF (i<>0) AND (j<>0) 4. THEN IF b[i,j] = upleft 5. THEN BEGIN 6. print_lcs(s,i-1,j-1); 7. write(s[i]) 8. END 9. ELSE IF b[i,j] = up THEN print_lcs(s,i-1,j) 10. ELSE print_lcs(s,i,j-1) 11. END;

56 26/7/2006Programmation dynamique56 Problème Some people think that the bigger an elephant is, the smarter it is. To disprove this, you want to take the data on a collection of elephants and put as large a subset of this data as possible into a sequence so that the weights are increasing, but the IQ's are decreasing. The input will consist of data for a bunch of elephants, one elephant per line, terminated by the end-of-file. The data for a particular elephant will consist of a pair of integers: the first representing its size in kilograms and the second representing its IQ in hundredths of IQ points. Both integers are between 1 and The data will contain information for at most 1000 elephants. Two elephants may have the same weight, the same IQ, or even the same weight and IQ.

57 26/7/2006Programmation dynamique57 Problème Say that the numbers on the i-th data line are W[i] and S[i]. Your program should output a sequence of lines of data; the first line should contain a number n; the remaining n lines should each contain a single positive integer (each one representing an elephant). If these n integers are a[1], a[2],..., a[n] then it must be the case that W[a[1]] < W[a[2]] <... < W[a[n]] and S[a[1]] > S[a[2]] >... > S[a[n]] In order for the answer to be correct, n should be as large as possible. All inequalities are strict: weights must be strictly increasing, and IQs must be strictly decreasing. There may be many correct outputs for a given input, your program only needs to find one.

58 26/7/2006Programmation dynamique58 Problème Sample Input Sample Output


Télécharger ppt "Module 6 : Programmation dynamique. 26/7/2006Programmation dynamique2 Plan du module De lefficacité dalgorithmes Algorithme de somme minimum Programmation."

Présentations similaires


Annonces Google