Examen de recherche opérationnelle Corrigé Marc Roelens Décembre 2006 1 Ordonnancement de tâches 1.1 On dresse le tableau des contraintes de précédence : Tâche A B C D E F G H I J Préc. J H A, H A, B C, I D D, F On détermine successivement : les tâches de niveau 0 (celles qui n ont pas d antécédent) : ce sont C, D et F (que l on peut numéroter dans cet ordre) ; les tâches de niveau 1 (celles qui n ont que des antécédents de niveau 0) : ce sont I et J (que l on numérote dans cet ordre) ; les tâches de niveau 2 (celles qui n ont que des antécédents de niveau 0 ou 1) : ce sont A et H (que l on numérote dans cet ordre) ; les tâches de niveau 3 (celles qui n ont que des antécédents de niveau 0, 1 ou 2) : ce sont B et E (que l on numérote dans cet ordre) ; les tâches de niveau 4 (celles qui n ont que des antécédents de niveau 0, 1, 2 ou 3) : il ne reste plus que G! Voici donc le tableau des tâches avec niveau et numéro d ordre : Tâche A B C D E F G H I J Préc. J H A, H A, B C, I D D, F Niv. 2 3 0 0 3 0 4 2 1 1 N o 6 8 1 2 9 3 10 7 4 Comme on a réussi à numéroter tous les sommets, c est que le graphe de précédence est sans circuit, et la numérotation des sommets constitue un tri topologique (si la tâche X est avant la tâche Y, alors le numéro de X est inférieur au numéro de Y). Une représentation par niveau possible pour ce graphe est la suivante (on a ajouté des tâches fictives correspondant au début et à la fin des travaux) : C H B Déb D I E G Fin F J A niveau 0 niveau 2 niveau 3 niveau 1 niveau 4 1
1.2 On porte sur chaque arc du graphe de précédence la durée de la tâche dont cet arc est issu, et on sait que l on calcule la date de début au plus tôt en déterminant le chemin le plus long depuis le début des travaux ; ceci permet de trouver la durée minimale d exécution qui est la date de début au plus tôt de la tâche fictive représentant la fin des travaux. Ensuite, on détermine la date de début au plus tard en calculant le chemin le plus long depuis chaque sommet jusqu à cette tâche fictive de fin des travaux. Comme le graphe est ordonné par niveaux, ces calculs se font par niveaux croissants pour les dates de début au plus tôt, par niveaux décroissants pour les dates de début au plus tard. Le résultat est résumé sur le graphe suivant : Déb 0, C 0,0 D 0,3 F 2 4,6 I 3 8,9 H, 12,12 7 J A 10 13,14 B 22,31 22,22 E G 10 8 1 10 32,32 Fin Les dates de début au plus tôt et au plus tard sont indiquées (séparées par des virgules) au dessus des tâches. On obtient ainsi les réponses : la durée minimale d exécution est de 32 unités ; le chemin critique est 1.3 Déb D J A G Fin Le graphe PERT est décrit ci-après : il comprend 8 étapes et deux tâches fictives (en pointillés), de durées nulles, servant à représenter les contraintes de précédence. [0,0] D () F (2) C (4) I (3) [8,9] H () [13,14] B (8) [,] J (7) [12,12] A (10) [22,22] E (1) [22,22] G (10) [32,32] Pour chaque étape, on a indiqué la date au plus tôt et la date au plus tard (entre crochets). Le chemin critique est (heureusement!) le même que celui calculé par le graphe de précédence. On peut alors calculer les marges libres, totales et certaines, dont on rappelle la définition. Pour toute étape e i, on note t i la date au plus tôt de cette étape, et t i la date au plus tard. Alors, pour une tâche X j de durée d j, comprise entre l étape k (avant) et l étape l (après), on définit : M T (X j ) = t l t k d j (marge totale de X j ) ; M L (X j ) = t l t k d j (marge libre de X j ) ; M C (X j ) = t l t k d j (marge certaine de X j ). On obtient les résultats suivants : Tâche A B C D E F G H I J M T 0 1 0 9 3 0 1 1 0 M L 0 1 4 0 9 3 0 0 0 0 M C 0 0 4 0 9 3 0 0 0 0 2
1.4 On voit sur le tableau précédent que la marge totale de H est de 1 unité : donc, l augmentation de 1 unité de la durée de H va résorber cette marge (sans pour autant décaler la fin du projet). Si H augmente à nouveau de 1 unité, alors on obtient un nouveau chemin critique Déb D I H B G Fin et la durée minimale d exécution du projet passe à 33 unités de temps. 2 Allocation de ressources 2.1 On note donc x j la quantité de cageots placée dans le magasin j. Ces variables x j sont entières, positives, inférieures à la valeur n. Le bénéfice global (que l on cherche à maximiser) est donc : F (x 1,, x m ) = m b(x j, j) en respectant bien sûr la contrainte que le nombre total de cageots est n, c est-à-dire : j=1 m x j = n j=1 C est donc un problème de programmation dynamique. 2.2 On note alors, pour 0 i n et 0 j m, P (i, j) le profit maximum obtenu en vendant i cageots dans les j premiers magasins. On a bien évidemment : ( i {0..n})(P (i, 1) = b(i, 1)) Ensuite, pour j 2, pour placer optimalement i cageots dans les j premiers magasins, on peut dire l on place x j i cageots dans le magasin j et i x j de façon optimale dans les j 1 premiers magasins. On choisit bien sûr la valeur de x j qui maximise la somme des bénéfices obtenus. En clair : 2.3 P (i, j) = max 0 x j i b(x j, j) + P (i x j, j 1) D après ce que l on vient de démontrer, on connaît les valeurs de P (i, 1) pour 0 i n (identiques aux b(i, 1)). Puis, on peut calculer grâce à la propriété P (i, 2) pour 0 i n,...puis P (i, j 1) pour 0 i n, et enfin ce que l on cherche : P (n, m). On a affaire à un algorithme classique de programmation dynamique. En regardant plus attentivement la formule de récurrence, on constate que pour calculer P (i, j), on a besoin de connaître uniquement les valeurs de P (k, j 1) pour 0 k i. Ceci permet de n utiliser qu un seul tableau pour calculer les valeurs de P : pour i allant de 0 à n P(i) = b(i,1) pour j allant de 2 à m pour i allant de n à 0 kmin = 0 ; vkmin = P(i)+b(0,j) pour k allant de 0 à i 3
vk = P(i-k)+b(k,j) si vk est supérieur à vkmin kmin = k ; vk = vkmin finsi finpour(k) P(i,j) = vkmin finpour(i) finpour(j) afficher P(n,m) Cet algorithme permet de déterminer P (n, m) (d ailleurs, dans la dernière boucle, il n est pas nécessaire de calculer P (i, m) pour i < n!) : on souhaite également conserver la répartition correspondante! Il suffit pour cela de mémoriser les valeurs de vkmin en cours d algorithme. En termes de complexité, on a ainsi : une complexité en espace proportionnelle à n m (on conserve pour tout i le bénéfice et la répartition optimale, de taille m) ; une complexité proportionnelle à n 2 m (voir les trois boucles imbriquées de l algorithme). 2.4 Voici l algorithme détaillé sur l exemple : calcul de P(6,2) : on détermine les répartitions possibles 0 cageots sur le magasin 2, 6 sur le premier magasin : 0 + 4 = 4 1 cageots sur le magasin 2, sur le premier magasin : 4 + 4 = 8 2 cageots sur le magasin 2, 4 sur le premier magasin : 6 + 4 = 10 3 cageots sur le magasin 2, 3 sur le premier magasin : 7 + 4 = 11 4 cageots sur le magasin 2, 2 sur le premier magasin : 8 + 4 = 12 cageots sur le magasin 2, 1 sur le premier magasin : 8 + 3 = 11 6 cageots sur le magasin 2, 0 sur le premier magasin : 8 + 0 = 8 P(6,2) = 12, répartition optimale 2+4 calcul de P(,2) : on détermine les répartitions possibles 0 cageots sur le magasin 2, sur le premier magasin : 0 + 4 = 4 1 cageots sur le magasin 2, 4 sur le premier magasin : 4 + 4 = 8 2 cageots sur le magasin 2, 3 sur le premier magasin : 6 + 4 = 10 3 cageots sur le magasin 2, 2 sur le premier magasin : 7 + 4 = 11 4 cageots sur le magasin 2, 1 sur le premier magasin : 8 + 3 = 11 cageots sur le magasin 2, 0 sur le premier magasin : 8 + 0 = 8 P(,2) = 11, répartition optimale 2+3 calcul de P(4,2) : on détermine les répartitions possibles 0 cageots sur le magasin 2, 4 sur le premier magasin : 0 + 4 = 4 1 cageots sur le magasin 2, 3 sur le premier magasin : 4 + 4 = 8 2 cageots sur le magasin 2, 2 sur le premier magasin : 6 + 4 = 10 3 cageots sur le magasin 2, 1 sur le premier magasin : 7 + 3 = 10 4 cageots sur le magasin 2, 0 sur le premier magasin : 8 + 0 = 8 P(4,2) = 10, répartition optimale 2+2 calcul de P(3,2) : on détermine les répartitions possibles 0 cageots sur le magasin 2, 3 sur le premier magasin : 0 + 4 = 4 1 cageots sur le magasin 2, 2 sur le premier magasin : 4 + 4 = 8 2 cageots sur le magasin 2, 1 sur le premier magasin : 6 + 3 = 9 3 cageots sur le magasin 2, 0 sur le premier magasin : 7 + 0 = 7 P(3,2) = 9, répartition optimale 1+2 calcul de P(2,2) : on détermine les répartitions possibles 0 cageots sur le magasin 2, 2 sur le premier magasin : 0 + 4 = 4 1 cageots sur le magasin 2, 1 sur le premier magasin : 4 + 3 = 7 2 cageots sur le magasin 2, 2 sur le premier magasin : 6 + 0 = 6 4
P(2,2) = 7, répartition optimale 1+1 calcul de P(1,2) : on détermine les répartitions possibles 0 cageots sur le magasin 2, 1 sur le premier magasin : 0 + 3 = 3 1 cageots sur le magasin 2, 0 sur le premier magasin : 4 + 0 = 4 P(1,2) = 4, répartition optimale 0+1 calcul de P(0,2) : on détermine les répartitions possibles 0 cageots sur le magasin 2, 0 sur le premier magasin : 0 + 0 = 0 P(0,2) = 0, répartition optimale 0+0 calcul de P(6,3) : on détermine les répartitions possibles 0 cageots sur le magasin 3, 6 sur les deux premiers magasins : 0 + 12 = 12 1 cageots sur le magasin 3, sur les deux premiers magasins : 2 + 11 = 13 2 cageots sur le magasin 3, 4 sur les deux premiers magasins : 4 + 10 = 14 3 cageots sur le magasin 3, 3 sur les deux premiers magasins : 6 + 9 = 1 4 cageots sur le magasin 3, 2 sur les deux premiers magasins : 7 + 7 = 14 cageots sur le magasin 3, 1 sur les deux premiers magasins : 8 + 4 = 12 6 cageots sur le magasin 3, 0 sur les deux premiers magasins : 9 + 0 = 9 P(6,3) = 1, répartition optimale 1+2+3 Ainsi, le grossiste doit placer 1 cageot dans le premier magasin, 2 dans le second magasin, 3 dans le troisième magasin : son bénéfice (maximal) est de 1. 3 Production à optimiser 3.1 On note x 1 et x 2 les quantités de produits P 1 et P 2. Ainsi, on cherche à maximiser le produit de la vente, c est-à-dire la quantité : F (x 1, x 2 ) = 40x 1 + 0x 2 sachant que l on doit bien sûr respecter les contraintes de stock des ingrédients A, B et C : x 1 + 4 x 2 80 x 1 + 2 x 2 24 3 x 1 + 2 x 2 36 On a affaire à un (classique) problème de programmation linéaire. 3.2 Comme on n a que deux variables, une résolution graphique (planaire) est donc possible. La figure 1 reprend cette résolution graphique. Sur ce graphique, on a tracé les droites de contrainte, le polytope [O,X1,X,X2] des solutions admissibles (solutions vérifiant les contraintes, en hachuré), et une droite d isobénéfice (en pointillés). La solution optimale est le point du polytope par lequel passe une parallèle à la droite d isobénéfice qui est la plus éloignée possible de l origine : ce point est le point X de la figure. Pour déterminer précisément ce point, on remarque qu il est l intersection des droites de contraintes relatives à B et C : c est donc la solution du système linéaire : { x 1 + 2 x 2 = 24 3 x 1 + 2 x 2 = 36 qui donne comme solution optimale : x 1 = 6 x 2 = 9 F = 6 40 + 9 0 = 690
20 x2 D(A) 10 O D(C) X2 0000 1111 X 00000 11111 X 000000 111111 0000000 1111111 0000000 1111111 D(B) 10 X1 20 droite d isobénéfice x1 FIG. 1 Résolution graphique 3.3 On va maintenant résoudre le problème par la méthode du simplexe. On sait que par cette méthode, on se déplace sur les sommets du polytope des solutions admissibles : ainsi, à partir du sommet O, on veut aboutir au sommet X. Que l on passe par X1 ou par X2, il suffit dans les deux cas de deux étapes, ce qui explique pourquoi on aura trois tableaux. Voici les tableaux successifs en prenant comme critère de choix de colonne celui du coefficient maximal pour la fonction économique. On introduit donc 3 variables d écart y A, y B et y C (qui représentent les quantités non utilisées des ingrédients A, B et C), et le tableau initial du simplexe s écrit alors : x 1 x 2 y A y B y C y A 4 1 0 0 80 y B 1 2 0 1 0 24 y C 3 2 0 0 1 36 40 0 0 0 0 F Ce tableau correspond à la solution initiale (x 1 = 0, x 2 = 0, y A = 80, y B = 24, y C = 36), qui est géométriquement représentée par le sommet O. Le choix du pivot se fait alors : en déterminant la colonne où le coefficient est maximal dans la fonction économique : c est la colonne de x 2 ; pour cette colonne, et pour chaque ligne, on calcule le quotient entre la valeur du second membre (s il est positif) et le coefficient de la ligne (s il est non nul) : pour la ligne y A, on obtient le quotient 80 4 = 20 ; pour la ligne y B, on obtient le quotient 24 2 = 12 ; pour la ligne y A, on obtient le quotient 36 2 = 18 ; on retient comme pivot la valeur réalisant le minimum, soit ici la ligne y B On dit que y B sort de la base et que x 2 entre dans la base. Cela signifie que l on passe de la solution initiale à une nouvelle solution en se déplaçant sur l arête [O ;X2] : on cherche le point le plus éloigné sur 6
cette arête qui est donc X2. On obtient le nouveau tableau : x 1 x 2 y A y B y C y A 3 0 1 2 0 32 1 1 x 2 2 1 0 2 0 12 y C 2 0 0 1 1 12 1 0 0 2 0 F 600 correspondant à la nouvelle solution (x 1 = 0, x 2 = 12, y A = 32, y B = 0, y C = 12) de bénéfice 600. Comme il reste un coefficient positif dans la fonction économique, ce n est pas encore l optimum. On choisit à nouveau le pivot selon les mêmes règles : c est la colonne de x 1 (qui va donc entrer dans la base), et la ligne de y C (qui va donc sortir de la base). On obtient le tableau final : x 1 x 2 y A y B y C y A 0 0 1 1 2 3 2 14 3 x 2 0 1 0 4 1 4 9 x 1 1 0 0 1 1 2 2 6 0 0 0 3 2 1 2 F 690 correspondant à la nouvelle solution (x 1 = 6, x 2 = 9, y A = 14, y B = 0, y C = 0) de bénéfice 690. Comme les coefficients de la fonction économique sont maintenant négatifs, on est bien à l optimum (on retrouve le point X du graphique). 3.4 On peut réécrire les équations du problème au voisinage de l optimum trouvé (c est le tableau final du simplexe!) : y A = 14 + 1 2 y B + 3 2 y C x 2 = 9 3 4 y B + 1 4 y C x 1 = 6 + 1 2 y B 1 2 y C F = 690 3 2 y B 1 2 y C Comme on utilise toute la quantité de l ingrédient C disponible, on peut se demander comment l optimum va évoluer si on augmente cette quantité. L hypothèse essentielle est la suivante : si l augmentation est petite (ε), les pivots vont rester les mêmes, et on peut donc déduire la solution optimale du nouveau problème à partir de la solution optimale de l ancien problème en affectant la valeur ε à la variable y C. On lit sur le tableau final du simplexe comment vont varier les différentes variables : y A diminue de 3 2 ε ; x 2 diminue de 1 4 ε ; x 1 augmente de 1 2 ε ; F augmente de 1 2 ε. Ceci permet de calculer la valeur maximale du ε : c est celle qui provoquera l annulation de la première variable. Dans notre cas : x 1 augmente donc ne peut s annuler ; y A s annule pour une valeur de ε de 14 3 2 x 2 s annule pour une valeur de ε de 9 1 4 = 28 3 ; = 36. On en déduit que la valeur maximale est 28 3, valeur limite pour laquelle il y a alors annulation de y A. Ceci explique pourquoi l énoncé indiquait : quelle quantité supplémentaire de C faut-il acheter pour épuiser complètement les 80 kg de A? On obtient alors comme nouvelle solution optimale : y A = 14 3 28 2 3 = 0 x 2 = 9 1 28 4 3 = 20 3 x 1 = 6 + 1 28 2 3 = 32 3 F = 690 + 1 28 2 3 = 760 7
Graphiquement parlant, augmenter la quantité de l ingrédient C revient à «décaler» la droite D(C) parallèlement à elle-même en l éloignant de l origine : on voit alors que le point correspondant à la solution optimale se déplace sur la droite D(B) en se rapprochant du point X. La limite est atteinte lorsque les trois droites D(A), D(B) et D(C) deviennent concourantes : c est le point X correspondant à la nouvelle solution! Cette opération est-elle rentable? On voit que la fonction économique augmente proportionnellement à l augmentation de la quantité de l ingrédient C, le rapport étant de 1 2 : ainsi, si le prix au kg de C est inférieur à cette valeur, l opération est rentable ; si le prix est supérieur, elle ne l est pas. 8