Chapitre 6 Programmation Dynamique. Méthodes P.S.E.P. 6.1 Programmation dynamique 6.1.1 Exemple introductif Problème : n matrices M i (m i, m i+1 ) à multiplier en minimisant le nombre de multiplications, variable selon le parenthésage. Exemple 1 On donne M 1 (100, 1), M 2 (1, 100), M 3 (100, 10), M 4 (10, 20) alors (M 1 M 2 )(M 3 M 4 ) prend 230000 multiplications scalaires : 100 1 100 pour M 12 = M 1 M 2, (100, 100) et 100 10 20 pour M 34 = M 3 M 4, (100, 20) puis 100 100 20 pour M 12 M 34. M 1 ((M 2 M 3 )M 4 ) prend 3200 opérations : 1 100 10 pour M 23 = M 2 M 3 (1, 10), 1 20 pour M 24 = M 23 M 4 (1, 20) et 100 1 20 pour le produit final. Moralité : il faut calculer le meilleur parenthésage avant de se lancer dans les calculs, à condition que le calcul du parenthésage ne soit pas trop coûteux. Comme il y a un nombre exponentiel de parenthésage possibles, (voir exercice), il n est pas efficace de les énumérer tous. On va utiliser la programmation dynamique pour trouver le meilleur parenthésage possible. Généralisation : on généralise le problème en trouver le meilleur parenthésage pour M i M i+1...m j pour tout couple i, j tel que 1 i j n. La solution du problème initial est obtenue pour i = 1, j = n. On calcule c(i, j) le nombre minimal d opérations requis pour M i M i+1...m j. Formulation récursive : c(i, j) = Min i p<j (c(i, p) + c(p + 1, j) + m i m p+1 m j+1 ) Pour avoir aussi le parenthésage on se rappelle les p qui donnent le minimum. 1
2 CHAPITRE 6. PROGRAMMATION DYNAMIQUE. MÉTHODES P.S.E.P. Organisation des calculs de manière itérative : La formule récursive donne lieu à un arbre de calculs contenant beaucoup de redondance. Pour éviter ces calculs redondants on effectue les calculs en partant des feuilles de l arbre, en calculant successivement les c(i, j) pour j i = k, k une constante qui vaudra 0, 1,..., n 1. Etape 0 : Pour tout i = 1,..., n c 0 (i, i) = 0 Etape k : Pour tout i, j dans 1,...,n tels que j i = k, calculer c k (i, j) = Min i p<j (c p i (i, p) + c j p 1 (p + 1, j) + m i m p+1 m j+1 ) On retient les valeurs de p donnant le minimum. Arrêt pour k = n 1 et solution pour i = 1, j = n. Remontée des calculs : on trouve un parenthèsage optimal en remontant du résultat vers les feuilles en utilisant un p ayant donné la solution optimale. Pour l exemple les calculs effectués donnent : k = 0 c 0 (1, 1) = 0 c 0 (2, 2) = 0 c 0 (3, 3) = 0 c 0 (4, 4) = 0 k = 1 c 1 (1, 2) = 10000 c 1 (2, 3) = 1000 c 1 (3, 4) = 20000 k = 2 c 3 (1, 3) = 2000 c 3 (2, 4) = 1200 k = 3 c 4 (1, 4) = 3200 Le nombre de termes calculés est n 1 +... + 1 = n(n 1)/2. Un terme sur la ligne correspondant à j i = k demande k multiplications. On fait donc Σ k=n 1 k=0 (n k)k = O(n 3 ) opérations. 6.1.2 Méthode La méthode est concue pour les problèmes vérifiant le principe suivant. Principe d optimalité des solutions induites. Le problème P peut se décomposer en deux sous-problèmes P 1 et P 2 tels que une solution S de P se décompose en S 1 solution de P 1 et S 2 solution de P 2. Dans ce cas si S est optimale alors S 1 et S 2 sont optimales. Exemple 2 Plus court chemin dans un graphe entre x et y : si un chemin x = x 1, x 2,...,x n = y est un chemin de longueur minimale entre x et y alors pour tout z de ce chemin (i) Le chemin x 1 = x, x 2,...,x k = z est un chemin de longueur minimale entre x et z et (ii) le chemin x k = z, x k+1,...,x n = y est un chemin de longueur minimale entre z et y. Le principe de la méthode est le suivant : 1. Chercher une formulation récursive. 2. Si échec en (1) alors généraliser et aller en (1) sinon aller en (3). 3. Organiser les calculs de manière itérative des feuilles vers la racine.
6.2. EXEMPLES 3 (a) Organisation des calculs en étapes. (b) Stockage (tabulation) des résultats intermédiaires pour n effectuer un calcul qu une seule fois. Explication : La formulation récursive conduit à une exploration d arbre de recherche qui est inefficace en général à cause des multiples calculs redondants (souvent le cout est exponentiel, (cf exemple de fibonacci). 4. Retrouver la solution en remontant les calculs effectués (exige d avoir stocké à chaque étape la(es) valeur(s) qui donne(nt) la solution optimale.) 6.2 Exemples 6.2.1 Voyageur de commerce Problème. n villes x 0, x 1,...,x n 1 à visiter une et une seule fois en partant et revenant de x 0 et en minimisant le cout du trajet avec c x,y le cout pour aller directement de x à y. 1. Généralisation. F(y, S)= cout pour aller de y à x 0 en passant par toutes les villes de S avec S un sous-ensemble de villes avec y, x 0 S. 2. Formulation récursive. F(y, S) = Min z S (c y,z + F(z, S {z}) La solution du problème initial est obtenue avec F(x 0, S) avec S = {x 1,...,x n 1 }. 3. Organisation en étapes par cardinalité croissante des ensembles S. Etape 0. F 0 (y, ) = c y,x0 (avec c x0,x 0 = 0) et V 0 (y, ) =. Etape k. Pour tout y, S tel que y, x 0 S et S = k, calculer F k (y, S) = Min z S (c y,z + F k 1 (z, S {z})) et on se souvient des villes qui donnent le minimum V k (y, S) = {z z realise le minimum dans le calcul de F k (y, S)} Arret pour k = n 1 : on calcule donc F n 1 (x 0, {x 1,..., x n 1 }) qui donne la solution du problème initial. 4. Remontée des calculs. Choisir z 1 V n 1 (x 0, {x 1,...,x n 1 }) et définir S 1 = {x 1,...,x n 1 } {z 1 }. Tant que S p faire choisir z p V n p (z p, S p 1 ) S p = S p 1 {z p }. fait
4 CHAPITRE 6. PROGRAMMATION DYNAMIQUE. MÉTHODES P.S.E.P. 6.2.2 Programmation linéaire entière : cas simple Max z = Σ i=n i=1 c i.x i Σ i=n i=1 a ix i B 0 x i g i i = 1,..., n avec a i 0, c i 0 pour i = 1,..., n. Pour simplifier on suppose a i, c i, B, g i entiers. Il est important de réaliser que ce n est qu un cas très particulier de programmation linéaire : tous les coefficients sont positifs ou nul. 1. Généralisation : F k (b)= solution optimale du problème obtenu en posant x j = 0 pour j > k et remplacant B par b avec 0 b B. On a bien la solution du problème initial avec F n (B). 2. Formulation récursive : F k (b) = Max αk = 0,...,g k 0 b a k α k F k 1(b a k α k ) + c k α k 3. Organisation des calculs de manière itérative. Etape 0 : F 0 (b) = 0 Etape k : pour tout b = 0,..., B calculer F k (b) = Max αk = 1,...,g k 0 b a k α k F k 1(b a k α k ) + c k α k et on se souvient des valeurs qui donnent le maximum : fin pour k = n. Exemple : Les calculs des F k (b) sont donnés par : Max z = 5x 1 + 4x 2 + 6x 3 2x 1 + 2x 2 + 3x 3 4 x i {0, 1} i = 1,...,4 Exemple de calcul : F 2 (4) = Max α2 = 0, 1 4 2α 2 0 b 0 1 2 3 4 F 0 (b) 0 0 0 0 0 F 1 (b) 0 0 5 5 5 F 2 (b) 0 0 5 5 9 F 3 (b) 0 0 5 6 9 (F 1 (4 2α 2 ) + 4α 2 ) = Max(F 1 (4), F 1 (2), F 1 (0)) = 9
6.3. MÉTHODES P.S.E.P. (BRANCH AND BOUND). 5 Cette méthode se généralise sans difficculté à un systèmes d équations (dont les coefficients sont 0). 6.3 Méthodes P.S.E.P. (branch and bound). P.S.E.P=programmation par séparation et évaluation progressive. Le principe est de séparer (branch) les solutions du problèmes en plusieurs ensembles de solutions et d utiliser une évaluation partielle pour éliminer des solutions grâce à des bornes sur les valeurs possibles des solutions (bound). Sans cette étape d élimination on énumerer explicitement toutes les solutions. Grâce aux bornes, l énumeration est implicite (certaines solutions ne sont pas calculées car on sait que c est inutile). Principe : On décompose S l ensemble des solutions de P en S 1, S 2,...,S m tels que { S = i=1,...,m S i S i < S pour i = 1,..., n et on itère la décomposition jusqu à ce qu on obtienne des ensembles de solutions calculables (typiquement quand S = 1, mais pas seulement) 6.4 Exemples 6.4.1 Sac à dos Problème : n objets à prendre, l objet i pèse p i > 0 et rapporte c i > 0 quand il est vendu. Le poids total disponible est P. Modélisation : Max z = c 1 x 1 +... + c n x n p 1 x 1 +... + c n x n P x i {0, 1} i = 1,..., 4 Au problème on associe N le nombre de décision prises R le poids disponible B une majoration du bénéfice possible Séparation. La séparation consiste à décider de prendre ou laisser un objet de plus. choix sur x i x i = 0 x i = 1 N 1 = N + 1 R 1 = R B 1 = B c i N 2 = N + 1 R 2 = R p i B 2 = B L évaluation consiste d une part à s arrêter dès que R < 0 et surtout à utiliser des sous-problèmes résolus (donc pour lequel on connait le bénéfice) et la borne sur le bénéfice pour couper des branches de l arbre selon le principe suivant : si un noeud est caractérisé
6 CHAPITRE 6. PROGRAMMATION DYNAMIQUE. MÉTHODES P.S.E.P. par (N,R,B) et qu on a calculé une branche qui donne un bénéfice réel (attention pas une estimation, un bénéfice atteint) de B > B alors il est inutile de développer le noeud. Exemple. Max z = 8x 1 + 11x 2 + 6x 3 + 4x 4 5x 1 + 7x 2 + 4x 3 + 3x 4 14 x i {0, 1} On choisit la variable à instancier par un algorithme glouton en calculant c i /p i, ce qui donne x 1. (I) N = 0, B = 29, R = 14 x 1 = 1 x 1 = 0 (II) N = 1, R = 9, B = 29 (III) N = 1, R = 14, B = 21 On developpe de nouveau le problème (II) (on choisit une strategie en profondeur d abord de manière à obtenir rapidement une solution qui servira de borne. On choisit x 2 de la même manière que x 1. (II) N = 1, R =, B = 29 x 2 = 1 x 2 = 0 (IV ) N = 2, R = 2, B = 19 (V ) N = 2, R = 9, B = 18 Les developpements du problème (IV ) donne immédiatement x 3 = x 4 = 0 et un bénéfice réalisable de 19. cette borne 19 permet de couper l arbre au noeud (V ) B = 18 < 19. On développe (III) en choisissant x 2. (III) N = 1, R = 14, B = 21 x 2 = 1 x 2 = 0 (V I) N = 2, R = 7, B = 21 (V II) N = 2, R = 14, B = 10 Inutile de développer (V II) à cause de B = 10 < 19, on developpe (V I) : (V I) N = 2, R = 7, B = 21 x 3 = 1 x 3 = 0 (V III) N = 2, R = 3, B = 21 (IX) N = 2, R = 14, B = 15 On coupe (IX) et le dernier développement de (V III) donne la solution x 1 = 0, x 2 = x 3 = x 4 = 1 et z = 21. On a donc examiné 9 noeuds (à comparer aux 16 cas possibles) 6.4.2 Programmation linéaire en nombre entiers On résoud le problème P à l aide du simplexe (ce qui donne une borne sur la valeur de la fonction objectif. S il la solution est entière on s arrête sinon on choisit un x k dont la valeur α k n est pas entière et on relance le simplexe sur les sous-problèmes P x k α k
6.4. EXEMPLES 7 et P x k α k On remarque que la solution x k = α k est éliminée. On itère le developpement de l arbre, une feuille étant obtenue lorsqu on a un problème ayant une solution entière et on utilise les solutions déjà obtenues pour couper des branches de l arbre. Rien ne garantit que le processus s arrête. En fait, l idée ci-dessus est utilisée dans des méthodes plus élaborées : les méthodes de coupe qui permettent d avoir des résultats de terminaison, mais sur les exemples traités la méthode suffit (en particulier en programmation 0-1, la méthode terminera toujours (car elle reviendra à instancier une variable par 0 ou 1). Exemple : On reprend le problème de programmation 0-1 précédent qu on va résoudre différemment. Max z = 8x 1 + 11x 2 + 6x 3 + 4x 4 5x 1 + 7x 2 + 4x 3 + 3x 4 14 x i {0, 1} Le simplexe donne : x 1 = x 2 = 1, x 3 = 0, 5, x 4 = 0, z = 22 ce qui ne fournit pas une solution entière. On relance (I) P x 3 0 qui donne une solution non entière et z = 21, 65 et (II) P x 3 1 qui donne une solution non entière et x 1 = x 3 = 1, x 4 = 0 et x 2 = 5/7, pour z = 21, 85. On developpe (II) en (III) II x 2 0 qui donne x 1 = x 3 = x 4 = 1, x 2 = 0 et z = 18 qui donne une première borne 18 et (IV ) II x 2 1 qui donne x 2 = x 3 = 1 x 4 = 0, x 1 = 3/5 et z = 21, 8. On developpe (IV ) en IV x 1 0 qui donne x 1 = 0, x 2 = x 3 = x 4 = 1 et z = 21 qui est une meilleure borne qui permet de couper le problème I (les coefficients étant entiers on ne peut pas avoir de solution meilleure que 21 puisque z vaut au mieux 21,65 et IV x 1 1
8 CHAPITRE 6. PROGRAMMATION DYNAMIQUE. MÉTHODES P.S.E.P. qui n a pas de solution. Donc le développement est fini et on a une solution pour un optimum z = 21. On a examiné 7 noeuds de l arbres et résolu 7 problèmes de simplexes (à comparer aux 16 possibilités pour les valeurs). Exercice Exercice 1 On reprend l exemple des multipications de matrices. 1. Montrer que le nombre de parenthésages possibles P(n) vérifie : P(n) = Σ 1 k n 1 P(k) P(n k) P(1) = 1 2. Montrer que P(n) = 1/n C n 1 2n 2 (nombres de Catalan) et que P(n) 2n 2. Exercice 2 Un étudiant désire travailler 4 heures maximum par semaine en lpus de ses cours. Il a 4 emplois possibles pour lesquels les salaires ne sont pas proportionnels aux heures de travail. Trouver les emplois qu il devrait choisir pour maximiser son salaire (utiliser la programmation dynamique) avec le tableau de salaire suivant : heure de travail emploi 1 emploi2 emploi3 emploi4 1 26 23 16 19 2 39 36 32 36 3 48 44 48 47 4 54 49 64 56 Exercice 3 Avec la programmation dynamique, trouver le circuit minimal que doit réaliser un facteur qui doit prendre le courrier dans 5 boites à lettres et le déposer au centre de tri, compte tenu du tableau de distances suivant. T ri B1 B2 B3 B4 B5 Tri 0 4 7 2 6 8 B1 3 0 2 8 7 1 B2 6 1 0 3 6 2 B3 4 9 4 0 1 5 B4 5 5 5 2 0 7 B5 7 3 1 4 9 0