6. Programmation dynamique Programmation dynamique Principe d
Transcription
6. Programmation dynamique Programmation dynamique Principe d
Programmation dynamique IFT1575 Modèles de recherche opérationnelle (RO) 6. Programmation dynamique Supposons un problème décomposé en étapes Chaque étape possède un certain nombre d’états correspondant aux conditions possibles au début d’une étape A chaque étape, on doit prendre une décision qui associe à l’état courant l’état au début de la prochaine étape Dans le cas d’un problème d’optimisation, la programmation dynamique identifie une politique optimale : une décision optimale à chaque étape pour chaque état possible 6. Programmation dynamique Principe d’optimalité de Bellman Programmation dynamique : notation Étant donné un état courant, la politique optimale pour les étapes à venir est indépendante des décisions prises aux étapes précédentes Lorsque ce principe est satisfait, on peut recourir à l’approche suivante pour résoudre un problème ayant N étapes : Identifier une décision optimale pour la dernière étape (N) Pour chaque étape n, de N-1 à 1 : Étant donné une politique optimale pour l’étape n+1, identifier une politique optimale pour l’étape n au moyen d’une relation de récurrence Lorsque n = 1, on obtient une politique optimale pour le problème 6. Programmation dynamique 2 3 N = nombre d’étapes n = indice de l’étape courante sn = état au début de l’étape n xn = variable de décision associée à l’étape n fn(sn,xn) = contribution des étapes n, n+1,…, N à la valeur de l’objectif lorsqu’on se trouve à l’état sn au début de l’étape n, que la décision est xn, et que des décisions optimales sont prises par la suite xn* = solution optimale à l’étape n fn*(sn) = fn(sn,xn*) = min{fn(sn,xn)} ou max{fn(sn,xn)} 6. Programmation dynamique 4 1 Programmation dynamique : tableau Exemple 1 : production-inventaire A chaque itération de la méthode, on construira un tableau représentant : La liste des états possibles à l’étape n Les valeurs possibles de la variable xn La contribution à la valeur de l’objectif, fn(sn,xn) La valeur optimale fn*(sn) et la solution optimale xn* xn* Production max, temps régulier Production max, temps supp. Coût unitaire, temps régulier 1 2 2 300 $ xn=a xn=b xn=c fn*(sn) 1 fn(1,a) fn(1,b) fn(1,c) fn*(1) 2 3 2 500 $ 2 fn(2,a) fn(2,b) fn(2,c) fn*(2) 3 1 2 400 $ 5 Exemple 1 (suite) Semaine sn 6. Programmation dynamique Une compagnie doit fournir à son meilleur client trois unités du produit P durant chacune des trois prochaines semaines Voici les coûts de production : 6 Exemple 1 (suite) Le coût pour chaque unité produite en temps supplémentaire est 100 $ de plus que le coût par unité produite en temps régulier Le coût unitaire d’inventaire est de 50 $ par semaine Au début de la première semaine, il y a 2 unités du produit dans l’inventaire La compagnie ne veut plus rien avoir dans son inventaire au bout des trois semaines Combien doit-on produire d’unités à chaque semaine afin de rencontrer la demande du client, tout en minimisant les coûts? 6. Programmation dynamique 6. Programmation dynamique 7 Étape = semaine N=3 n = 1, 2, 3 sn = état au début de la semaine n = unités de produit dans l’inventaire xn = nombre d’unités produites lors de la semaine n sn+1 = sn + xn – 3 (puisqu’on doit livrer 3 unités au client à chaque semaine) s1 = 2 (puisqu’il y a 2 unités au début) 6. Programmation dynamique 8 2 Exemple 1 (suite) Exemple 1 (suite) cn = coût unitaire de production, semaine n rn = production max en temps régulier, semaine n mn = production max, semaine n pn(sn,xn) = cnxn+100max(0,xn–rn)+50max(0,sn+xn-3) fn(sn,xn) = pn(sn,xn) + fn+1*(sn+1) fn*(sn) = min{pn(sn,xn)+fn+1*(sn+1) | 3-sn≤xn≤mn} Si n = 3, on doit poser f4*(s4) = 0 De plus, s4 = 0 = s3 + x3 - 3 → x3 = 3 - s3 Calculons d’abord les valeurs f3*(s3) et x3* 6. Programmation dynamique f3*(s3) x3* 0 1400 1400 3 1 900 900 2 2 400 400 1 ≥3 0 0 0 6. Programmation dynamique 10 Exemple 1 (suite) Voyons maintenant comment on peut calculer les valeurs f2*(s2) et x2*, lorsque s2 = 0 D’abord, il est clair qu’on doit avoir x2 ≥ 3 (car on doit livrer au moins 3 unités du produit) f2(0,3) = p2(0,3) + f3*(0) = 1500 + 1400 = 2900 f2(0,4) = p2(0,4) + f3*(1) = 2150 + 900 = 3050 f2(0,5) = p2(0,5) + f3*(2) = 2800 + 400 = 3200 f2*(0) = min{f2(0,3), f2(0,4), f2(0,5)} = f2(0,3) D’où x2* = 3 De la même façon, on calcule pour s2 = 1,2,3 6. Programmation dynamique f3(3- s3,s3) 9 Exemple 1 (suite) s3 11 s2 x2=0 x2=1 x2=2 x2=3 x2=4 x2=5 f2*(s2) x2* 0 - - - 2900 3050 3200 2900 3 1 - - 2400 2450 2600 2850 2400 2 2 - 1900 1950 2000 2250 2900 1900 1 ≥3 1400 1450 1500 1650 2300 2950 1400 0 6. Programmation dynamique 12 3 Exemple 1 (suite) Exemple 1 (suite) Pour la première étape (n = 1), on a s1 = 2 (il y a 2 unités au départ dans l’inventaire) On doit donc avoir x1 ≥ 1 f1(2,1) = p1(2,1) + f2*(0) = 300 + 2900 = 3200 f1(2,2) = p1(2,2) + f2*(1) = 650 + 2400 = 3050 f1(2,3) = p1(2,3) + f2*(2) = 1100 + 1900 = 3000 f1(2,4) = p1(2,4) + f2*(3) = 1550 + 1400 = 2950 f1*(2) = f1(2,4) et x1* = 4 6. Programmation dynamique Trois équipes de recherche travaillent sur un même problème avec chacune une approche différente La probabilité que l’équipe Ei échoue est : P(E1) = 0,4; P(E2) = 0,6; P(E3) = 0,8 Ainsi, la probabilité que les trois équipes échouent simultanément est : (0,4)(0,6)(0,8) = 0,192 On veut ajouter deux autres scientifiques afin de minimiser la probabilité d’échec A quelles équipes faut-il affecter ces deux scientifiques afin de minimiser la probabilité d’échec? 6. Programmation dynamique s1 x1=1 x1=2 x1=3 x1=4 f1*(s1) x1* 2 3200 3050 3000 2950 2950 4 La politique optimale est donc : x1* = 4 (d’où s2 = 3), x2* = 0 (d’où s3 = 0), x3* = 3 Le coût total est : f1*(2) = 2950 $ 13 Exemple 2 : affectation de ressources Sous forme de tableau, cela donne : 15 6. Programmation dynamique 14 Exemple 2 : données Voici le tableau représentant les probabilités d’échec pour chaque équipe en fonction du nombre de scientifiques ajoutés Scientifiques ajoutés E1 E2 E3 0 0,4 0,6 0,8 1 0,2 0,4 0,5 2 0,15 0,2 0,3 6. Programmation dynamique 16 4 Exemple 2 : modèle Exemple 2 : résolution Étape n = équipe En, n = 1,2,3 (N = 3) État sn= nombre de scientifiques non encore affectés Décision xn = nombre de scientifiques affectés à l’équipe En pn(xn) = probabilité d’échec de l’équipe En si on lui affecte xn scientifiques fn(sn,xn) = pn(xn).fn+1*(sn-xn) (f4*(0) = 1) fn*(sn) = min{fn(sn,xn)|xn=0,1,…,sn} Calculons d’abord f3*(s3) et x3* On doit avoir s3 = x3 (on affecte tous les scientifiques non encore affectés) 6. Programmation dynamique f3*(s3) x3* 0 0,8 0,8 0 1 0,5 0,5 1 2 0,3 0,3 2 6. Programmation dynamique 18 Exemple 2 : résolution (suite) Voyons maintenant comment on peut calculer les valeurs f2*(s2) et x2*, lorsque s2 = 1 Il est clair qu’on doit avoir x2 ≤ 1 f2(1,0) = p2(1,0).f3*(1) = 0,6.0,5 = 0,3 f2(1,1) = p2(1,1).f3*(0) = 0,4.0,8 = 0,32 f2*(1) = min{f2(1,0), f2(1,1)} = f2(1,0) D’où x2* = 0 De la même façon, on calcule pour s2 = 0 et 2 6. Programmation dynamique f3(s3,s3) 17 Exemple 2 : résolution (suite) s3 19 s2 x2=0 x2=1 x2=2 f2*(s2) x2* 0 0,48 - - 0,48 0 1 0,3 0,32 - 0,3 0 2 0,18 0,2 0,16 0,16 2 6. Programmation dynamique 20 5 Exemple 2 : résolution (suite) Exemple 2 : résolution (suite et fin) Pour la dernière étape (n = 1), on a s1 = 2 (il y a 2 scientifiques à affecter) f1(2,0) = p1(2,0).f2*(2) = 0,4.0,16 = 0,064 f1(2,1) = p1(2,1).f2*(1) = 0,2.0,3 = 0,06 f1(2,2) = p1(2,2).f2*(0) = 0,15.0,48 = 0,072 f1*(2) = f1(2,1) et x1* = 1 6. Programmation dynamique 21 Affectation de ressources x1=0 x1=1 x1=2 f1*(s1) x1* 0 0,064 0,06 0,072 0,06 1 La politique optimale est donc : x1* = 1 (d’où s2 = 1), x2* = 0 (d’où s3 = 1), x3* = 1 La probabilité d’échec est : f1*(1) = 0,06 6. Programmation dynamique 22 Exemple 3 : problème Wyndor Glass Programmation dynamique : souvent utilisée pour résoudre des problèmes d’affectation de ressources C’était le cas dans notre dernier exemple, où il y avait une ressource à affecter (les scientifiques) Que faire lorsqu’il y a plus d’une ressource? Dans ce cas, chaque état est un vecteur dont chaque coordonnée i représente la quantité de la ressource i non encore affectée Voyons un exemple bien connu d’affectation de ressources multiples : le problème Wyndor Glass 6. Programmation dynamique s1 23 Deux types de produits (produit 1, produit 2) Trois usines (usine 1, usine 2, usine 3) Ressource i : Capacité de production pour l’usine i (h/par semaine) Profit par lot (20 unités) de chaque produit Chaque lot du produit 1 (2) est le résultat combiné de la production aux usines 1 et 3 (2 et 3) Déterminer le taux de production pour chaque produit (nombre de lots/semaine) de façon à maximiser le profit total 6. Programmation dynamique 24 6 Exemple 3 : données Exemple 3 : modèle Voici le tableau représentant les données du problème Produit 1 (tps de production, h/lot) Produit 2 (tps de production, h/lot) Capacité de production (h) Usine 1 1 0 4 Usine 2 0 2 12 Usine 3 3 2 18 Profit($)/lot 3000 5000 6. Programmation dynamique 25 Exemple 3 : résolution 6. Programmation dynamique 26 Exemple 3 : résolution (suite) On cherche d’abord f2*(s2) et x2* f2*(s2) = max{5x2|2x2≤12, 2x2≤18-3x1, x2≥0} 2x2≤12 et 2x2≤18-3x1 → x2 ≤ min{6,(18-3x1)/2} f2*(s2) = max{5x2|0≤x2≤ min{6,(18-3x1)/2}} x2* = min{6,(18-3x1)/2} f2*(s2) = 5 min{6,(18-3x1)/2)|3x1≤18} Calculons maintenant f1*(s1) et x1* 6. Programmation dynamique Étape n = produit n, n = 1,2 (N = 2) État sn= (R1,R2,R3)n, où Ri est la quantité de la ressource i (temps de production à l’usine i) non encore affectée Décision xn = nombre de lots du produit n fn(sn,xn) = cnxn + fn+1*(sn+1) (f3*(s3) = 0) f2*(s2) = max{5x2|2x2≤12, 2x2≤18-3x1, x2≥0} f1*(s1) = max{3x1+f2*(s2)|x1≤4,3x1≤18,x1≥0} s1= (4,12,18), s2 = (4-x1,12,18-3x1) 27 f1*(s1) = max{3x1+f2*(s2)|x1≤4,3x1≤18,x1≥0} x1≤4 → 3x1 ≤18 f1*(s1) = max{3x1+5 min{6,(18-3x1)/2)|0≤x1≤4} min{6,(18-3x1)/2)} = 6, si 0≤x1≤2 = (18-3x1)/2, si 2≤x1≤4 f1*(s1) = max{f1(s1,x1)|0≤x1≤4} f1(s1,x1) = 3x1 + 30, si 0≤x1≤2 = 45 – (9/2)x1, si 2≤x1≤4 Le maximum est atteint en x1* = 2 et f1*(s1) = 36 6. Programmation dynamique 28 7 Exemple 3 : résolution (suite et fin) Cas probabiliste x2* = min{6,(18-3x1)/2} et x1* = 2 → x2* = 6 La politique optimale est donc : x1* = 2, x2* = 6 de valeur f1*(s1) = 36 En utilisant la même approche, on peut résoudre par la programmation dynamique des modèles où : L’objectif ou les contraintes sont non linéaires Certaines variables sont entières Dans la programmation dynamique probabiliste, la décision optimale à l’étape n dépend de la loi de probabilité de l’état à l’étape n+1 Ainsi, on passera de l’étape n à l’étape n+1, se retrouvant ainsi dans l’état i, avec une probabilité pi Étant donné S états à l’étape n+1, on aura pi ≥ 0 et S ∑ p =1 i i =1 6. Programmation dynamique 29 Exemple 4 : jeu de hasard 6. Programmation dynamique 30 Exemple 4 : modèle Le jeu consiste à miser un nombre quelconque de jetons Si on gagne, on gagne le nombre de jetons misés Si on perd, on perd le nombre de jetons misés Un statisticien croit pouvoir gagner chaque jeu avec une probabilité égale à 2/3 Ses collègues parient avec lui qu’en misant au départ 3 jetons, il aura moins de 5 jetons après 3 parties Combien de jetons miser à chacune des 3 parties? 6. Programmation dynamique La relation de récurrence dépend de cette loi de probabilité et de l’objectif à optimiser 31 Étape n = partie n, n = 1,2,3 (N = 3) État sn = nombre de jetons au début de la partie n Décision xn = nombre de jetons à parier à la partie n On veut maximiser la probabilité d’avoir au moins 5 jetons après 3 parties fn(sn,xn) : probabilité de terminer avec au moins 5 jetons, étant donné qu’on est à l’état sn à l’étape n, qu’on mise xn jetons et qu’on effectue des décisions optimales aux étapes n+1,…,N fn*(sn) = max{fn(sn,xn)| xn = 0,1,…,sn} 6. Programmation dynamique 32 8 Exemple 4 : modèle (suite) Étant donné qu’on est à l’état sn à l’étape n et qu’on mise xn jetons, on peut : Exemple 4 : résolution (n = 3) s3 Perdre et se retrouver à l’état sn – xn avec une probabilité 1/3 Gagner et se retrouver à l’état sn + xn avec une probabilité 2/3 fn(sn,xn) = (1/3).fn+1*(sn-xn) + (2/3). fn+1*(sn+xn) f4*(s4) = 0, si s4 < 5 = 1, si s4 ≥ 5 Calculons d’abord f3*(s3) et x3* 6. Programmation dynamique x3=2 x3=3 x3=4 f3*(s3) x3* 0 0 - - - - 0 0 1 0 0 - - - 0 ≥0 2 0 0 0 - - 0 ≥0 3 0 0 2/3 2/3 - 2/3 ≥2 4 0 2/3 2/3 2/3 2/3 2/3 ≥1 ≥5 1 1 0 6. Programmation dynamique 34 Exemple 4 : résolution (n = 2) Voyons maintenant comment on peut calculer les valeurs f2*(s2) et x2*, lorsque s2 = 3 Il est clair qu’on doit avoir x2 ≤ 3 f2(3,0) = 1/3.f3*(3) + 2/3.f3*(3) = 2/3 f2(3,1) = 1/3.f3*(2) + 2/3.f3*(4) = 4/9 f2(3,2) = 1/3.f3*(1) + 2/3.f3*(5) = 2/3 f2(3,3) = 1/3.f3*(0) + 2/3.f3*(6) = 2/3 f2*(3) = max{f2(3,0),f2(3,1),f2(3,2),f2(3,3)} = f2(3,0) D’où x2* = 0, 2 ou 3 De la même façon, on calcule pour s2 = 0,1,2,4,5 6. Programmation dynamique x3=1 33 Exemple 4 : résolution (n = 2) x3=0 35 s2 x2=0 x2=1 x2=2 x2=3 x2=4 f2*(s2) x2* 0 0 - - - - 0 0 1 0 0 - - - 0 ≥0 2 0 4/9 4/9 - - 4/9 1,2 3 2/3 4/9 2/3 2/3 - 2/3 0,2,3 4 2/3 8/9 2/3 2/3 2/3 8/9 1 ≥5 1 1 0 6. Programmation dynamique 36 9 Exemple 4 : résolution (n = 1) Exemple 4 : résolution (suite et fin) Pour la première étape (n = 1), on a s1 = 3 (3 jetons au départ affecter) f1(3,0) = 1/3.f2*(3) + 2/3.f2*(3) = 2/3 f1(3,1) = 1/3.f2*(2) + 2/3.f2*(4) = 20/27 f1(3,2) = 1/3.f2*(1) + 2/3.f2*(5) = 2/3 f1(3,3) = 1/3.f2*(0) + 2/3.f2*(6) = 2/3 f1*(3) = max{f1(3,0),f1(3,1),f1(3,2),f1(3,3)} = f1(3,1) D’où x1* = 1 6. Programmation dynamique 37 x1=0 x1=1 x1=2 x1=3 f1*(s2) x1* 2/3 20/27 2/3 2/3 20/27 1 s1 3 La politique optimale est donc : x1* = 1 Si on gagne (s2 = 4), x2* = 1 Si on gagne (s = 5), x * = 0 3 3 Si on perd (s = 3), x * = 2 ou 3 3 3 Si on perd (s2 = 2), x2* = 1 ou 2 Si on gagne (s = 3 ou 4), x * = 2 ou 3 (si x * = 1) ou 3 3 2 1≤x3*≤4 (si x2* = 2) Si on perd (s = 1 ou 0), x * ≥ 0 (mais le pari est 3 3 perdu!) 6. Programmation dynamique 38 10