OPM3001 - Techniques quantitatives de gestion Eric L ALLET, Jean-Luc R AFFY TELECOM É COLE DE M ANAGEMENT - 1 ÈRE A NNÉE Décembre 2009 ii Eric L ALLET, Jean-Luc R AFFY Table des matières Avant propos vii I Théorie des graphes 1 1 Graphes : définitions et généralités 3 1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 Graphes non orientés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 Graphes orientés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.4 Matrice d’adjacence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2 3 4 5 Les problèmes d’ordonnancement 11 2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2 Le diagramme de GANTT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3 La méthode potentiel-tâches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.4 Recherche du plus long chemin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Les Arbres 27 3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 Définitions et propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.3 L’algorithme de Kruskal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.4 L’algorithme de Prim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Recherche du plus court chemin 37 4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.2 Définitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.3 Algorithme de Ford-Moore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Flot Maximal 45 5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.2 Description du problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.3 Exemple de problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Eric L ALLET, Jean-Luc R AFFY iii 5.4 L’algorithme de Ford-Fulkerson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.5 Exemple de flot max . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.6 Flot maximal à coût minimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.7 L’algorithme de Busacker et Gowen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.8 Exemple flot max coût min . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 5.9 Variantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 5.10 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 II Programmation linéaire 55 6 La programmation linéaire 57 6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 6.2 La forme canonique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 6.3 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 7 8 9 La méthode géométrique 61 7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 7.2 La méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 7.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 7.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Le simplexe 65 8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 8.2 La forme standard et son tableau associé . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 8.3 L’algorithme du simplexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 8.4 Interprétation du tableau final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 8.5 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 8.6 Plus loin au sujet des valeurs marginales . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 8.7 Unités et simplifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 8.8 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Le problème dual 77 9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 9.2 Création du problème dual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 9.3 Exemple de résolution par le problème dual . . . . . . . . . . . . . . . . . . . . . . . . . 78 9.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 10 Simplexe : le cas général iv 81 10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 10.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 10.3 La forme canonique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 10.4 La méthode par l’exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 10.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Eric L ALLET, Jean-Luc R AFFY 11 Programmation linéaire en nombres entiers 87 11.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 11.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 11.3 La méthode par l’exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 11.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 11.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 III Modélisation 95 12 Modélisation 97 12.1 Chemin de la question à la réponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 12.2 Les erreurs à ne pas faire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 12.3 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 IV Appendix 105 A Corrections des exercices 107 A.1 Graphe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 A.2 Ordonnancement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 A.3 Arbre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 A.4 Plus court chemin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 A.5 Flot maximal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 A.6 Méthode géométrique et Simplexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 A.7 Dual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 A.8 Simplexe : le cas général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 A.9 Programmation linéaire en nombres entiers . . . . . . . . . . . . . . . . . . . . . . . . . 142 A.10 Modélisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Eric L ALLET, Jean-Luc R AFFY v vi Eric L ALLET, Jean-Luc R AFFY Avant propos Combien d’hommes et en combien de temps une armée peut-elle emmener sur tel ou tel terrain d’opération en cas de besoin ? Existe-t-il des cas où une entreprise doit produire moins pour gagner plus ? Quel est le coût minimal pour installer un réseau ? et par où le faire passer ? Quelles sont les tâches d’un projet sur-lesquelles il ne faut pas prendre de retard sous peine de pénaliser tout le projet ? Tôt ou tard le directeur d’une entreprise, d’une équipe ou d’un projet devra répondre à ce genre de questions. Évidemment il lui faudra réunir diverses informations et paramètres pour pouvoir le faire. Mais une fois toutes les cartes en main il devra mettre en œuve des techniques de calculs pour trouver la bonne réponse. Ce sont ces «techniques quantitatives de gestion» qui vont être présentées dans ce cours. Elles utilisent des algorithmes issus de deux types de théories différents : certains reposent sur la théorie des graphes, et d’autres sur la programmation linéaire. Cependant ce cours n’est ni un cours de théorie des graphes, ni un cours de programmation linéaire. Il va présenter les bases nécessaires à la compréhensions des algorithmes utilisés par les différentes techniques, mais il n’en fera pas une présentation formelle ou complète. Ainsi les algorithmes seront décrits, mais les théories sous-jacentes ne seront qu’éffleurées, leurs preuves ne seront pas faites. Ne pensez pas pour autant qu’il faille laisser votre intelligence au vestiaire. Certes, une fois l’algorithme compris, il devient vite une technique «automatique» et assez facile à appliquer. Mais la vraie difficulté n’est pas ici. Le véritable problème à résoudre est de trouver comment modéliser votre question et donc quelle technique appliquer pour avoir la réponse. Ainsi l’enjeu de ce cours n’est pas tant de savoir comment marchent les techniques (même si vous allez effectivement devoir le savoir !), mais plutôt de savoir à quelles questions et à quels types de problèmes elles répondent. Eric L ALLET, Jean-Luc R AFFY vii viii Eric L ALLET, Jean-Luc R AFFY Première partie Théorie des graphes Eric L ALLET, Jean-Luc R AFFY 1 Chapitre 1 Graphes : définitions et généralités 1.1 Introduction Beaucoup d’algorithmes d’optimisations, d’ordonnancements, de recherches d’optimum reposent sur des graphes. Un bon dessin valant souvent plus qu’un long discours, les gens formalisent naturellement beaucoup de leur problèmes avec des graphes. Il existe deux grandes familles de graphes : les graphes non orientés, et les graphes orientés. Nous allons formaliser et décrire ces deux grandes familles dans les sections qui suivent. 1.2 Graphes non orientés F IG . 1.1 – Exemple de graphe non orienté Un graphe fini non orienté (G) se définit grâce deux ensembles finis : un ensemble de sommets (X), et un ensemble d’arêtes (U ). G = [X, U ] avec X = {x1 , x2 , x3 , . . . , xn } et U = {u1 , u2 , u3 , . . . , um } Une arête uk de U est définie par une paire non-ordonnée de sommets (xi , xj ). Sur la figure 1.1 G = [X, U ] avec X = {1, 2, 3, 4, 5, 6, 7} et U = {u1 , u2 , u3 , u4 , u5 , u6 , u7 , u8 , u9 , u10 , u11 }. Définition 1.1 (extrémité) xi et xj sont appelés les extrémités de uk . Sur la figure 1.1 les sommets 6 et 7 sont les extrémités de u9 . Eric L ALLET, Jean-Luc R AFFY 3 Définition 1.2 (adjacent) Deux sommets reliés par une arête sont adjacents Sur la figure 1.1 les sommets 6 et 7 sont adjacents. Définition 1.3 (incident) Une arête est incidente aux sommets qu’elle relie. On dit aussi qu’un sommet est incident aux arêtes qui l’ont pour extrémité. Sur la figure 1.1 u9 est une arête incidente à 6 et 7. Définition 1.4 (boucle) Une arête u = (xi , xi ) dont les extrémités coïncident est appelée une boucle. Définition 1.5 (graphe simple) Un graphe est dit simple s’il ne contient aucune boucle et si aucun couple de sommet n’est relié par deux arêtes ou plus. Un graphe qui n’est pas simple est appelé un multigraphe. L’exemple de la figure 1.1 est un multigraphe : il y a par exemple deux arêtes entre les sommets 1 et 2, et une boucle sur le sommet 7. Définition 1.6 (ordre) L’ordre N d’un graphe est son nombre de sommets. N = |X| Le graphe de la figure 1.1 est d’ordre 7. Définition 1.7 (degré) Le degré d(xi ) d’un sommet est le nombre d’arêtes incidentes. Les arêtes qui bouclent comptent pour 2. Le degré D(G) d’un graphe est le degré maximum de tous ses sommets. Sur la figure 1.1 d(7) = 4, d(2) = 5, et D(G) = 5. Définition 1.8 (graphe biparti) Un graphe est biparti si l’ensemble de ses sommets peut être partitionné en 2 classes X1 et X2 de sorte que 2 sommets de la même classe ne soient jamais adjacents. Il se note G = (X1 , X2 , U ). Définition 1.9 (graphe complet) Un graphe G = (X, U ) est dit complet si pour toute paire de sommets xi , xj il existe au moins une arête de la forme (xi , xj ) Définition 1.10 (graphe biparti complet) Un graphe bipartie G = (X1 , X2 , U ) est dit biparti complet si tous les sommets de X1 sont reliés à tous les sommets de X2 . X2 X1 Graphe complet K5 Graphe biparti G=(X1, X2, U) X1 X2 Graphe biparti complet K3,2 F IG . 1.2 – Exemples de graphes bipartis ou complets Le graphe complet simple d’ordre n est appelé Kn . Un graphe simple biparti complet G = (X1 , X2 , U ) avec |X1 | = p et |X2 | = q est appelé Kp,q . Sur la figure 1.2, G est un graphe bipartie, K5 est un graphe complet, K3,2 est un graphe biparti complet. Définition 1.11 (cocycle) Soit A un sous ensemble de sommets de X. Le cocycle de A (noté ω(A)) est l’ensemble des arêtes ayant une extrémité dans A et l’autre dans X − A. Sur la figure 1.3 on a ω(A) = {u1 , u2 , u4 , u7 , u9 , u11 } 4 Eric L ALLET, Jean-Luc R AFFY F IG . 1.3 – Cocycle Définition 1.12 (chaîne) Une chaîne joignant x1 à xn est une suite de la forme (x1 , u1 , x2 , u2 , x3 , u3 . . . un−1 , xn ) qui commence par x1 , se finit par xn et qui alterne sommets et arêtes incidents. Les sommets étant implicites, la chaîne est souvent notée qu’avec ses arêtes : (u1 , u2 , u3 , . . . un−1 ). Lorsque le graphe est simple, la chaîne peut aussi être notée qu’avec ses sommets (x1 , x2 , . . . xn ). Définition 1.13 (chaîne élémentaire) Une chaîne est élémentaire si tous les sommets qui la composent sont différents. Définition 1.14 (chaîne simple) Une chaîne est simple si elle ne contient pas deux fois la même arête. Définition 1.15 (chaîne fermée) Une chaîne est fermée si elle termine sur le sommet où elle a commencé (x1 = xn ). Définition 1.16 (cycle) Un cycle est une chaîne fermée simple qui n’a aucun sommet en double mis à part le premier qui est identique au dernier. (u8 , u4 , u6 ) est une chaîne élémentaire simple allant de 5 à 4. (u9 , u10 ) est une chaîne simple qui va de 6 à 7. Elle n’est pas élémentaire car elle passe deux fois par 7 (5, u8 , 2, u2 , 1, u1 , 2, u8 , 5) est une chaîne fermée allant de 5 à 5, mais n’est pas un cycle. (1, u2 , 2, u7 , 4, u5 , 1) est un cycle. Définition 1.17 (connexité) Un graphe est dit connexe si pour tout couple de sommets xi et xj soit il existe une chaîne allant de xi à xj , soit on a xi = xj . Pour exprimer cette définition autrement, utilisons la relation R suivante : xi = xj ou xi Rxj ⇔ Il existe une chaîne allant de xi à xj Cette relation R définit une relation d’équivalence (relation réflexive, symétrique, et transitive). Elle forme ainsi des classes d’équivalence qui divisent le graphe en plusieurs partitions. Par exemple, le graphe de la figure 1.1 est divisé en deux classes d’équivalence avec dans une classe les sommets 1, 2, 3, 4 et 5 et dans l’autre les sommets 6 et 7. Définition 1.18 (nombre de connexité) Le nombre p de classes d’équivalence distinctes de la relation R est appelé le nombre de connexité du graphe. Il existe alors une deuxième façon de définir la connexité : Définition 1.19 (connexité (2e )) Un graphe est dit connexe si et seulement si son nombre de connexité p vaut 1 Eric L ALLET, Jean-Luc R AFFY 5 1.3 Graphes orientés Un graphe orienté est un graphe dont les arêtes ont un sens. On les appelle des arcs. Pour ce genre de graphes les définitions et les propriétés définies pour les graphes non-orientés ont besoin d’être adaptées. Un graphe fini orienté (G) se définit grâce deux ensembles finis : un ensemble de sommets (X), et un ensemble d’arc (U ). G = [X, U ] avec X = {x1 , x2 , x3 , . . . , xn } et U = {u1 , u2 , u3 , . . . , um } Un arc uk de U est défini par une paire ordonnée de sommets (xi , xj ). On dit que l’arc uk va de xi à xj . F IG . 1.4 – Exemples de graphe orienté Sur la figure 1.4 G = [X, U ] avec X = {1, 2, 3, 4, 5, 6, 7} et U = {u1 , u2 , u3 , u4 , u5 , u6 , u7 , u8 , u9 , u10 , u11 }. L’arc u1 va de 1 vers 2 et l’arc u10 va de 7 vers 7. Définition 1.20 (extrémité initiale) Soit un arc uk = (xi , xt ). xi est dite l’extrémité initiale de uk . On définit aussi une fonction I(uk ) = xi qui donne l’extrémité initiale d’un arc. Définition 1.21 (extrémité terminale) Soit un arc uk = (xi , xt ). xt est dite l’extrémité terminale de uk . On définit aussi une fonction T (uk ) = xt qui donne l’extrémité terminale d’un arc. On nome aussi cette extrémité, l’extrémité finale. Sur un graphe orienté chaque sommet a deux demi-degrés : le demi-degré extérieur et le demi-degré intérieur. Définition 1.22 (demi-degré extérieur) Le demi-degré extérieur d’un sommet xi est le nombre d’arcs ayant xi comme extrémité initiale. La fonction d+ , demi-degré extérieur se définit avec : d+ (x) = |{u ∈ U/I(u) = x}|. Définition 1.23 (demi-degré intérieur) Le demi-degré intérieur d’un sommet xt est le nombre d’arcs ayant xt comme extrémité terminale. La fonction d− , demi-degré intérieur se définit avec : d− (x) = |{u ∈ U/T (u) = x}|. Définition 1.24 (degré) Le degré d’un sommet est la somme de ses deux demi-degrés. La fonction d, degré d’un sommet se définit avec : d(x) = d+ (x) + d− (x). À la lecture de cette définition, on comprend pourquoi pour les graphes non orientés on compte deux fois les boucles dans la définition du degré d’un sommet. Sur le graphe de la figure 1.4 on a d+ (2) = 3, d− (2) = 2, d(2) = 5, d+ (7) = 2, d− (7) = 2, d(7) = 4. 6 Eric L ALLET, Jean-Luc R AFFY Définition 1.25 (successeur) On dit que le sommet xt est successeur du sommet xi s’il existe au moins un arc ayant xi comme extrémité initiale, et xt comme extrémité terminale. Définition 1.26 (prédécesseur) On dit que le sommet xi est prédécesseur du sommet xt s’il existe au moins un arc ayant xi comme extrémité initiale, et xt comme extrémité terminale. Sur l’exemple le sommet 1 a 2 et 3 pour successeurs. Le sommet 7 a 6 et lui même pour successeurs. Le sommet 2 est prédécesseur de 3, 4 et 5. Le sommet 7 est prédécesseur de 6 et de lui même. Définition 1.27 (p-graphe) Un p-graphe est un graphe dans lequel il n’existe jamais plus de p arcs de la forme (xi , xj ) entre 2 sommets quelconques xi et xj pris dans cet ordre. Le graphe de l’exemple est un 2-graphe. Il existe 2 arcs de la forme (1, 2) et aucun autre arc n’est doublé ou plus dans ce graphe. Définition 1.28 (application multivoque) Soit une application A allant de l’ensemble E vers lui même. On parle d’application multivoque lorsque l’application A associe à tout élément de l’ensemble, un sous ensemble de l’ensemble. Par exemple l’application définie sur un ensemble de personnes par «a pour enfant» est une application multivoque. Définition 1.29 (application multivoque Γ+ ) Soit un graphe G = [X, U ]. On définit Γ+ comme l’application qui à tout sommet x de X associe l’ensemble des sommets successeurs de x. Sur l’exemple de la figure 1.4 Γ+ (4) = {1, 3}. Γ+ (4) peut se noter Γ+ 4. Définition 1.30 (application multivoque Γ− ) Soit un graphe G = [X, U ]. On définit Γ− comme l’application qui à tout sommet x de X associe l’ensemble des sommets prédécesseurs de x. Sur l’exemple Γ− (7) = {6, 7}. Γ− (4) peut se noter Γ− 4. Dans le cas d’un 1-graphe la connaissance de l’ensemble des sommets X et de l’application Γ+ définit totalement le graphe. Voila pourquoi dans ce cas, il est possible de définir un graphe G comme G = [X, Γ+ ]. Définition 1.31 (cocircuit) Étant donné un sous-ensemble de sommets A d’un graphe G = (X, U ), A ⊆ X on définit : ω + (A) : l’ensemble des arcs ayant leur extrémité initiale dans A, et leur extrémité terminale dans (X − A). ω + (A) = {u ∈ U/I(u) ∈ AetT (u) ∈ X − A} ω − (A) : l’ensemble des arcs ayant leur extrémité terminale dans A, et leur extrémité initiale dans (X − A) ω − (A) = {u ∈ U/I(u) ∈ X − AetT (u) ∈ A} Enfin, on a : ω(A) = ω + (A) + ω − (A). L’ensemble des arcs formés par ω(A) est appelé le cocircuit de A. Sur la figure 1.5 on a ω + (A) = {u4 , u7 , u11 }, ω − (A) = {u1 , u2 , u9 , }, et ω(A) = {u1 , u2 , u4 , u7 , u9 , u11 } Définition 1.32 (chemin) Un chemin est une chaîne orientée. Définition 1.33 (circuit) Un circuit est un cycle orienté (donc un chemin simple fermé avec aucun sommet en double mis à part le premier indentique au dernier). Sur le graphe de la figure 1.4, (1, u2 , 2, u8 , 5) est un chemin allant de 1 à 5. Et (u1 , u7 , u5 ) forme un circuit bouclant sur 1. Eric L ALLET, Jean-Luc R AFFY 7 u1 A u2 1 2 u3 X−A 5 u4 3 u5 u8 u7 u11 u6 4 u10 7 u9 6 F IG . 1.5 – Cocircuit Définition 1.34 (forte connexité) Un graphe orienté est dit fortement connexe si pour tout couple de sommets xi et xj il existe un chemin allant de xi à xj . Pour exprimer cette définition autrement, utilisons la relation R suivant : xi = xj ou xi Rxj ⇔ Il existe un chemin allant de xi à xj et un chemin allant de xj à xi Cette relation R définit une relation d’équivalence (relation réflexive, symétrique, et transitive). Elle forme ainsi des classes d’équivalence qui divisent le graphe en plusieurs partitions. Par exemple, le graphe de la figure 1.4 est divisé en 4 classes d’équivalence : {1, 2, 4}, {6, 7}, {3} et {5}. On dit que ce graphe a 4 composantes fortement connexes. 1.4 Matrice d’adjacence Dans les cas réels, le dessin d’un graphe peut être fastidieux (car trop grand, trop complexe), et totalement illisible (trop d’arètes ou d’arcs qui se croisent dans tous les sens). Il faut alors choisir une autre réprésentation. Il en existe plusieurs et dans ce cours on aura l’occasion d’utiliser les «matrices d’adjacence». Une matrice d’adjacence permet la représentation d’un graphe simple orienté ou non-orienté. Soit G = [X, U ] un graphe simple avec |X| = N . Sa matrice A d’adjacence est une matrice N × N remplis de booléens avec aij = 1 si (xi , xj ) ∈ U 0 sinon On peut aussi représenter des multigraphes avec ce type de matrice en remplaçant les booléens par des entiers : aij = |Uij | avec Uij = {u ∈ U/(I(u) = xi et T (u) = xj )} Pour les graphes non-orientés on peut décider de ne pas remplir une moitié de la matrice (copie de l’autre moitié). 8 Eric L ALLET, Jean-Luc R AFFY Voici des exemples de matrices d’adjacence. 0 2(u1 , u2) 1(u3 ) 1(u5 ) 0 0 0 0 0 0 1(u5 ) 0 0 0 0 1(u4 ) 1(u7 ) 1(u8 ) 0 0 0 1(u6 ) 0 0 0 0 0 0 0 2(u1 , u2 ) 0 0 0 0 0 0 1(u3 ) 1(u4 ) 0 1(u6 ) 0 0 0 0 1(u7 ) 0 0 0 0 0 0 0 0 0 2(u9 , u11 ) 0 1(u8 ) 0 0 0 0 0 1(u10 ) 0 0 0 0 0 0 1(u11 ) 0 0 0 0 0 1(u9 ) 1(u10 ) 1.5 Exercices Exercice 1.1 (De mains en mains) Arnaud, Bertrand, Carole, Dorothée, Étienne et Fanny sont des représentants d’une même societée. Ils sont basés sur des sites differents, mais ils se croisent parfois lors de leurs voyages. Ils ont alors pour habitude de déjeuner ensemble. La semaine prochaine Arnaud et Bertrand ont prévu de déjeuner ensemble le lundi, tandis que Étienne et Fanny feront de même de leur coté. Mardi Dorothée et Étienne partageront leur repas dans ville, et Arnaud et Cyril dans une autre ville. Mercredi Cyril doit manger avec Dorothée. Jeudi Dorothée déjeune avec Étienne et enfin, vendredi Étienne retrouvera Fanny pour son repas. Bertrand aimerait profiter de ces rencontres pour transmettre un colis à Fanny. Est-ce possible ? Et si oui par quelles mains doit transiter le colis. Et Étienne voudrait transmettre un colis à Arnaud. Est-ce possible ? Et si oui par quelles mains doit transiter le colis. Correction page 107. Exercice 1.2 (Qui triche ?) Arnaud, Bertrand, Carole, Dorothée, Étienne, Fanny et Gabriel doivent passer un test de mémoire. Pour cela ils reçoivent une liste d’objets qu’ils doivent aller chercher dans une autre pièce. Ils ont tout le temps qu’ils veulent pour apprendre la liste, mais ensuite ils doivent aller dans la pièce sans liste et en un seul passage chercher les objets de cette liste. Mais le surveillant qui devait vérifier que les personnes n’allaient qu’une seule fois dans la pièce s’est endormi. Cependant le portique d’entrée de la pièce a pu compter les entrées : 9. Il y a donc eu de la triche ! On interroge les candidats, et tous affirment qu’ils n’ont vu personne entrer deux fois dans la pièce durant leur propre passage. Trop occupés à se souvenir de leur objet, ils ne se souviennent plus trop de l’ordre des entrées sorties, par contre ils savent qui ils ont vu dans la pièce : – Arnaud a vu Bertrand, Dorothée, et Gabriel. – Bertrand a vu Arnaud, Cyril et Gabriel. – Cyril a vu Bertrand, Dorothée, Fanny et Gabriel. – Dorothée a vu Arnaud, Cyril, Étienne et Gabriel. – Étienne a vu Dorothée, Fanny et Gabriel. – Fanny a vu Étienne, Cyril et Gabriel. – Gabriel a vu tout le monde ! Qui a triché ? Correction page 108. Eric L ALLET, Jean-Luc R AFFY 9 Exercice 1.3 (Qui triche ? (bis)) On se pose le même problème que précédement, mais cette fois ci le portique n’a pas compté les entrées, et les témoignages sont les suivants : – – – – – – – Arnaud a vu Bertrand, Dorothée, et Gabriel. Bertrand a vu Arnaud, et Gabriel. Cyril a vu Dorothée et Fanny. Dorothée a vu Arnaud, Cyril, et Étienne. Étienne a vu Dorothée et Fanny. Fanny a vu Étienne et Cyril. Gabriel a vu Arnaud, Bertrand, ! Y’a-t-il eu tricheries ? Et si oui par qui ? Correction page 109. Exercice 1.4 (Ménager la chèvre et le choux) Un fermier se retrouve au bord d’une rivière avec sa chèvre, son loup apprivoisé, et des choux. Il doit franchir la rivière avec tout ce beau monde. Mais la barque qu’il peut utiliser n’a assez de place que pour lui et soit la chèvre, soit le loup, soit le choux. De plus il ne peut pas se permettre de laisser sur une rive la chèvre seule avec le choux, sinon elle le mangerait, ni laisser la chèvre seule avec le loup, sinon le loup la mangerait. Sachant que seul le fermier sait manipuler la barque, quels voyages doit faire le fermier pour que tous traversent la rivière indemnes. Correction page 109. 10 Eric L ALLET, Jean-Luc R AFFY Chapitre 2 Les problèmes d’ordonnancement 2.1 Introduction On se pose des problèmes d’ordonnancement lorsque l’on est confronté à un problème d’organisation. Il faut accomplir de multiples tâches qui demandent un certain temps d’exécution et qui doivent être exécutées dans un certain ordre. Il est donc nécessaire d’identifier les tâches prioritaires en fonction de l’objectif à atteindre et, lors de leur exécution, il faut détecter les retards et les dépassements de moyens. Les nombreuses méthodes d’ordonnancement peuvent se regrouper en deux grandes familles selon le principe de base qu’elles utilisent. On distingue : – les méthodes du type diagramme à barres : GANTT – les méthodes à chemin critique : potentiel-tâches, potentiel-étapes (PERT). Dans ce cours nous allons traiter les diagrammes de GANTT et le potentiel-tâches. 2.2 Le diagramme de GANTT Un diagramme de GANTT se présente sous la forme d’un tableau à deux dimensions. Les colonnes représentent l’avancement du temps (par exemple chaque colonne pourra symboliser la durée d’une semaine), et les lignes contiennent les différentes tâches à accomplir. En face de chaque tâche on va dessiner une barre allant du temps début de la tâche à son temps de fin. Imaginons un exemple où l’on a 8 tâches à accomplir avec les durées et les contraintes suivantes : Tâches A B C D E F G H Durées 3 semaines 2 semaines 5 semaines 3 semaines 3 semaines 5 semaines 2 semaines 2 semaines Contraintes A achevée A, B achevées D achevée C, E achevées F, G achevées Les trois premières tâches (A, B et C) n’ont aucune contrainte. Elles peuvent commencer au temps 0. On peut donc les représenter dans notre table en traçant une barre partant du temps 0, et parcourant la durée de la tâche : 3 semaines pour A, 2 pour B, et 6 semaines pour C : Eric L ALLET, Jean-Luc R AFFY 11 Tâches 1 2 3 4 5 6 7 8 9 10 11 12 13 A B C Par contre la tâche D ne peut commencer qu’après la tâche A et E ne peut commencer qu’après les tâches A et B. Comme ces tâches sont déjà dans notre diagramme, on connaît leurs temps de fin (après la semaine 3 et 2), il est donc possible de tracer la barre ces deux tâches : Tâches 1 2 3 4 5 6 7 8 9 10 11 12 13 A B C D E Les contraintes de F et G sont maintenant résolues. F commence après D donc après la sixième semaine. G ne peut commencer qu’après C et E, c’est le temps de fin de E (6) la plus grande contrainte qui va imposer le début de G : Tâches 1 2 3 4 5 6 7 8 9 10 11 12 13 A B C D E F G Il ne reste plus que H à placer. Cette tâche commence après F et G. De ces deux tâches, c’est F qui termine en dernier, c’est donc après la semaine 11, que H va commencer. 12 Eric L ALLET, Jean-Luc R AFFY Tâches 1 2 3 4 5 6 7 8 9 10 11 12 13 A B C D E F G H Ce diagramme nous apprend déjà que le projet durera 13 semaines. Il va aussi permettre d’attribuer les tâches à des équipes. On peut représenter sur le graphique l’avancement des travaux. Il suffit d’indiquer par une barre le travail effectivement accompli depuis que les tâches A, B et C ont été commencées. Si on procède ainsi pour toutes les tâches on saura à tout moment quel est l’état d’avancement du projet. Sur ce graphe, les tâches D et E sont très similaires. Elles semblent devoir commencer et finir en même temps. Pourtant on va voir dans la section suivante qu’il est tout à fait possible de reporter la tâche E de trois semaine sans que cela ne change la durée du projet, alors que le moindre report de la tâche D allongera la durée du projet. Cette notion importante de tâche «critique» n’apparait pas sur le diagramme de GANNT. De plus les contraintes n’apparaissent plus sur cette version du graphe. Par exemple on voit bien que la tâche F commence après la semaine 6, mais on ne peut pas savoir si c’est à cause de la tâche D ou de la tâche E. On ne peut pas immédiatement déduire les conséquences d’un retard d’une tâche sur les autres. Voila pourquoi certains logiciels proposent une version améliorée de GANTT qui fait ressortir ces dépendances. En résumé ce diagramme présente les avantages suivants : – clarté et simplicité de la méthode – information très condensée – le plan d’action peut être facilement suivi. – le déroulement des tâches peut se suivre dans le temps. Par contre il a ces inconvénients : – les tâches critiques ne sont pas mises en évidence – l’élaboration d’un plan d’action se révèle malaisé car cette méthode ne fait pas apparaître les liaisons entre les tâches. La mise en évidence de ces tâches critiques et de l’enchaînement des tâches est au contraire le point fort de la méthode «potentiel-tâches» présentée dans la section suivante. 2.3 La méthode potentiel-tâches 2.3.1 Construction du graphe Le but de cette méthode est de mettre en valeur l’enchaînement des tâches, de déterminer les dates de début et de fin de chaque tâche, de connaître les marges de manœuvre possibles sur ces dates. Pour cela on va construire un graphe dont les sommets seront les tâches du projet et les arcs les contraintes qui les lient. Ces arcs seront étiquetés (valués) par la durée de la tâche dont ils sont issus. La première étape de cette méthode va être de dessiner le graphe des tâches. Reprenons l’exemple de la section précédente : Eric L ALLET, Jean-Luc R AFFY 13 Tâches A B C D E F G H Durées 3 semaines 2 semaines 5 semaines 3 semaines 3 semaines 5 semaines 2 semaines 2 semaines Contraintes A achevée A, B achevée D achevée C, E achevées F, G achevées On commence le graphe en plaçant un sommet pour toutes les tâches n’ayant aucune contrainte. Pour l’exemple, on place donc les sommets A, B et C (cf l’étape 1 sur la figure 2.1). Ensuite on ajoute étape par étape les sommets qui ne dépendent que des sommets déjà placés. On ajoute un arc entre les sommets des étapes pré-requises et le sommet ajouté. Sur cet arc on indique la durée de la tâche pré-requise. Donc pour l’exemple, après les tâches A, B et C, on peut placer les tâches D et E. On trace aussi les arcs partant de A et B vers ces deux tâches, en indiquant dessus leur durée. Donc la valeur 3 pour la tâche A et 2 pour la tâche B (cf l’étape 2 de la figure 2.1). 3 A A D 3 B B C C Etape 1 2 E Etape 2 F IG . 2.1 – Début de la construction du graphe On continue ainsi à placer les autres tâches et les arcs qui indiquent les dépendances jusqu’à la dernière. On arrive alors au graphe de la figure 2.2. A 3 D 3 F 5 3 B 2 E 5 H 3 2 G C F IG . 2.2 – Graphe avec toutes les tâches Il nous reste à finaliser ce graphe. Pour cela il faut ajouter deux tâches fictives de durée nulle. La première, α va symboliser le début du projet. On va la relier à toutes les tâches sans dépendance, donc qui n’ont pas de prédécesseur. La seconde, ω va symboliser la fin du projet. Tous les sommets sans successeur vont y être reliés. Il faut bien sûr penser à placer sur les arcs la durée des tâches correspondantes. On arrive alors au graphe finalisé de la figure 2.3. 14 Eric L ALLET, Jean-Luc R AFFY F IG . 2.3 – Graphe finalisé 2.3.2 Recherche de la date au plus tôt Pour qu’une tâche puisse commencer il faut que toutes les tâches qui la relient au début du projet soient réalisées. Définition 2.1 (date au plus tôt) On définit donc ti , la date au plus tôt de la tâche i comme la date au plus tôt de l’exécution de la tâche i. Par exemple, pour commencer la tâche E, il faut avoir finit la tâche A et B. Comme A dure 3 semaines et B 2 semaines, ce sont les 3 semaines de A qui sont la véritable contrainte pour E. La tâche E ne pourra donc commencer au plus tôt que 3 semaines après le début du projet. En fait pour retrouver ce temps on a cherché le plus long chemin sur le graphe entre α et E. Définition 2.2 (durée du projet) On définit la durée du projet comme la date au plus tôt de la tâche ω. Cette date va donc se calculer en trouvant le plus long chemin de α à ω. Pour trouver les dates au plus tôt des différentes tâches, il suffit d’appliquer l’algorithme de recherche du plus long chemin1 sur le graphe (G = [X, U ]). Algorithme 2.1 (recherche des dates au plus tôt) 1. poser tα = 0 et S = {α}. 2. chercher un sommet j ∈ S̄ tel que Γ− / S}) j ⊆ S (remarque : S̄ = {x ∈ X/x ∈ 3. poser tj = max(ti + di )i∈Γ− j 4. poser S = S ∪ {j} 5. si |S| = |X| fin, sinon retourner en 2. Faisons tourner cet algorithme sur notre exemple. Pour aller plus vite, plutôt que de prendre un seul sommet à l’étape 2, on peut prendre tous les sommets dont les prédécesseurs sont déjà traités. – tα = 0 et S = {α}. – Les prédécesseurs de A, B et C sont déjà dans S. On peut donc les traiter. tA = max( tα + dα ) = 0 |{z} |{z} 0 0 tB = max( tα + dα ) = 0 |{z} |{z} 0 0 tC = max( tα + dα ) = 0 |{z} |{z} 0 0 S = {α, A, B, C} 1 Voir la section 2.4 à ce sujet Eric L ALLET, Jean-Luc R AFFY 15 – Les prédécesseurs de D et E sont dans S. On peut donc les traiter. tD = max( tA + dA ) = 3 |{z} |{z} 3 0 tE = max( tB + dB , tA + dA ) = max(2, 3) = 3 |{z} |{z} |{z} |{z} 3 0 2 0 S = {α, A, B, C, D, E} – Les prédécesseurs de F et G sont dans S. On peut donc les traiter. tF = max( tD + dD ) = 6 |{z} |{z} 3 3 tG = max( tE + dE , tC + dC ) = max(6, 5) = 6 |{z} |{z} |{z} |{z} 5 0 3 3 S = {α, A, B, C, D, E, F } – Les prédécesseurs de H sont dans S. On peut donc le traiter. tH = max( tF + dE , tG + dG ) = max(11, 8) = 11 |{z} |{z} |{z} |{z} 2 6 5 6 S = {α, A, B, C, D, E, F, G} – Le prédécesseur de ω est dans S. On peut donc le traiter. tω = max( tH + dH ) = 13 |{z} |{z} 2 11 S = {α, A, B, C, D, E, F, G, ω} – Fin Plutôt que de dérouler cet algorithme sur une feuille ligne après ligne, il est plus simple de le faire dans un tableau. On débute avec un tableau où seul le tα est connu : Tâches di Γ− i ti α 0 A 3 α B 2 α C 5 α D 3 A E 3 A,B F 5 D G 2 C,E ω 0 H H 2 F,G 0 Ensuite on ajoute dans la ligne ti tous les temps que l’on sait calculer : ceux dont le Γ− est déjà traité. Comme pour l’instant seul tα est connu, on peut traiter A, B et C : 16 Tâches di Γ− i α 0 ti 0 A 3 α ↓ tα + dα = 0 B 2 α ↓ tα + dα = 0 C 5 α ↓ tα + dα = 0 Eric L ALLET, Jean-Luc R AFFY D 3 A E 3 A,B F 5 D G 2 C,E H 2 F,G ω 0 H Maintenant on peut traiter D et E : Tâches di Γ− i α 0 ti 0 A 3 α B 2 α C 5 α 0 0 0 D 3 A ↓ tA + dA = 3 E 3 A ↓ tA + dA = 3 B ↓ hh( (( h= tB( +h dB( 2 hh ( F 5 D G 2 C, E h 2 F,G ω 0 H H 2 F, G ω 0 H Maintenant on peut traiter F et G : Tâches di Γ− i α 0 ti 0 A 3 α B 2 α C 5 α D 3 A E 3 A,B F 5 D ↓ tD + dD = 6 0 0 0 3 3 A 3 α B 2 α C 5 α D 3 A E 3 A,B F 5 D G 2 C,E 0 0 0 3 3 6 6 G 2 C ↓ hhh ( ( (= t( +( dCh 5 h C( h E ↓ tE + dE = 6 On continue avec H : Tâches di Γ− i α 0 ti 0 H 2 F ↓ tF + dF = 11 G ↓ hh( ( ( ( h= tG( +h dG 8 h ( h ω 0 H Et on termine avec ω : Tâches di Γ− i α 0 A 3 α B 2 α C 5 α D 3 A E 3 A,B F 5 D G 2 C, E h 2 F,G ti 0 0 0 0 3 3 6 6 11 ω 0 H ↓ tH + dH = 13 2.3.3 Recherche de la date au plus tard On sait maintenant quand une tâche pourra commencer au plus tôt. On va maintenant calculer quand il sera possible de commencer au plus tard une tâche sans que cela ne retarde la fin du projet. Définition 2.3 (date au plus tard) On définit donc Ti , la date au plus tard de la tâche i comme la date au plus tard où l’on puisse commencer i sans augmenter la durée du projet. Par exemple, prenons la tâche G. Cette tâche dure 2 semaines et doit être faite pour commencer la tâche H. La tâche H commence la 11eme semaine. Donc on peut décider de commencer la tâche G que 2 semaines avant c’est à dire la 9eme semaine sans que le projet ne prenne de retard. En résumé on peut commencer au plus tôt G la 6eme semaine et au plus tard la 9eme semaine (TG = 9). Pour trouver les dates au plus tard des différentes tâches on va appliquer l’algorithme suivant : Algorithme 2.2 (recherche des dates au plus tard) 1. poser Tω = tω et S = {ω}. 2. chercher un sommet j ∈ S̄ tel que Γ+ j ⊆ S 3. poser Tj = min(Ti )i∈Γ+ − dj j Eric L ALLET, Jean-Luc R AFFY 17 4. poser S = S ∪ {j} 5. si |S| = |X| fin, sinon retourner en 2. Faisons tourner cet algorithme sur notre exemple. Pour aller plus vite, plutôt que de prendre un seul sommet à l’étape 2, on peut prendre tous les sommets dont les successeurs sont déjà traités. – Tω = 13 et S = {ω}. – Le successeur de H est déjà dans S, On peut donc le traiter. TH = min( Tω ) − dH = 11 |{z} |{z} 2 13 S = {H, ω} – Les successeurs de F et G sont déjà dans S, On peut donc les traiter. TF = min( TH ) − dF = 6 |{z} |{z} 5 11 TG = min( TH ) − dG = 9 |{z} |{z} 2 11 S = {F, G, H, ω} – Les successeurs de C, D et E sont déjà dans S, On peut donc les traiter. TC = min( TG ) − dC = 4 |{z} |{z} 5 9 TD = min( TF ) − dD = 3 |{z} |{z} 3 6 TE = min( TG ) − dE = 6 |{z} |{z} 3 9 S = {C, D, E, F, G, H, ω} – Les successeurs de A et B sont déjà dans S, On peut donc les traiter. TA = min( TD , TE ) − dA = 3 − 3 = 0 |{z} |{z} |{z} 3 6 3 TB = min( TE ) − dB = 6 − 2 = 4 |{z} |{z} 2 6 S = {A, B, D, C, E, F, G, H, ω} – Les successeurs de α sont déjà dans S, On peut donc le traiter. Tα = min( TA , TB , TC ) − dα = 0 − 0 = 0 |{z} |{z} |{z} |{z} 0 4 0 4 S = {α, A, B, C, D, E, F, G, H, ω} – Fin. Plutôt que de dérouler cet algorithme sur une feuille ligne après ligne, il est plus simple de le faire dans un tableau. On débute avec un tableau où tous les ti sont connus, mais seul le Tω est fixé. Tâches di Γ− i ti Γ+ i Ti 18 α 0 0 A, B, C A 3 α 0 D,E B 2 α 0 E C 5 α 0 G D 3 A 3 F E 3 A,B 3 G F 5 D 6 H G 2 C, E 6 H H 2 F,G 11 ω ω 0 H 13 13 Eric L ALLET, Jean-Luc R AFFY Ensuite on ajoute dans la ligne Ti tous les temps que l’on sait calculer : ceux dont les dates au plus de tous les Γ+ i sont connues. Comme pour l’instant seul Tω est connu, on peut traiter H : α 0 Tâches di Γ− i ti Γ+ i 0 A, B, C A 3 α 0 D,E B 2 α 0 E C 5 α 0 G D 3 A 3 F E 3 A,B 3 G F 5 D 6 H G 2 C, E 6 H ω 0 H 13 H 2 F, G 11 ω ↓ Tω − dH = 11 Ti 13 Maintenant on peut traiter F et G : α 0 Tâches di Γ− i ti Γ+ i 0 A, B, C A 3 α 0 D,E B 2 α 0 E C 5 α 0 G D 3 A 3 F E 3 A,B 3 G F 5 D 6 H ↓ TH − dF = 6 H 2 F, G 11 ω ω 0 H 13 11 13 F 5 D 6 H G 2 C, E 6 H H 2 F, G 11 ω ω 0 H 13 6 9 11 13 G 2 C, E 6 H ↓ TH − dG = 9 Ti Maintenant on peut traiter C, D et E Tâches di Γ− i ti Γ+ i α 0 0 A, B, C A 3 α 0 D,E B 2 α 0 E C 5 α 0 G ↓ TG − dC = 4 D 3 A 3 F ↓ TF − dD = 3 E 3 A,B 3 G ↓ TG − dE = 6 Ti On continue avec A et B : Tâches di Γ− i ti Γ+ i Ti α 0 0 A, B, C A 3 α 0 D ↓ TD = 3 TD − dA = 0 E ↓ X X= TE 6 X X B 2 α 0 E ↓ C 5 α 0 G D 3 A 3 F E 3 A,B 3 G F 5 D 6 H G 2 C, E 6 H H 2 F,G 11 ω ω 0 H 13 4 3 6 6 9 11 13 TE − dB = 4 Eric L ALLET, Jean-Luc R AFFY 19 On finit avec α Tâches di Γ− i ti Γ+ i α 0 0 A ↓ TA = 0 TA − dα = 0 B C ↓ ↓ X X X X T = 4 T 4 X X B X C =X Ti A 3 α 0 D,E B 2 α 0 E C 5 α 0 G D 3 A 3 F E 3 A,B 3 G F 5 D 6 H G 2 C, E 6 H H 2 F,G 11 ω ω 0 H 13 0 4 4 3 6 6 9 11 13 2.3.4 Calcul des marges Définition 2.4 (marge totale) La marge totale Mi d’une tâche i est le délai dont on peut retarder cette tâche sans affecter l’achèvement du projet. Cette marge est donnée par la différence entre la date au plus tard et la date au plus tôt : Mi = Ti − ti . Dans notre exemple on obtient : Tâches di Γ− i ti Γ+ i Ti Mi α 0 0 A,B,C 0 0 A 3 α 0 D,E 0 0 B 2 α 0 E 4 4 C 5 α 0 G 4 4 D 3 A 3 F 3 0 E 3 A,B 3 G 6 3 F 5 D 6 H 6 0 G 2 C, E 6 H 9 3 H 2 F,G 11 ω 11 0 ω 0 H 13 13 0 Les tâches critiques sont celles qui ont une marge nulle. Il est impossible de prendre du retard dessus sans retarder tout le projet. Le chemin critique passe par les tâches critiques. On le visualise sur le graphe en doublant les arcs de ce chemin (voir figure 2.4). F IG . 2.4 – Graphe avec le chemin critique 2.3.5 Calcul sur le graphe Il est tout à fait possible de calculer les dates au plus tôt, les dates au plus tard et marges directement sur le graphe. Pour cela on va le présenter un peu différemment. Les sommets vont être remplacer par des cases avec 3 emplacements : un pour la date au plus tôt, un pour la date au plus tard et le dernier pour la marge. 20 Eric L ALLET, Jean-Luc R AFFY F IG . 2.5 – Calcul de la date au plus tôt : état initial Un premier parcours du graphe va permettre de calculer les dates au plus tôt. On débute avec un graphe avec des cases vides, sauf pour le tα qu’on initialise à 0 (voir figure 2.5). Ensuite on déroule le même algorithme que précédemment. On regarde tous les sommets dont les prédécesseurs sont déjà traités. Pour chaque arc arrivant sur le sommet, on calcule la somme la valeur du ti du sommet initial de l’arc et de la valeur de l’arc. On met le maximum sur le sommet terminal. Pour la première étape, on peut remplir les sommets A, B et C. Ils n’ont qu’un seul prédécesseur chacun, et donc la maximum est vite trouvé (voir figure 2.6). F IG . 2.6 – Calcul de date au plus tôt : première étape A, B et C Pour la seconde étape, le calcul est simple pour D. Il n’y a qu’un seul prédécesseur, il suffit donc de faire la somme du sommet initial (A=0) et de l’arc (3).Par contre E à 2 prédécesseurs. La somme en partant A est plus grande, c’est donc cette valeur (3) que l’on prend (voir figure 2.7). F IG . 2.7 – Calcul de la date au plus tôt : seconde étape D et E La troisième étape permet de remplir la date au plus tôt de F et G. Pour F il n’y a que l’arc venant de D à prendre en compte, mais pour G il y a deux choix. La plus grande valeur vient par E (voir figure 2.8). En continuant avec la même logique on remplit la date au plus tôt de H (un maximum à choisir parmi 2 arcs) et de ω (voir figure 2.9). Maintenant il faut remonter le graphe depuis le sommet ω pour calculer Ti , les dates au plus tard de Eric L ALLET, Jean-Luc R AFFY 21 F IG . 2.8 – Calcul de la date au plus tôt : troisième étape F, et G F IG . 2.9 – Calcul de la date au plus tôt : fin chaque tâche. On initialise Tω , la date au plus tard d’ω avec la valeur de sa date au plus tôt que l’on vient de calculer. On obtient le graphe initial de la figure 2.10. F IG . 2.10 – Calcul de la date au plus tard : état initial Ensuite on déroule l’algorithme du calcul de la date au plus tard. On regarde tous les sommets dont les successeurs sont déjà traités. On choisit parmi les successeurs celui qui à le plus petit Ti , et on lui retire la valeur de l’arc. Pour la première étape, on peut remplir le sommet H. Il n’a qu’un seul successeur et donc la minimum est vite trouvé (voir figure 2.11). Le seconde étape permet de trouver la date au plus tard pour F et G. Ces deux sommets n’ont qu’un seul successeur, donc il suffit de retirer la valeur de l’arc au Ti du successeur. On arrive au graphe de la figure 2.12 Lorsque deux étapes plus loin, les dates au plus tard de A, B et C sont calculés, on peut trouver celle de α. Il a trois successeur, et c’est A qui avec TA = 0 a le Ti minimum alors que B avec TB = 4 et C avec TC = 3 sont rejetés. 22 Eric L ALLET, Jean-Luc R AFFY F IG . 2.11 – Calcul de date au plus tard : première étape H F IG . 2.12 – Calcul de la date au plus tard : seconde étape (F et G) F IG . 2.13 – Calcul de la date au plus tard : fin Maintenant il nous reste à calculer les marges (Mi ) de chaque étape. Pour cela il suffit de faire la différence entre la date au plus tard (Ti ) et la date au plus tôt (ti ) pour chaque sommet du graphe. On va aussi doubler les arcs du chemin critique. F IG . 2.14 – Calcul des marges et du chemin critique Eric L ALLET, Jean-Luc R AFFY 23 2.4 Recherche du plus long chemin L’algorithme utilisé pour la recherche de la date au plus tôt est une recherche de plus long chemin. Il est donc possible d’utiliser le même algorithme sur des graphes qui ne sont pas liés à des problèmes d’ordonnancement lorsqu’on a besoin de trouver un plus long chemin. Cette technique peut être très pertinente lors de la recherche d’un «maximum». Les exercices 2.2 et 2.3 à la fin de chapitre illuste ce cas. 2.5 Exercices Exercice 2.1 (Organisation d’un colloque) Vous avez été choisi par vos pairs lors d’une conférence sur les techniques quantitatives pour organiser la suivante à Paris. La date a été fixée. Ce sera du 17 au 20 décembre 2009 pour que vos collègues puissent en profiter, s’ils le souhaitent, pour prolonger leur séjour à Paris lors des fêtes. C’est la première fois que vous êtes organisateur. Vous demandez donc conseil à un collègue expérimenté qui vous explique ce qu’il faut faire, mais de manière «non linéaire» : «La première chose à faire est de trouver le site de la conférence. Par exemple un hôtel qui pourra héberger les participants et qui possède des salles de conférence. Il faut compter 3 semaines pour le trouver. D’ailleurs pour toutes ces recherches, et tout l’aspect logistique, tu dois t’entourer d’une équipe, le comité d’organisation, à qui tu délégueras l’essentiel de ces tâches. Choisir cette équipe devrait te prendre 1 semaine. Il te faut aussi choisir le comité de programme. Ça sera l’équipe chargée de l’aspect scientifique du colloque. Compte 3 semaines pour ce choix. Ce comité de programme devra se réunir 2 fois avant la conférence. Une première fois, avant l’appel à communications, pour fixer les grandes lignes du programme qui seront indiquées dans cet appel. Et une seconde fois, après la sélection finale des articles, et au moins 3 semaines avant le colloque, pour fixer en détail le programme final. Le temps que les articles soient écrits et envoyés, il faut laisser aux auteurs, un délais de 8 semaines entre l’appel à communications et la sélection. Il faut aussi laisser 8 semaines au jury entre la réception des articles, et la sélection finale. Tu dois aussi te mettre d’accord avec un imprimeur pour l’édition des «proceedings». En général il faut compter 6 semaines pour l’impression à condition que tous les articles aient été mis en forme selon les conventions de l’imprimeur. Pour cela, accorde 4 semaines après la sélection finale aux différents auteurs pour qu’ils fassent cette mise en forme. Il faut que tu aies reçu les livres imprimés au moins 1 semaine avant le colloque. Prévoie aussi un programme «social» pour occuper les conférenciers en dehors du temps des conférences. Le temps fort sera un banquet lors d’une soirée. Ton comité d’organisation devrait pouvoir choisir le lieu de ce banquet en 2 semaines. Il devra aussi se mettre d’accord avec l’hôtel pour les menus et les prix des repas lors de la conférence. Pour cela compte 1 semaine après le choix de l’hôtel. Une fois tout cela connu, laisse encore 1 semaine au comité d’organisation pour fixer le prix que devront payer les conférenciers. Ce prix et le programme «social» devront figurer dans l’appel à communications. De plus, comme j’ai compris que tu avais des sponsors généreux, tu devrais profiter des deux réunions du comité de programme pour tester l’hôtel et le lieu du banquet. Donc programme la première réunion du comité de programme dans l’hôtel, et prévoie un dîner sur le lieu du banquet le soir de la seconde réunion. Voila, je pense que je n’ai rien oublié.» Et bien quand devez-vous commencer au plus tard à organiser tout cela pour que le colloque puisse bien débuter le 17 décembre ? Il n’est jamais simple de fixer une date de réunion. . . Quelles sont les marges dont vous disposez pour les deux réunions du comité de programme pour fixer une date sans que cela ne ralonge votre préparation ? Correction page 110 24 Eric L ALLET, Jean-Luc R AFFY Exercice 2.2 (Le banquet) 2 Apollodore, un jeune traiteur, vient de se mettre à son compte et propose ses services pour des banquets. En une journée de travail il arrive à produire 50 repas. Par contre il ne possède pas encore ses cuisines. Il a cependant trouvé une grosse collectivité qui possède des cuisines sous-utilisées trois jours par semaine et qui loue alors des espaces de travail. La location, même d’une seule journée, donne aussi l’accès durant la semaine à un espace de stockage en chambre froide où le traiteur peut conserver jusqu’à 100 repas. Cet espace doit être totalement libéré le vendredi soir. En tenant compte du prix de location (variable), et des matières premières utilisées, Apollodore a calculé le prix d’une journée de production (50 repas) suivant la journée : Jour Prix lundi 2k euros mardi 2k euros jeudi 1k euros Pour la semaine à venir il a trouvé trois demandes pour 100 repas (chaque demande est pour 100 repas) qui pourraient lui convenir. S’il les accepte (il peut accepter certaines et refuser d’autres), voici les jours et les prix convenus : Jour Prix mardi 7k euros mercredi 4k euros vendredi 4k euros Les jours où il sert un banquet, il n’a pas le temps de produire des repas. De plus chaque banquet lui coûte 1k euros de frais divers (transport, services. . . ) à soustraire aux revenus indiqués ci dessus. Est-ce qu’Apollodore a intérêt à travailler cette semaine ? – Si oui, selon quel planning ? – Sinon pourquoi ? Correction page 112 Exercice 2.3 (Le banquet, suite) Apollodore connaît un ami, Aristodème, exactement dans les mêmes conditions que lui. Ils peuvent travailler ensemble durant cette semaine. Aristodème devra lui aussi payer la location d’un espace de travail, donc le prix des repas supplémentaires produits reste le même. Par contre il peut très bien continuer à produire des repas les jours où Apollodore sert les banquets (s’il a accès aux cuisines ce jour là !). Leur conseillez-vous de travailler ensemble cette semaine (notez qu’ils peuvent très bien ne pas travailler les mêmes jours ni le même nombre de jours) ? – Si oui, selon quel planning ? – Sinon pourquoi ? Exercice 2.4 (Tarte Tatin) Profitant d’un week-end bien mérité Apollodore et Aristodème se décident presque à la dernière minute de faire une tarte tatin pour recevoir des amis qui doivent arriver 1 heure plus tard. Ils veulent l’accompagner d’une crème anglaise. Voici les diverses actions qu’ils doivent réaliser ainsi que leur durée. Pour la pâte brisée : – Préparer la pâte (5 minutes) – Laisser reposer la pâte (30 minutes) – Étaler la pâte (5 minutes) Pour la tarte Tatin : – Préparation du moule (5 minutes) : Prendre un moule à manquer... Verser 125g de sucre sur le fond. Parsemer sur le dessus 120g beurre coupé en petits morceaux. – Préparation des pommes (10 minutes) : Peler 8 belles pommes, enlever le coeur et les couper en quartiers. 2 Attention, cet exercice et le suivant ne concernent pas des problèmes d’ordonnancement, mais ils illlustrent l’usage des algorithmes du potentiel-tâche sur d’autres types de graphes pour retrouver un chemin le plus long Eric L ALLET, Jean-Luc R AFFY 25 – Mise en place des pommes (10 minutes) : Placer les quartiers de pommes dans le moule, sur le sucre et le beurre. Saupoudrer avec 125g de sucre – Caramélisation des pommes (5 minutes) : Placer le moule sur un feu vif, jusqu’à ce que le caramel commence à dorer. – Mise en place de la pâte (5 minutes) : Recouvrir les pommes de la pâte étalée. Rentrer le bord à l’intérieur du moule. Faire quelques trous pour laisser échapper la vapeur. – Cuisson (15 minutes) : Enfourner dans un four chaud, thermostat 9 pendant 15 minutes, le temps que la pâte soit bien dorée. Pour la crème anglaise : – Préparer la crème (15 minutes). – Laisser refroidir (15 minutes). – Mettre au réfrigérateur (30 minutes minimum). Apollodore se propose pour préparer la pâte, et s’occuper ensuite de la tarte Tatin, pendant qu’Aristodème s’occupera de préparer la crème anglaise puis étalera la pâte. Aristodème suggère qu’Apollodore commence immédiatement la préparation de la Tarte pendant que lui commencera la pâte brisé. Il préparera la crème anglaise durant le temps de repos de la pâte, et ensuite étalera la pâte. Lequel des deux scénarios conseillez-vous de mettre en œuvre ? Correction page 116 26 Eric L ALLET, Jean-Luc R AFFY Chapitre 3 Les Arbres 3.1 Introduction F IG . 3.1 – Quel est le réseau de coût minimum permettant de relier toutes les succursales ? Imaginons que l’on veuille construire un réseau privé pour faire communiquer N succursales d’une entreprise avec pour objectif d’obtenir le coût le plus bas. On connaît tous les raccordements possibles et leur coût (voir la figure 3.1). Comme le but est d’avoir le prix le plus bas, on ne va garder que les raccordements strictement nécessaires. On s’aperçoit déjà que l’on n’a pas besoin de cycles dans ce graphe. Par contre pour que toute succursale puisse joindre toutes les autres, le graphe devra permettre de trouver un chemin entre tous les sommets (on aura donc un graphe connexe). Ainsi la solution est de trouver un graphe connexe simple sans cycle qui offre le moindre coût de construction. Or un graphe connexe simple sans cycle est un arbre. Nous allons donc étudier les arbres, leurs propriétés et deux algorithmes qui permettront de trouver la solution à ce genre de problème. 3.2 Définitions et propriétés Définition 3.1 (arbre) Un arbre est un graphe connexe simple sans cycle. Par exemple une rivière et ses affluents forme un arbre. On utilise aussi beaucoup les arbres pour classifier. Par contre, avec notre définition, en théorie de graphe, un «arbre généalogique» ne reste un arbre que Eric L ALLET, Jean-Luc R AFFY 27 si on ne remonte pas trop loin (on finira souvent par trouver deux ancêtres communs à deux conjoints, et donc on formera un cycle). Définition 3.2 (sous graphe) On dit qu’un graphe G′ = [X ′ , U ′ ] est un sous-graphe de G = [X, U ] si X ′ ⊆ X et U ′ ⊆ U . Définition 3.3 (sous graphe couvrant) Un sous graphe G′ = [X ′ , U ′ ] est dit couvrant si X ′ = X et G′ est connexe. Définition 3.4 (poids d’un graphe) Soit un graphe G = [X, U ] où chaque arête ui est valuée avec un poids pi . Le poids du graphe est la somme des poids des arêtes du graphe. Les arbres sont des graphes qui ont de nombreuses propriétés. En voici quelques-unes : 1. un arbre est toujours un graphe simple. 2. un arbre à N sommets possède N-1 arêtes. 3. Un sous-graphe de G couvrant et sans cycle est un arbre couvrant de G. On appelle ces arbres, des «arbres de recouvrement» du graphe G. 4. Si un graphe a toutes ses arêtes de poids positif ou nul, il admet un sous-graphe couvrant de poids minimal, et ce sous-graphe couvrant de poids minimal est un arbre. Pour résoudre le problème de l’introduction, il faut donc trouver le graphe de recouvrement de poids minimum. Ce graphe est un arbre. Comme le nombre d’arbres de recouvrement croît de façon exponentielle avec le nombre de sommets, il n’est pas du tout interessant de tous les calculer pour connaître celui qui a le poids minimum. Pour éviter cela, il existe des algorithmes qui permettent de construire d’entrée un arbre de poids minimal et dont le nombre d’étapes est une fonction linéaire du nombre d’arêtes. Nous allons voir ces algorithmes. 3.3 L’algorithme de Kruskal Soit un graphe G = [X, U ], avec |X| = N et |U | = M . On va construite un arbre recouvrement de G de poids minimum : τ = [X, T ]. Algorithme 3.1 (Kruskal) 1. Classer les arêtes par ordre croissant de poids. U = {u1 , u2 , u3 , ...., um }. 2. Poser T = ∅ et i = 1. 3. Si T ∪ ui est sans cycle ajoute ui à T : T ← T ∪ ui . Sinon aller à l’étape 4. 4. Incrémenter i de 1. Si |T | = N − 1 Stop, sinon retourner à l’étape 3. On peut remarquer que durant les phases intermédiaires de l’algorithme de Kruskal, le sous graphe formé par T n’est pas forcement connexe. On a un ensemble d’arbres disjoints. Un graphe de cette forme s’appelle une «forêt». Faisons tourner cet algorithme sur l’exemple de l’introduction : N = 6 et M = 10. Après classement des arêtes par ordre croissant de poids on obtient U = {u1 , . . . , u10 } de la figure 3.2. On pose T = ∅ et i = 1. Donc on commence par ajouter u1 dans notre arbre : T = {u1 } et i = 2. Ensuite on ajoute u2 :T = {u1 , u2 } et i = 3. On peut ajouter u3 toujours sans créer de cycle, donc T = {u1 , u2 , u3 } et i = 4. À l’étape suivante u4 peut aussi être ajouter, donc T = {u1 , u2 , u3 , u4 } et i = 5. A ce stade on obtient la figure 3.3. 28 Eric L ALLET, Jean-Luc R AFFY S2 8 1 U2 S3 6 U10 S1 U9 6 U8 2 U6 5 S4 U7 2 2 U3 U5 2 U4 S5 1 S6 U1 F IG . 3.2 – Kruskal : tri des arêtes (les ui numérotées dans par ordre croissant de poids) S2 8 S1 S2 1 U2 S3 6 U10 8 U9 6 U8 2 U6 2 U3 U5 U9 6 U8 2 U6 U7 2 5 S4 U7 2 2 t=(X,T) U4 S3 6 U10 S1 5 S4 1 U2 2 U3 U5 2 t=(X,T) U4 S5 1 S6 S5 U1 1 S6 U1 F IG . 3.3 – Kruskal : étape avec 4 arêtes et étape finale On tente alors d’ajouter u5 . Mais (u1 , u4 , u5 ) forment un cycle. u5 est donc rejeté, et i = 6. On tente alors d’ajouter u6 . Mais (u1 , u4 , u6 , u2 ) forment un cycle. u6 est donc rejeté, et i = 7 Par contre u7 peut aussi être ajoutée. On obtient T = {u1 , u2 , u3 , u4 , u7 }, et i = 8. Comme |T | = 5 = N − 1, l’algorithme est terminé. On a τ = [X, T ] un arbre de recouvrement minimal (voir la figure 3.3). On peut maintenant évaluer le coût du réseau à mettre en place : c’est le poids de notre arbre de recouvrement minimal. Donc si pi est le poids de l’arête ui : coût = p1 + p2 + p3 + p4 + p7 = 1 + 1 + 2 + 2 + 5 = 11. Notez qu’un arbre de recouvrement minimal n’est pas obligatoirement unique. D’autres peuvent peser le même poids. On va d’ailleurs en trouver un autre pour notre problème lorsqu’on va utiliser l’algorithme de Prim dans la section suivante. 3.4 L’algorithme de Prim 3.4.1 Description Soit un graphe G = [X, U ], avec |X| = N et |U | = M . On va construite un arbre recouvrement minimal de G : τ = [X, T ]. Voici le principe de l’algorithme de Prim : Algorithme 3.2 (Prim) 1. Pour tous les sommets xi de X, construire tous les cocycles élémentaires1 ωi = ω({xi }). 1 Ces cocycles élémentaires sont utilisés à l’étape 3 de l’algorithme pour calculer de façon itérative le cocycle de l’ensemble des sommets déjà traités. Si le graphe est simple et les cocycles simples à trouver, cette étape n’est pas utile. Eric L ALLET, Jean-Luc R AFFY 29 2. Prendre un sommet quelconque du graphe (par exemple x1 ) et poser : A = {x1 } q = ωx1 T =∅ 3. Choisir dans q, une arête u de poids minimale. Soit xj l’extrémité de u dans X − S. On pose : T ← T ∪ {u} A ← A ∪ {xj } q ← q∆ωj (Différence symétrique :Y ∆Z = (Y ∪ Z − (Y ∩ Z) (remarque : cet algorithme donne toujours q = ω(A)). 4. Si |T | = N − 1, fin, sinon retourner en 3. 3.4.2 Exemple sur un graphe dessiné Faisons tourner cet algorithme sur notre exemple. – Pour démarrer, on va choisir d’initialiser A avec S1 (voir figure 3.4)2 A = {S1 } q = ω(A) = ωS1 = {u1 , u2 , u3 , u4 } T =∅ S2 S2 1 u5 8 A 6 u1 S1 8 u6 6 u7 2 2 2 u1 u6 6 u7 S1 2 2 2 u8 u4 5 S4 u2 u10 2 u3 S3 6 A 5 S4 u2 1 u5 S3 u10 2 u8 u3 u4 S5 1 u9 S6 S5 1 u9 S6 F IG . 3.4 – Prim : Initialisation de l’algorithme et première étape (u2 ajoutée) – On doit choisir une arête de moindre poids dans q. L’arête u1 (de poids 8) est donc exclue. Les 3 autres (de poids 2) peuvent convenir. On va prendre u2 . Elle est reliée à S4 qui rentre donc dans l’ensemble A (voir figure 3.4). T = {u2 } A = {S1 , S4 } q = ω(A) = {u1 , u3 , u4 , u6 , u7 , u8 } – Les trois arêtes de poids 2 de q sont éligibles : u3 , u4 et u8 . On va choisir u3 . Son extrémité S6 entre donc dans A (voir la figure 3.5). T = {u2 , u3 } A = {S1 , S4 , S6 } q = ω(A) = {u1 , u4 , u6 , u7 , u9 , u10 } 2 Notez que pour cette algorithme les arêtes n’ont pas besoin d’être triées. Donc leur numérotation a juste été faite «au vol» lors du dessin du graphe 30 Eric L ALLET, Jean-Luc R AFFY S2 S2 1 8 S3 6 u1 8 u6 S1 2 2 2 2 u10 2 2 u8 u3 5 S4 u2 5 S4 2 u6 6 u7 S1 u2 S3 6 u1 A 6 u7 A 1 u5 u5 u10 2 u8 u3 u4 u4 1 S5 S6 1 S5 u9 S6 u9 F IG . 3.5 – Prim : Deuxième étape (u3 ajoutée) et troisième étape (u9 ajoutée) – A cette étape, seule l’arête de poids 1, u9 peut être choisie. On ajoute son extrémité S5 dans l’ensemble A (voir la figure 3.5). T = {u2 , u3 , u9 } A = {S1 , S4 , S5 , S6 } q = ω(A) = {u1 , u6 , u7 , u10 } – L’arête de plus faible poids de q est u10. Son extrémité S3 entre dans A (voir la figure 3.6). T = {u2 , u3 , u9 , u10} A = {S1 , S3 , S4 , S5 , S6 } q = ω(A) = {u1 , u6 , u5 } S2 S2 1 u5 8 6 u1 8 u6 6 u7 A S1 2 2 2 u1 u6 6 u7 S1 2 2 2 u8 u4 5 S4 u2 u10 2 u3 S3 6 A 5 S4 u2 1 u5 S3 u10 2 u8 u3 u4 S5 1 S6 S5 u9 1 S6 u9 F IG . 3.6 – Prim : Quatrième étape (u10 ajoutée) et dernière étape (arbre trouvé) – L’arête u5 de poids 1 complète notre arbre. Le nombre d’arêtes vaut N − 1 et A enrichi de S2 l’extrémité de u5 couvre maintenant tout l’ensemble. L’algorithme se termine donc ici (voir figure 3.6). T = {u2 , u3 , u5 , u9 , u10} A = {S1 , S2 , S3 , S4 , S5 , S6 } q = ω(A) = ∅ L’arbre trouvé ici n’est pas le même que dans la section précédente, mais il pèse bien le même poids (11). Aussi bien pour Kruskal que pour Prim, il y a des choix à faire (par exemple, lorsqu’il y a plusieurs arêtes avec le même minimum), et il y a donc plusieurs «bonnes» solutions. Eric L ALLET, Jean-Luc R AFFY 31 3.4.3 Exemple sur la matrice du graphe Pour ce genre de problème, le graphe dessiné est parfois illisible : le graphe n’est pas planaire et plein d’arêtes se croisent dans tous les sens. Essayer de trouver sur le dessin le cocycle des sommets déjà traités devient vite impossible. On peut bien sûr dérouler l’algorithme à la main, mais il est aussi possible de travailler sur la matrice d’adjacence qui représente le graphe. Dans ce cas le booléen qui indique s’il existe une arête entre deux sommets est remplacé par le poids de l’arête. La matrice d’adjacence du graphe des succursales donne : S1 S1 S2 S3 S4 S5 S6 S2 S3 1 6 6 S4 S5 2 1 S6 8 2 2 2 5 Les cocycles élémentaires d’un sommet sur une telle matrice sont très simples à trouver : il s’agit de la colonne et de la ligne du sommet. Donc la matrice qui donne les arêtes du cocycle élémentaire de S4 est : S1 S2 S3 S4 S5 S6 S1 S2 S3 2 6 6 S4 S5 S6 2 Imaginons maintenant qu’on veuille ajouter S6 à notre ensemble (pour former l’ensemble de sommets { S4 , S6 }). Comment trouver le nouveau cocycle ? On a vu que le cocycle de l’union de deux ensembles de sommets était l’union des deux cocycles moins l’intersection. Pour faire l’union, il faut ajouter le cocycle élémentaire de S6 (sa ligne et sa colonne), et pour retirer l’intersection il faut rayer toutes les arêtes qui étaient déjà présentes. On obtient : S1 S2 S3 S4 S5 S6 S1 S2 S3 2 6 6 2 5 S4 S5 2A 1 S6 Si on ajoute S1 à l’ensemble, on procède de la même manière pour trouver le cocycle du nouvel ensemble ({ S1 , S4 , S6 }). On ajoute la ligne et la colonne de S1 mais en rayant les éléments déjà présents. Cela donne : S1 S1 S2 S3 S4 S5 S6 32 S2 S3 6 6 S4 S5 2A 1 8 2 A 2 2 A 5 Eric L ALLET, Jean-Luc R AFFY S6 Utilisons ce principe sur l’algorithme de Prim. Imaginons un cas d’étude : Six fleuves majeurs coulent dans la province de Primlande : l’Armoise, la Bellis, le Comaret, la Douve, l’Erine et le Fragon. Le gouverneur de Primlande voudrait créer un réseau de canaux pour permettre de naviguer d’un fleuve à l’autre. Il veut aussi que ça lui coûte le moins cher possible. Il a demandé une étude pour évaluer le coût de la jonction des fleuves pris deux à deux. Voici le résultat : Armoise Bellis Comaret Douve Erine Fragon Armoise Bellis Comaret Douve Erine 10 6 4 9 3 8 2 4 3 4 7 3 2 1 5 Fragon Il faut maintenant trouver quels canaux creuser pour que tous les fleuves ne forment plus qu’un seul réseau qui coûte le moins cher possible. Prim est parfaitement adapté. On va donc le dérouler, mais sur la matrice. Pour démarrer, on va choisir d’initialiser A avec Armoise. On sélectionne donc l’Armoise (en soulignant) dans la matrice et on ajoute son cocycle. Sur une matrice d’adjacences, le cocycle d’un sommet correspond à sa ligne et sa colonne : Armoise Armoise Bellis Comaret Douve Erine Fragon Bellis Comaret Douve Erine Fragon 10 6 4 9 3 La plus petite arête présente dans la matrice est celle qui va de l’Armoise au F ragon. On ajoute cette arête à notre arbre (en ajoutant un «oui» dans la case de l’arête), On ajoute le F ragon dans l’ensemble A (on le souligne dans la matrice). On ajoute aussi son cocycle (donc on fait l’union avec le cocycle du graphe déjà dans la matrice), mais en rayant les éléments s’ils sont déjà présents (on supprime l’intersection avec le cocycle déjà présent). On obtient le cocycle du nouvel ensemble : Armoise Bellis Comaret Douve Erine Fragon Armoise Bellis Comaret Douve Erine 10 6 4 9 3 oui A 3 3 1 5 Fragon Dans le nouveau cocycle, c’est l’arête Douve-F ragon qui doit être sélectionnée. On ajoute cette arête à notre arbre. On ajoute la Douve dans l’ensemble A. On ajoute son cocycle mais en rayant les arêtes qui sont déjà présentes dans la matrice : Armoise Bellis Comaret Douve Erine Fragon Armoise Bellis Comaret 10 6 4 A 9 3 oui A 2 4 3 3 Douve Erine 2 A1 oui 5 Eric L ALLET, Jean-Luc R AFFY Fragon 33 Dans le nouveau cocycle, deux arêtes peuvent être choisies : soit Erine-Douve, soit Douve-Bellis. On va choisir d’ajouter l’arête Douve-Bellis. On ajoute aussi la Bellis dans l’ensemble A. On ajoute son cocycle mais en rayant les arêtes qui sont déjà présentes dans la matrice : Armoise Bellis Comaret Douve Erine Fragon Armoise Bellis Z 1 0 Z 6 4 A 9 3 oui A 8 2 A oui 4 3 A Comaret Douve Erine 2 A1 oui 5 Fragon 4 3 Cette fois, c’est au tour de l’arête Erine-Douve d’être choisie. On ajoute aussi l’Erine dans l’ensemble A. On ajoute son cocycle mais en rayant les arêtes qui sont déjà présentes dans la matrice : Armoise Bellis Comaret Douve Erine Fragon Armoise Bellis Comaret Douve Erine Z 10 Z 6 4 A 9 A 3 A oui 8 2 oui A 4 A 3 A 4 7 3 A2 oui 1A oui 5A Fragon On doit maintenant prendre l’arête F ragon-Comaret. On obtient les 5 arêtes utiles à notre arbre, on peut s’arrêter là : Armoise Bellis Comaret Douve Erine Fragon Armoise Bellis Comaret Douve Erine Z 10 Z 6 A 4 A 9 A 3 oui A 8 A 2 oui A 4 A 3 A A4 A7 A3 oui A2 oui A1 oui 5A Fragon L’arbre de recouvrement minimal est donc composé de (Douve-Bellis, Erine-Douve, F ragon-Armoise, F ragon-Comaret, F ragon-Douve). Il pèse donc : 2 + 2 + 3 + 3 + 1 = 11. 3.5 Exercices Exercice 3.1 (Promesse électorale) Le réseau routier d’une petite commune rurale a été laissé à l’abandon si longtemps qu’une bonne partie des routes sont devenues des chemins. Lors des dernières élections le maire a promis qu’il allait remettre en état suffisamment de routes pour que toutes les habitations de la commune puissent rejoindre le centre-bourg par une route digne de ce nom. Il lui faut maintenant tenir sa promesse, mais bien sûr, il voudrait engager un minimum de dépenses pour cela. La carte de la commune et la liste des habitations à relier au centre-bourg sont sur la figure 3.7. Le coût de la remise en état d’une route est directement proportionnel à sa longueur. Voici la longueur des différents chemins : 34 Eric L ALLET, Jean-Luc R AFFY ch1=500m ch7=1300m ch13=1300 ch2=1200m ch8=1500m ch14=1500 ch3=1400 ch9=1400 ch15=1700 ch4=800m ch10=500 ch16=1300 ch5=1400m ch11=1400m ch6=1600 ch12=1600m F IG . 3.7 – Carte de la commune Correction page 118 Eric L ALLET, Jean-Luc R AFFY 35 36 Eric L ALLET, Jean-Luc R AFFY Chapitre 4 Recherche du plus court chemin 4.1 Introduction Les problèmes de cheminement dans les graphes sont parmi les plus anciens de la théorie des graphes. Ce type de recherche se rencontre soit directement, soit sous la forme d’un problème dans de nombreuses applications. Quelques exemples : – les problèmes de tournées – les problèmes de gestion de stock, d’investissements – les problèmes d’optimisation de réseaux. 4.2 Définitions Définition 4.1 (graphe valué) Étant donné un graphe G = (X, U ), on associe à chaque arc u ∈ U un nombre l(u) ∈ R. On dit que G est valué par la longueur l(u). Définition 4.2 (plus court chemin) Le problème du plus court chemin (PCCH) entre 2 sommets i et j sera de trouver un chemin pi,j dont la longueur totale l(pi,j ) est minimale. Avec l(pi,j ) = X l(u) u∈pi,j L’interprétation de l(u) peut être un coût de transport, une dépense de construction ou un temps nécessaire pour parcourir u. Voici deux exemples pour illustrer des cas où on est confronté à ce type de problème : – Considérons une carte routière et cherchons la route la plus courte pour se rendre d’une localité à une autre. Le graphe est obtenu en prenant comme sommets les localités et en remplaçant chaque route entre deux localités par 2 arcs d’orientations opposées, et ayant pour longueur la longueur de la route. – Considérons le projet de construction d’une autoroute entre les villes A et K. Sur le graphe les arcs représentent les différents tronçons possibles de l’autoroute ; chaque arc est valué par le coût total de réalisation du tronçon correspondant. 4.3 Algorithme de Ford-Moore 4.3.1 Description Voici l’algorithme de Ford avec l’amélioration de Moore : Soit un graphe G = [X, U ] connexe valué. |X| = N . La longueur de l’arc allant de xi à xj est l(ij). Eric L ALLET, Jean-Luc R AFFY 37 On va trouver les plus courts chemins, λ(xi ), allant du sommet x1 vers chacun des sommets xi du graphe. Cet algorithme est itératif : à chaque étape on va réévaluer la longueur du chemin de x1 à xi . La valeur de cette longueur à l’étape m sera notée λ(xi , m), Algorithme 4.1 (Algorithme de Ford-Moore) 1. Poser λ(x1 , 0) = 0 et S0 = Γ(x1 ) et S1 = ∅ λ(xi , 0) = ∞ pour xi ∈ X et xi 6= x1 m=0 2. Pour tout xi ∈ Sm faire : λ(xi , m + 1) = min(λ(xi , m), λ(xk , m) + l(ki) ) k ∈ Γ− (xi ) si λ(xi , m + 1) < λ(xi , m) alors Sm+1 ← Sm+1 ∪ Γ(xi ) 3. Si λ(xi , m + 1) = λ(xi , m) pour tout xi ∈ X Fin Sinon aller en 4. 4. Sm+2 = ∅ et m ← m + 1. Retouner en 2. 4.3.2 Exemple sur le graphe dessiné Trouvons le plus court chemin allant du sommet A au sommet H du graphe de la figure 4.1. Notez que sur ce graphe certains arcs ont des chemins avec des longueurs négatives. Tant qu’il n’y a pas de circuits de longueur négative l’algorithme va fonctionner. 4 E B 2 −2 5 3 A 4 3 C 1 0 F 5 −1 G 7 H 8 D F IG . 4.1 – Quel est le plus court chemin allant de A à H ? On commence en initialisant λ(A, 0) = 0 et tous les autres λ(x, 0) = ∞. Pour alléger le graphe on va considérer que les sommets sans λ sont marqués avec ∞. La première itération de l’algorithme (m = 1) va faire évoluer les succésseurs de A : B, C et D (voir figure 4.2). À la seconde itération la propagation atteint tous les sommets. Mais la valeur du sommet C évolue à nouveau. En effet ses prédécesseurs B et D ayant changés on doit réévaluer la valeur de son chemin. Et celui arrivant par le sommet B est plus court. C’est donc lui qui devient le chemin le plus court pour le sommet C (voir la figure 4.3). À la troisième itération, les sommets A, B, C et D sont stabilisés. mais il faut réévaluer tous les autres. Pour le sommet E la valeur qui arrive pas le sommet F est la même que celle déjà arrivée par le sommet B. Donc pour l’instant on a deux estimations équivalentes du chemin le plus court pour le sommet E. Mais cela va évoluer puisque à cette itération la valeur du sommet F change à nouveau. Les valeurs des sommets G et H changent aussi (voir figure 4.4). À la quatrième itération le sommet G est lui aussi stabilisé. Le sommet F va rester inchangé, car la valeur qui arrive par le G est plus grande. Celle du sommet E diminue, et donc le chemin le plus court pour ce sommet arrive maintenant par le sommet F . Pour le sommet H, une seconde estimation du chemin le 38 Eric L ALLET, Jean-Luc R AFFY F IG . 4.2 – Première itération de l’algorithme de Ford-Moore F IG . 4.3 – Seconde itération de l’algorithme de Ford-Moore F IG . 4.4 – Troisième itération de l’algorithme de Ford-Moore plus court apparait : celui qui arrive par le sommet G a (pour l’instant) la même valeur que celui qui arrive par le sommet E (voir figure 4.5). Enfin, à la cinquième et dernière itération, seul le sommet H évolue. La propagation venant du sommet E est plus basse. Comme H n’a pas de successeur, ce changement n’aura plus de répercution sur le graphe. L’algorithme s’arète là. Le chemin le plus court allant de A à H passe donc par B, C, F et E et la valeur de sa longueur est 8 (voir figure 4.6). Eric L ALLET, Jean-Luc R AFFY 39 F IG . 4.5 – Quatrième itération de l’algorithme de Ford-Moore F IG . 4.6 – Cinquième et dernière itération de l’algorithme de Ford-Moore 4.3.3 Exemple sur un tableau Il est possible de dérouler l’exemple sur un tableau plutôt que sur le dessin du graphe. On crée un tableau avec une colonne pour chaque sommet, une pour la liste des sommets qui ont changé, et une dernière pour leurs successeurs. Il y a une nouvelle ligne pour chaque itération. Le tableau commence donc avec λ(A, 0) = 0 et les autres ∞. m λ(A) λ(B) λ(C) λ(D) λ(E) λ(F ) λ(G) λ(H) 0 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ Sommets changés A Γ+ B,C,D À l’étape suivante on traite tous les sommets qui apparaissent dans la colonne Γ+ de la ligne précédente. Ici il faut donc faire évoluer B, C et D en fonction de leur prédécesseur A. En plus de la valeur de la longueur du chemin, on note aussi sur la case le prédécesseur pour pouvoir retrouver à la fin les sommets du chemin le plus court. 40 m λ(A) λ(B) λ(C) λ(D) λ(E) λ(F ) λ(G) λ(H) 0 1 0 H ∞ H 5/A H ∞ H 4/A H ∞ H 3/A ∞ ∞ ∞ ∞ Eric L ALLET, Jean-Luc R AFFY Sommets changés A B C D Γ+ B,C,D C,E F,G H,C Pour l’itération 2, les sommets C, E, F, G et H doivent être réévaluer. m λ(A) λ(B) λ(C) λ(D) λ(E) λ(F ) λ(G) λ(H) 0 1 0 H ∞ H 5/A H ∞ H H 4/A H H ∞ H 3/A H ∞ H H ∞ H H ∞ H H ∞ H 9/B 7/C 3/C 11/D 2 3/B Sommets changés A B C D C E F G H Γ+ B,C,D C,E F,G H,C F,G H E F, H Les sommets E, F, G et H présents dans la colonne Γ+ doivent être révalués. m λ(A) λ(B) λ(C) λ(D) λ(E) λ(F ) λ(G) λ(H) 0 1 0 H ∞ H 5/A H ∞ H H 4/A H H ∞ H 3/A H ∞ H H ∞ H H ∞ H H ∞ H 9/B H 7/C H H 3/C H X X X 11/D 6/C H 8/G H 2/C 9/E X X X 10/G 2 3/B 3 9/F Sommets changés A B C D C E F G H F G H Γ+ B,C,D C,E F,G H,C F,G H E F,H E F,H À cette itération, il faut réévaluer E, F et H. m λ(A) λ(B) λ(C) λ(D) λ(E) λ(F ) λ(G) λ(H) 0 1 0 H ∞ H 5/A H ∞ H H 4/A H H ∞ H 3/A H ∞ H H ∞ H H ∞ H H ∞ H H 9/B H H 7/C H H 3/C H X X X 11/D 6/C H 8/G H 2/C 9/E X X X 10/G 2 3/B 3 H 9/F H 4 8/F H 7/G H 9/G Eric L ALLET, Jean-Luc R AFFY Sommets changés A B C D C E F G H F G H E Γ+ B,C,D C,E F,G H,C F,G H E F,H E F,H H 41 Seul H doit être réévaluer. m λ(A) λ(B) λ(C) λ(D) λ(E) λ(F ) λ(G) λ(H) 0 1 0 H ∞ H 5/A H ∞ H H 4/A H H ∞ H 3/A H ∞ H H ∞ H H ∞ H H ∞ H H 9/B H H 7/C H H 3/C H X X X 11/D 6/C H 8/G H 2/C H 9/E H X X X 10/G 2 3/B H 9/F H 3 4 5 8/F H 7/G H H 9/G H 8/E Sommets changés A B C D C E F G H F G H E H Γ+ B,C,D C,E F,G H,C F,G H E F,H E F,H H La colonne Γ+ est vide. L’algorithme est donc fini. La longueur du plus court chemin est donc 8. Pour connaître ce chemin le plus court, il suffit de partir de la colonne de H et de remonter la route : H → 8/E → 8/F → 6/C → 3/B → 5/A. 4.4 Exercices Exercice 4.1 (Voyage Lyon-Agen) Un voyageur doit aller en voiture de Lyon à Agen. En regardant les cartes il a dégagé diverses options pour faire sa route (voir figure 4.7). – Il peut couper le massif-central par les nationales en passant le Le Puy-en-Velay, Brioude et Cahors. – Il peut passer par les autoroutes du sud de la France, en passant par Orange, Montpellier, Narbonne, Toulouse et Montauban. – Il peut passer par les autoroutes du centre de la France, en rejoingnant l’A72 à Feurs, et ensuite en passant par Clermont-Ferrand, Brive, Cahors, Montauband. – Il peut enfin faire un mélange de tout cela en profitant éventuellement de l’A75 qui coupe toutes ces routes. Sachant qu’il réalise une moyenne de 70km/h sur les nationales et départementales et de 110km/h sur les autoroutes quel chemin doit-il emprunter pour faire le trajet le plus rapidement possible ? Et quel est le temps de ce trajet ? Correction page 121. Exercice 4.2 (Le banquet) Refaites l’exercice 2.2 (page 25) mais cette fois en le modélisant avec une recherche de plus court chemin. Correction page 123. Exercice 4.3 (Le banquet (suite)) Refaites l’exercice 2.3 (page 25) mais cette fois en le modélisant avec une recherche de plus court chemin. Correction page 125. 42 Eric L ALLET, Jean-Luc R AFFY F IG . 4.7 – Les routes entre Lyon et Agen Eric L ALLET, Jean-Luc R AFFY 43 44 Eric L ALLET, Jean-Luc R AFFY Chapitre 5 Flot Maximal 5.1 Introduction Dans ce chapitre nous allons voir un algorithme qui permet de trouver le flot maximal entre deux points d’un graphe. De nombreux problèmes de natures très différentes se modélisent avec ce genre de graphe : le calcul de la capacité d’un réseau routier ou informatique, le calcul de flux migratoires ou financiers, le calcul des possibilités logistiques d’une armée. . . En ajoutant des coûts de transit sur les arcs, on verra aussi comment trouver le flot maximal qui ne dépasse pas un coût donné, ou bien comment trouver le coût minimal pour faire transiter un flot donné. 5.2 Description du problème Le problème du flot maximal consiste à faire passer un flot optimal à traver un «réseau de transport». Un réseau de transport est un graphe G = [X, U ] orienté sans boucle, dont chaque arc est valué par un nombre représentant sa capacité de transport. On distingue deux sommets particuliers dans ce graphe : S, la source, et P , le puits. Le problème sera de trouver la capacité du transit maximal entre la source et le puits. La capacité d’un arc u sera notée c(u), et le flot attribué à cet arc sera noté ϕ(u). Le réseau de transport ne doit pas générer l’apparition d’un flot venu de nulle part. Donc pour tous les sommets il faut verifier que la somme des flots sortants est égale à la somme des flots entrants. ∀x ∈ X on a X ϕ(u) = u/I(u)=x X ϕ(u′ ) u′ /T (u′ )=x Pour que cette propriété soit vraie y compris pour le puits et la source, il faut placer un arc allant du puits vers la source. Même si par la suite cet arc ne sera généralement pas représenté sur les graphes de ce cours, il faudra imaginer sa présence, et surtout vérifier la propriété sous-jacente : le flot arrivant au puits vaut celui sortant de la source. 5.3 Exemple de problème Pour illustrer ce chapitre, imaginons un exemple : Un producteur de betteraves de Picardie décide de faire circuler sa production d’Épénancourt jusqu’à Maizy. Il veut profiter pour cela du réseau de voies navigables. Après s’être renseigné, il sait qu’il a la capacité de faire circuler deux péniches par jour entre Épénancourt et Maizy sur le canal qui passe par Noyon et Quierzy. Mais en profitant du canal qui passe par Chauny, il peut aussi faire circuler deux péniches supplémentaires entre Épénancourt et Quierzy. De plus à partir de Noyon, il a possibilité de faire passer vers Maizy une péniche de plus en utilisant le canal qui passe par Venizel (voir figure 5.1). On va déterminer combien de péniches ce producteur peut faire passer chaque jour. Eric L ALLET, Jean-Luc R AFFY 45 2 2 Noyon 2 Épénancourt 2 Maizy Quierzy 1 F IG . 5.1 – Capacités de transport entre Épénancourt et Maizy 5.4 L’algorithme de Ford-Fulkerson 5.4.1 Introduction L’algorithme de Ford-Fulkerson part d’un graphe avec un premier flot établi. Ce premier flot est quelconque, il peut même être nul. Mais pour diminuer le nombre d’itérations mieux vaut essayer de faire passer «au jugé» le meilleur flot possible. Ensuite on va déterminer dans quelle mesure ce flot peut être amélioré. Pour cela on va répéter de façon cyclique trois phases : 1. Le marquage du graphe : on va faire utiliser un premier algorithme pour marquer le graphe. Ce marquage permettra de trouver un chemin où le flot peut être augmenté, si un tel chemin existe. 2. Le calcul de l’amélioration : si on a réussi à marquer un chemin, on détermine ensuite le gain que l’on peut obtenir sur le flot grâce à celui-ci. 3. L’augmentation du flot : enfin, avant de reboucler sur le marquage, on augmente le flot du graphe du gain calculé à la phase 2. 5.4.2 Le marquage du graphe Cette première phase va permettre soit de trouver un chemin non saturé allant de source S au puits P , soit de trouver une chaîne permettant de dérouter une partie du flot pour désaturer un arc au profit d’un flot parallèle. Pour cela on va construire «une chaîne améliorante» allant de S à P . Algorithme 5.1 (Algorithme de Ford-Fulkerson : phase du marquage) 1. Marquer la source S d’une *. 2. Pour tout sommet x marqué : – s’il existe des arcs (x, y), avec y non marqué tel que ϕ(x, y) < c(x, y) marquer y par +x. – s’il existe des arc (y, x), avec y non marqué tel que ϕ(y, x) > 0 marquer y par −x. 3. Tant que P n’est pas marqué et qu’il est possible de marquer d’autres sommets, retourner en 2. Sinon FIN. A fin du marquage, si le puits P n’est pas marqué, le flot est déjà à son maximum. Sinon, il peut être amélioré. On calcule alors la valeur du gain grâce à l’algorithme de la seconde phase. 5.4.3 Le calcul du gain La marquage a créé une «chaîne améliorante» C allant de la source au puits composée d’arcs parcourus dans le bon sens (orientation directe), d’arcs parcourus à contre sens (orientation inverse) On va appelé C+, l’ensemble des arcs d’orientation directe de la chaîne améliorante, et C−, l’ensemble des arcs d’orientation inverse. On a donc C = C+ ∪ C−. Les arcs de C+ sont des arcs non-saturés sur lesquels il va être possible de faire passer un flot supplémentaire. Les arcs de C− sont des arcs sur lesquels il existe déjà un flot que l’on va pouvoir rediriger pour augmenter le flot des arcs de C+. Il faut calculer ce flot supplémentaire. Soit δ+ = min(c(u) − ϕ(u)) ∀u ∈ C+. C’est le flot maximal que l’on peut rediriger vers les arcs de C+ avant de saturer l’un d’entre eux. 46 Eric L ALLET, Jean-Luc R AFFY Soit δ− = min(ϕ(u)) ∀u ∈ C−. C’est le flot maximal que peut puiser dans les arcs de C− avant d’épuiser l’un d’entre eux. Le gain que l’on peut gagner sur le flot grâce à la chaîne améliorante C est donc δ = min(δ+, δ−). L’algorithme pour calculer ce gain part du puits, et remonte la chaîne jusqu’à la source : Algorithme 5.2 (Algorithme de Ford-Fulkerson : Calcul du gain) 1. Poser g ← ∞ et x ← P 2. – si x est marqué +y alors g ← min(g, c(y, x) − ϕ(y, x)). – si x est marqué −y alors g ← min(g, ϕ(x, y)) x ← y. 3. Si x = S alors FIN Sinon aller en 2. Une fois ce gain évalué, il faut le reporter sur le flot du graphe. 5.4.4 L’augmentation du flot Maintenant que l’on connaît la valeur du gain, il suffit de reparcourir la chaîne améliorante comme on vient de le faire, mais cette fois ci, en ajoutant le flot aux arc de C+, et en le prélevant sur les arcs de C−. Algorithme 5.3 (Algorithme de Ford-Fulkerson : Augmentation du flot) 1. Poser x ← P 2. – si x est marqué +y alors augmenter ϕ(y, x)) de g. – si x est marqué −y alors diminuer ϕ(x, y)) de g. x ← y. 3. Si x = S alors FIN Sinon aller en 2. 5.5 Exemple de flot max Reprenons l’exemple de la figure 5.1. Pour accélérer le calcul de la solution, on va déjà considérer qu’un flot de deux péniches emprunte le canal direct Épénancourt, Noyon, Quierzy, Maizy. Si on garde ces deux péniches ainsi, il n’est pas possible d’en faire passer par le canal Épénancourt-Quierzy puisqu’au delà de Quierzy le canal est saturé. Et il n’est pas possible de profiter du canal Noyon-Maizy, puisque la section qui mène à Noyon est saturée (Voir Figure 5.2). F IG . 5.2 – Ford-Fulkerson : Établissement d’un flot au jugé On va donc utiliser l’algorithme de Ford-Fulkerson pour voir s’il est possible de faire mieux que ces deux péniches. On débute par la phase de marquage. – La source Épénancourt est marquée d’une *. – Seul Épénancourt est marqué. L’arc Épénancourt-Quierzy n’est pas saturé, donc on marque Quierzy avec «+Épénancourt». Aucun arc n’arrive sur Épénancourt, donc aucun sommet ne peut être marqué de «-Épénancourt». Eric L ALLET, Jean-Luc R AFFY 47 – Quierzy est marqué. Tous les arcs partant de Quierzy sont saturés. Donc aucun sommet ne peut être marqué «+Quierzy». Par contre l’arc qui arrive de Noyon a un flot non nul, et Noyon n’est pas encore marqué, donc on marque Noyon avec «-Quierzy». – Noyon est marqué. Son seul voisin non marqué est Maizy. L’arc qui va de Noyon à Maizy n’est pas saturé. On peut donc marquer Maizy avec «+Noyon». – Le puits Maizy est marqué, on arrête le marquage (voir Figure 5.3). 2/2 zy Quierzy −Q +N ui oy er Épénancourt Maizy 2/2 on Noyon 2/2 +É * pé na nc ou rt 0/2 0/1 F IG . 5.3 – Ford-Fulkerson : Premier marquage On peut maintenant calculer le gain qu’il est possible d’ajouter au flot grâce à la chaîne améliorante que l’on vient de marquer. Pour cela on démarre du puits (Maizy) et on remonte le marquage de la chaîne jusqu’à la source (Épénancourt). – g ← ∞ et x ← M aizy – Maizy est marqué par «+Noyon». La capacité de l’arc Noyon-Maizy est de 1 et son flot de 0. Donc g = min(∞, 1 − 0) = 1. x ← Noyon. – Noyon est marqué de «-Quierzy». Le flot de l’arc Noyon-Quierzy est de 2. Donc g = min(1, 2) = 1. x ← Quierzy. – Quierzy est marqué «+Épénancourt». La capacité de l’arc Épénancourt-Quierzy est de 2 et son flot de 0. Donc g = min(1, 2 − 0) = 1. x ← Épénancourt. – x est vaut la source, on arrête l’algorithme ici. Le gain possible grâce à cette chaîne est donc de 1. Donc, cette itération nous permet de faire passer une troisème péniche dans le flot. On va reporter ce gain sur les flots du graphe. On reparcourt la même chaîne en ajoutant le gain lorsqu’on remonte un marquage «+» et en prélevant lorsqu’on remonte un marquage «-». 1/2 Maizy 2/2 Quierzy on Épénancourt Noyon oy 2/2 −Q ui er zy * +N 1/2 +É pé na nc ou rt – x ← M aizy – Maizy est marqué par «+Noyon». Le flot de l’arc Noyon-Maizy était de 0. On l’augmente de 1. Il passe donc à 1. x ← Noyon. – Noyon est marqué de «-Quierzy». Le flot de l’arc Noyon-Quierzy était de 2. On le diminue de 1. Il passe donc à 1. x ← Quierzy. – Quierzy est marqué «+Épénancourt». Le flot de l’arc Épénancourt-Quierzy était de 0. On l’augmente de 1. Il passe donc à 1. x ← Épénancourt. – x est la source, on arrête l’algorithme ici (Voir figure 5.4). 1/1 F IG . 5.4 – Ford-Fulkerson : Augmentation du flot L’exemple est simple et une seule itération a suffit à saturer tous les canaux arrivants à Maizy. Donc on sait que le flot est maximal. Mais on va quand même continuer l’algorithme de Ford-Fulkerson pour montrer que dans ce cas on ne trouve plus de chaîne améliorante. 48 Eric L ALLET, Jean-Luc R AFFY On recommence la phase de marquage. – La source Épénancourt est marquée d’une *. – Seul Épénancourt est marqué. L’arc Épénancourt-Quierzy n’est pas saturé, donc on marque Quierzy avec «+Épénancourt». Aucun arc n’arrive sur Épénancourt, donc aucun sommet ne peut être marqué de «-Épénancourt». – Quierzy est marqué. Tous les arcs partant de Quierzy sont saturés. Donc aucun sommet ne peut être marqué «+Quierzy». Par contre l’arc qui arrive de Noyon a un flot non nul, et Noyon n’est pas encore marqué, donc on marque Noyon avec «-Quierzy». – Noyon est marqué. Son seul voisin non marqué est Maizy. L’arc qui va de Noyon à Maizy est saturé. On ne peut donc pas marquer Maizy. – Plus aucun marquage n’est possible, le puits n’est pas marqué. Il n’existe plus de chaîne améliorante (voir Figure 5.5). 1/2 2/2 Maizy Quierzy −Q ui er Épénancourt +É Noyon 2/2 zy * pé na nc ou rt 1/2 1/1 F IG . 5.5 – Ford-Fulkerson : Deuxième marquage, et fin de l’algorithme Notre cultivateur pourra donc faire passer 3 péniches par jour entre Épénancourt et Maizy. Comme on vient de le voir dans cette exemple, le flot max sera toujours au mieux égal à la capacité qui sort le source ou qui arrive dans le puits : X X c(u′ )) c(u), ϕmax ≤ min( u∈ω + (source) u′ ∈ω − (puits) 5.6 Flot maximal à coût minimal On va ajouter une composante à notre problème : le coût du transit. Donc maintenant le graphe G = [X, U ] va être doublement valué. Chaque arc u est muni d’une capacité c(u) mais aussi d’un coût unitaire de transit a(u). Donc si le flot transitant par l’arc u est ϕ(u), le coût de transit de ce flot par cet arc est ϕ(u) × a(u). Dans ces conditions, le coût global du flot sur tout le graphe est : X coût global = ϕ(u) × a(u) u∈U Dans un premier temps, le problème que l’on va résoudre consiste à trouver quel est le coût minimal pour faire passer le flot maximal (calculé précédemment par l’algorithme de Ford-Fulkerson) Pour cela on va utiliser l’algorithme de Busacker et Gowen. 5.7 L’algorithme de Busacker et Gowen Cet algorithme utilise de façon itérative la recherche d’un plus court chemin pour trouver où faire passer un flot à moindre coût. Flot après flot, on va saturer le graphe jusqu’à atteindre le coût ou le flot fixé. À chaque fois qu’on va ajouter un flot, cela va saturer des arcs ou éventuellement en libérer d’anciens qui étaient saturés. Il va donc falloir à chaque étape construire un nouveau graphe associé qui représentera les véritables capacités restantes une fois pris en compte les flots déjà envoyés. Regardons comment construire ce graphe associé : Soit le graphe G = [X, U ] où c(u) est la capacité de transit de l’arc u, et a(u) le coût de transit unitaire de cet arc. On notera ϕ(u) le flot qui transit sur l’arc u. Eric L ALLET, Jean-Luc R AFFY 49 Le graphe associé sera G′ = [X, U ′ ] avec c′ (u) la capacité de transit, a′ (u) le coût de transit unitaire. On le construit de la façon suivante : – Pour tout arc (x, y) ∈ U tel que ϕ(x, y) < c(x, y) ajouter un arc (x, y) dans U ′ avec c′ (x, y) = c(x, y) − ϕ(x, y) et a′ (x, y) = a(x, y). – Pour tout arc (x, y) ∈ U tel que ϕ(x, y) > 0 ajouter un arc (y, x) dans U ′ avec c′ (y, x) = ϕ(x, y) et a′ (y, x) = −a(x, y). Pour la première version de l’algorithme de Busacker et Gowen, on se fixe le but d’atteindre ϕmax , la valeur du flot maximal qui peut transiter sur ce graphe (valeur calculée grâce à l’algorithme de FordFulkerson). S est sommet source et P le sommet puits. Algorithme 5.4 (Algorithme de Busacker et Gowen) a) On part avec le graphe vierge de tout flot (ϕ(u) = 0 ∀u ∈ U ), et on pose ϕ = 0. b) Calculer le graphe G′ associé à G. c) Chercher sur G′ un plus court chemin P CCH de S à P , la longueur des arcs étant le coût de transit (avec l’algorithme de Ford-Moore). d) Calculer ∆ϕ , la valeur de flot pouvant transiter par P CCH. ∆ϕ = M in(c′ (u))u∈P CCH e) Pour tout arc (x, y) ∈ P CCH – Si l’arc (x, y) ∈ U alors faire ϕ(x, y) ← ϕ(x, y) + ∆ϕ . – Sinon faire ϕ(y, x) ← ϕ(y, x) − ∆ϕ . f) ϕ ← ϕ + ∆ϕ . Si ϕ = ϕmax alors FIN Sinon allez en «b». 5.8 Exemple flot max coût min Pour illustrer cet algorithme, prenons le graphe de la figure 5.6. A c(u) a(u) 3 100 S 2 100 2 200 B 3 100 3 500 2 100 C P 2 300 F IG . 5.6 – Busacker et Gowen : le graphe exemple Avant d’utiliser Busacker et Gowen, on va calculer le flot maximal de ce graphe. Pour cela on commence par lancer deux flots au jugé : le premier de 2 unités par le chemin S → B → C → P et le second de 3 unités par le chemin S → A → P (voir la figure 5.7). Comme la capacité maximale de la source est saturée avec les 5 unités envoyées, on sait que l’on a le flot maximal. On peut maintenant commencer l’algorithme de Busacker et Gowen : 1. a) On démarre avec les flots à 0 et avec ϕ = 0. Le ϕmax à atteindre est de 5. b) Comme les flots sont nuls, le graphe associé est exactement le même que le graphe de référence (celui de la figure 5.6). 50 Eric L ALLET, Jean-Luc R AFFY A 3/3 100 S 2/2 100 2 200 B 2/3 100 3/3 500 2/2 100 C P 2 300 F IG . 5.7 – Flots au jugé c) On recherche le plus court chemin (au sens du coût) de S à P sur ce graphe. On trouve le chemin S → B → C → P (pour une «longueur» de 300). d) ∆ϕ = M in(c(S, B), c(B, C), c(C, P )) = M in(2, 3, 2) = 2 Le coût de ce premier flot est donc de 2 × longueur(S → B → C → P ) = 2 × 300 = 600. e) On ajoute ce flot au graphe d’origine (voir figure 5.8). f) ϕ ← ϕ + ∆ϕ = 0 + 2 = 2 ϕ < ϕmax donc on refait une itération de l’algorithme de Busacker et Gowen. 2. b) On calcule le nouveau graphe associé. Seul l’axe S → B → C → P évolue : les arcs S → B et C → P saturés disparaissent du graphes. La capacité de l’arc B → C tombe à 1. Et les arcs P → C, C → B et B → S apparaissent avec un coût de −100 et une capacité de 2 (voir figure 5.8). F IG . 5.8 – Busacker et Gowen : deuxième itération c) Le nouveau plus court chemin de S à P sur ce graphe est S → A → C → B → P (pour une longueur de 500 ; attention à C → B qui a une longueur négative de -100). d) ∆ϕ = M in(c(S, A), c(A, C), c(C, B), c(B, P )) = M in(3, 2, 2, 2) = 2. Le coût de ce second flot est donc 2 × longueur(S → A → C → B → P ) = 2 × 500 = 1000. e) On ajoute ce flot au graphe d’origine (voir figure 5.9). f) ϕ ← ϕ + ∆ϕ = 2 + 2 = 4 ϕ < ϕmax donc on refait une itération de l’algorithme de Busacker et Gowen. 3. b) On calcule le nouveau graphe associé. Plutôt que de repartir de zéro, on peut prendre pour base le dernier graphe associé (celui de la figure 5.8) et ajouter dessus notre nouveau flot. Donc sur le chemin de ce flot, l’arc S → A perd 2 sur sa capacité, et un arc A → S apparaît avec une capacité de 2 et un coût de −100. Ensuite l’arc A → C disparaît, mais un arc C → A apparaît avec une capacité de 2 et coût de −200. L’arc B → C retrouve une capacité de 3 et l’arc C → B qui était apparu sur le premier graphe associé n’existe plus. Enfin l’arc B → P disparaît mais un arc P → B apparaît avec une capacité de 2 et un coût de −300 (voir figure 5.9). c) Le nouveau plus court chemin de S à P sur ce graphe est S → A → P (pour une longueur de 600). d) ∆ϕ = M in(c(S, A), c(A, P )) = M in(1, 3) = 1. Le coût de ce troisième flot est donc 1 × longueur(S → A → P ) = 1 × 600 = 600. Eric L ALLET, Jean-Luc R AFFY 51 F IG . 5.9 – Busacker et Gowen : troisième itération e) On ajoute ce flot au graphe d’origine (voir figure 5.10). f) ϕ ← ϕ + ∆ϕ = 4 + 1 = 5 ϕ = ϕmax . On a donc atteint notre objectif et l’algorithme se finit là. A 3/3 100 S 2/2 100 B 2/2 200 3 100 1/3 500 2/2 100 C P 2/2 300 F IG . 5.10 – Busacker et Gowen : le flot maximal à coût minimum L’algorithme s’est fini en trois itérations. Le premier flot a un coût de 600, le deuxième de 1000 et le dernier de 600. Donc le coût total de notre flot est de 2200. 5.9 Variantes Il est possible de changer la condition de fin de l’algorithme de Busacker et Gowen. On peut décider d’arrêter pour tout flot inférieur au flot maximal. On peut donc trouver ainsi le coût minimal pour tout flot compris entre 0 et le flot maximal. On peut aussi décider d’arrêter lorsqu’on a atteint un coût fixé. On peut alors trouver le flot maximal que l’on peut faire passer pour un coût donné. Dans ce cas, il faut aussi vérifier à chaque itération que l’on a pas atteint le flot maximal. Si tel est le cas, cela signifie que l’on peut faire passer le flot maximal pour un coût inférieur ou égal au coût donné. 5.10 Exercices Exercice 5.1 (Cursus de formation) Un organisme qui vend des formations sous-traite ses enseignements dans trois écoles. Une formation qu’elle propose à son catalogue nécessite la validation des trois unités de valeur (U V1 , U V2 , et U V3 ). Il faut avoir validé l’U V1 pour suivre l’U V2 , et avoir validé l’U V2 pour suivre l’U V3 . La deuxième école a des accords d’équivalence avec les deux autres. Elle peut recevoir des élèves ayant validés des U V dans les deux autres écoles, et ses élèves peuvent aussi continuer leur cursus dans les deux autres écoles. 52 Eric L ALLET, Jean-Luc R AFFY La troisième école a réuni les U V2 et U V3 au sein d’un seul module indivisible. Voici le tableau des dates, capacités (en nombre d’élèves) et coût (en k euros/élève) pour les différentes U V et école. Première école Seconde école Troisième école U V1 Début : 1er septembre Fin : 30 novembre Capacité : 40 Coût : 10 k euros Début : 1er octobre Fin : 15 décembre Capacité : 30 Coût : 8 k euros Début : 15 octobre Fin : 15 janvier Capacité : 20 Coût : 13 k euros U V2 Début : 10 décembre Fin : 15 février Capacité : 20 Coût : 10 k euros Début : 5 janvier Fin : 15 mars Capacité : 35 Coût : 8 k euros Début : 20 janvier Fin : 15 juin Capacité : 35 Coût : 20 k euros U V3 Début : 1er février Fin : 15 mai Capacité : 25 Coût : 15 k euros Début : 1er avril Fin : 15 juin Capacité : 30 Coût : 8 k euros À première lecture, la première école peut former 20 élèves, la seconde 30 et la troisième 20. Donc on pourrait former 70 élèves. Mais en profitant des équivalences entre la seconde école et les deux autres, l’organisme de formation doit pouvoir proposer mieux. Combien de formations peut-elle proposer cette année ? Correction page 128. Exercice 5.2 (Cursus de formation (suite)) Finalement l’organisme de formation a reçu une demande pour 63 formations. Quel cursus l’organisme doit proposer à ces 63 élèves pour obtenir ces formations à moindre prix ? Correction page 130. Eric L ALLET, Jean-Luc R AFFY 53 54 Eric L ALLET, Jean-Luc R AFFY Deuxième partie Programmation linéaire Eric L ALLET, Jean-Luc R AFFY 55 Chapitre 6 La programmation linéaire 6.1 Introduction Un des problèmes le plus classique en gestion consiste à optimiser un gain, un coût, ou toutes autres valeurs fonctions de nombreux paramètres. De plus ces paramètres ne peuvent généralement pas être fixés à volonté, mais sont soumis à des contraintes. La valeur à optimiser et les contraintes sont très souvent des fonctions linéaires des paramètres. Il existe alors diverses techniques pour résoudre ce problème. Nous allons présenter deux d’entre elles : la méthode géométrique et le simplexe. 6.2 La forme canonique L’objectif de la programmation linéaire est de trouver la valeur optimale d’une fonction linéaire sous contraintes linéaires. La fonction à optimiser est baptisée fonction coût ou fonction économique. On la nomme généralement Z. Un problème de programmation linéaire se modélise de la façon suivante : Soit la fonction économique Z que l’on souhaite optimiser (maximiser ou minimiser). Z = C1 × X1 + C2 × X2 + ... + Cn × Xn où les Xi sont des variables qui influent sur la valeur de Z, et les Ci les poids respectifs de ces variables modélisant l’importance relative de chacune de ces variables sur la valeur de la fonction économique. Les contraintes relatives aux variables s’expriment de la façon suivante : avec Xi ≥ 0 ∀i A1.1 × X1 + A1.2 × X2 + . . . + A1.n × Xn ≤ B1 A2.1 × X1 + A2.2 × X2 + . . . + A2.n × Xn ≥ B2 .. . Am.1 × X1 + Am.2 × X2 + . . . + Am.n × Xn ≤ Bm Le modèle ci-dessus contient des contraintes de type «≤» et d’autres de type «≥». Cependant lorsqu’on voudra résoudre un problème, la première étape consistera à le modéliser sous une forme dite «canonique». Pour un problème de maximisation la forme canonique se décrit qu’avec des contraintes de type «≤» et pour un problème de minimisation la forme canonique se décrit qu’avec des contraintes de type «≥». Si lors de la modélisation des contraintes de l’autre type sont apparues, il suffit de multiplier par −1 les deux membres pour renverser l’opérateur. Eric L ALLET, Jean-Luc R AFFY 57 La forme canonique d’un problème de type maximisation est : Trouver la valeur maximale de Z pour : Z = C1 × X1 + C2 × X2 + ... + Cn × Xn A1.1 × X1 + A1.2 × X2 + . . . + A1.n × Xn ≤ B1 A2.1 × X1 + A2.2 × X2 + . . . + A2.n × Xn ≤ B2 . .. Am.1 × X1 + Am.2 × X2 + . . . + Am.n × Xn ≤ Bm avec Xi ≥ 0 ∀i La forme canonique d’un problème de type minimisation est : Trouver la valeur minimale de Z pour : Z = C1 × X1 + C2 × X2 + ... + Cn × Xn A1.1 × X1 + A1.2 × X2 + . . . + A1.n × Xn ≥ B1 A2.1 × X1 + A2.2 × X2 + . . . + A2.n × Xn ≥ B2 .. . A × X1 + Am.2 × X2 + . . . + Am.n × Xn ≥ Bm m.1 avec Xi ≥ 0 ∀i Nous allons dans un premier temps nous intéresser au problème de type maximisation 6.3 Exemple Pour illustrer les deux prochains chapitres nous allons modéliser jusqu’à la forme canonique un exemple : Un atelier d’ébénisterie a obtenu un contrat de sous-traitance de meubles pour deux modèles de bibliothèques. Ces deux modèles utilisent du chêne et du hêtre pour être fabriqués. Le modèle «petit chêne» utilise 2 stères de chêne et 4 stères de hêtre. Le modèle «grand hêtre» utilise 8 stères de hêtre et 1 stère de chêne. La construction des 2 modèles nécessite 10 heures de travail chacun. La marge obtenu sur le modèle «petit chêne» est de 600 euros, et celle sur le modèle «grand hêtre» de 400 euros. Sachant que cet atelier dispose chaque année d’un stock de 8.000 stères de hêtre et 2.000 stères de chêne, et qu’il peut fournir 12.500 heures de travail, quelle quantité de chaque modèle doit-il produire pour optimiser sa marge ? La première étape du problème est la modélisation. Il faut en général commencer par trouver la fonction économique. Cela permet de définir les variables du problème. Pour notre exemple, en appelant M1 le nombre de modèles «petit chêne» et M2 le nombre de modèles «grand hêtre» fabriqués, la marge dégagée par l’atelier sera de 600 × M1 + 400 × M2 euros. Donc la fonction économique à maximiser est : Z = 600 × M1 + 400 × M2 (unité : euro) . Mais l’atelier ne peut pas produire à l’infini ces deux modèles. Il est limité par ses stocks de bois et son volume horaire de travail. Le stock de chêne est de 2.000 stères, il en faut 2 pour le modèle M1 et 1 pour le modèle M2 . Donc on obtient la contrainte suivante : 2 × M1 + M2 ≤ 2000 Avec le même raisonnement sur les stères de hêtre il faut respecter la contrainte : 4 × M1 + 8 × M2 ≤ 8000 Enfin, il faut 10 heures de travail pour chaque meuble, et l’atelier en dispose de 12.500, donc : 10 × M1 + 10 × M2 ≤ 12500 58 Eric L ALLET, Jean-Luc R AFFY Donc en résumé on obtient le modèle suivant : Z = 600 × M1 + 400 × M2 2 × M1 + M2 ≤ 2000 4 × M1 + 8 × M2 ≤ 8000 avec 10 × M1 + 10 × M2 ≤ 12500 M1 ≥ 0 et M2 ≥ 0 Eric L ALLET, Jean-Luc R AFFY 59 60 Eric L ALLET, Jean-Luc R AFFY Chapitre 7 La méthode géométrique 7.1 Introduction Dans ce chapitre nous allons décrire la méthode géométrique. Pour les cas simples (c’est à dire, généralement pas plus de deux variables une fois le modèle simplifié), sa mise en œuvre est très facile et rapide. De plus elle permettra plus tard dans ce cours d’illustrer le comportement des autres méthodes, et ainsi de donner une compréhension intuitive des algorithmes. 7.2 La méthode La méthode géométrique consiste à matérialiser dans un espace à n (le nombre de variables de la fonction économique) dimensions les contraintes sur les variables. Ensuite on représente dans cet espace la fonction économique, et on essaie de faire monter «Z» jusqu’au maximum possible tout en restant dans l’espace limité par les contraintes. Cette méthode s’applique facilement lorsque le nombre de dimensions est réduit, car dans ce cas la représentation géométrique est facile, mais dès que ce nombre est important (plus de 3), cette méthode n’est plus envisageable. L’exemple de la section précédente utilise 2 variables. On peut donc l’appliquer. Notre espace est juste un plan. On va mettre sur l’axe x (horizontal) la variable M1 est sur l’axe y (vertical) la variable M2 . Comme on sait que l’on doit avoir M1 ≥ 0 et M2 ≥ 0, la solution de notre problème se trouve dans le premier quadrant (le quart haut droit) de notre espace (voir figure 7.1.) Il faut maintenant mettre en place les trois autres contraintes. Pour indiquer que 2 × M1 + M2 ≤ 2000, il faut tracer la droite 2 × M1 + M2 = 2000 et supprimer de l’espace de solution tout ce qui se trouve au dessus. On fait de même pour les deux autres contraintes (droites 4 × M1 + 8 × M2 = 8000 et 10 × M1 + 10 × M2 = 12500). On obtient le schéma de la figure 7.2. Maintenant que l’on a cerné l’espace des possibilités, il faut trouver le (ou les) point(s) qui nous donne(nt) la plus grande valeur pour la fonction économique Z = 600 × M1 + 400 × M2 . Pour cela on va commencer par dessiner la droite avec Z = 0, et on va faire glisser cette droite jusqu’à faire monter Z au maximum tout en restant dans l’espace de solution. Quand on aura atteint ce maximum, le (ou les) point(s) commun(s) à la droite et l’espace des solutions sera notre optimum (voir figure 7.3). Il reste alors à interpréter le résultat. Sur le schéma, lorsqu’on a fait monter Z, l’ultime point commun entre Z et l’espace des solutions admissibles était pour M1 = 750 et M2 = 500. Donc la solution qui apporte la plus grande marge possible à notre atelier consiste à construire 750 bibliothèques «petit chêne» et 500 bibliothèques «grand hêtre». Sa marge sera alors de 750 × 600 + 500 × 400 = 650.000 euros. Eric L ALLET, Jean-Luc R AFFY 61 F IG . 7.1 – Espace possible pour M1 et M2 positifs F IG . 7.2 – Espace des «solutions admissibles» après prise en compte des contraintes 7.3 Conclusion Très simple à utiliser cette méthode atteint vite ses limites pour des problèmes correspondant aux cas réels. En dehors des cas d’école, il est rare de pouvoir construire une modèle avec seulement deux variables. Et quand ce n’est pas le cas, il faut alors utiliser d’autres méthodes. Le chapitre suivant présente une des méthodes les plus utilisées, car très performante : le simplexe. 62 Eric L ALLET, Jean-Luc R AFFY F IG . 7.3 – Recherche du Z optimum 7.4 Exercices Voir les exercices 8.1 et 8.2 page 74. Eric L ALLET, Jean-Luc R AFFY 63 64 Eric L ALLET, Jean-Luc R AFFY Chapitre 8 Le simplexe 8.1 Introduction Le méthode du simplexe a été mise au point par Georges Dantzig dans les années 1950. Elle implémente une heuristique qui permet dans une très grande majorité des cas d’atteindre l’optimum du problème très rapidement. Son principe consiste à parcourir un chemin sur les frontières du domaine des solutions admissibles, en s’approchant à chaque étape un peu plus de l’optimum. L’heuristique essaye de trouver parmi tous les chemins un qui soit très court. 8.2 La forme standard et son tableau associé L’algorithme du simplexe sert à résoudre un problème de programmation linéaire de type maximisation qui s’exprime sous la forme canonique suivante : Il faut trouver le maximum d’une fonction économique Z exprimée par : Z = C1 × X1 + C2 × X2 + ... + Cn × Xn en respectant les contraintes : A1.1 × X1 + A1.2 × X2 + . . . + A1.n × Xn ≤ B1 A2.1 × X1 + A2.2 × X2 + . . . + A2.n × Xn ≤ B2 .. . A × X1 + Am.2 × X2 + . . . + Am.n × Xn ≤ Bm m.1 Xj ≥ 0 ∀j Pour résoudre ce problème, on va commencer par transformer les inégalités en égalités en introduisant une variable «d’écart» positive ou nulle pour chacune des contraintes. Par exemple avec une nouvelle variable E1 , on peut transformer l’inégalité A1.1 × X1 + A1.2 × X2 + . . . + A1.n × Xn ≤ B1 pour la faire devenir l’égalité A1.1 × X1 + A1.2 × X2 + . . . + A1.n × Xn + E1 = B1 . Avec les m variables d’écart, notre problème devient : Avec Xj ≥ 0 ∀j et Ei ≥ 0 ∀i, trouver le maximum de Z pour : A1.1 × X1 + A1.2 × X2 + . . . + A1.n × Xn + E1 = B1 A2.1 × X1 + A2.2 × X2 + . . . + A2.n × Xn + E2 = B2 .. . A × X1 + Am.2 × X2 + . . . + Am.n × Xn + Em = Bm m.1 C1 × X1 + C2 × X2 + ... + Cn × Xn = Z Ceci est la forme standard du problème. Eric L ALLET, Jean-Luc R AFFY 65 Avant de mettre en œuvre l’algorithme du simplexe on transforme ces équations sous la forme d’un tableau qui aura n + m + 2 colonnes, et m + 2 lignes : – La première ligne contiendra le nom de nos colonnes. – Il y aura une ligne pour chacune des équations 1 à m. – La dernière ligne sert pour la fonction économique. – La première colonne sert à connaître ce qu’on va appeler les «variables en base». Au début on y placera la variable d’écart Ei de la ligne. Les variables qui ne seront pas dans cette colonne seront «hors base». – Ensuite on place n colonnes, une pour chaque variable Xj . – Ensuite on place m colonnes, une pour chaque variable Ei . – Enfin on place une dernière colonne qui contiendra la somme de chaque ligne (Bi ). – Enfin la valeur «Somme» de la ligne ∆j est initialisée avec 0 (sauf exception expliquée plus loin). Donc le tableau obtenu est le suivant : E1 E2 .. . Em ∆j X1 A1.1 A2.1 X2 A1.2 A2.2 ... ... ... Xn A1,n A2,n E1 1 0 E2 0 1 ... 0 0 Em 0 0 Somme B1 B2 Am.1 C1 Am.2 C2 ... ... Am,n Cn 0 0 0 0 0 0 1 0 Bm 0 Avant d’aller plus loin, décryptons le sens de ce tableau. Tout le long de l’algorithme du simplexe ce tableau va donner des solutions (de plus en plus optimales pour la valeur de Z) du système d’équations de la forme standard. Dans cette solution toutes les variables hors base ont une valeur nulle. La valeur des variables en base se lit dans la dernière colonne (la colonne «Somme»). Enfin le ∆j de la colonne «Somme» donne l’opposé de la valeur de Z. Donc ce premier tableau du simplexe donne la solution de départ qui va servir à amorcer l’algorithme du simplexe : toutes les variables Xi sont à 0, toutes les variables d’écart Ei valent le Bi de leur ligne d’équation et la valeur de Z est 01 . Sur ce tableau la dernière ligne (∆j ) donne les gains (ou les coûts, si la valeur est négative) marginaux des variables de leur colonne. Autrement dit, elle permet de savoir de combien va augmenter (ou diminuer si la valeur est négative) la valeur de Z si on augmente de 1 la variable de cette colonne. Par exemple, si on arrive à trouver une solution admissible qui augmente de 1 la valeur de X2 , alors la valeur de Z va augmenter de C2 . Revenons à l’exemple de l’atelier d’ébénisterie de la section 6.3, et construisons son tableau pour le simplexe : Z = 600 × M1 + 400 × M2 (unité : euro) 2 × M1 + M2 ≤ 2000 4 × M1 + 8 × M2 ≤ 8000 avec 10 × M1 + 10 × M2 ≤ 12500 M1 ≥ 0 et M2 ≥ 0 Mis sous la forme standard, avec l’ajout de 3 variables d’écarts E1 , E2 et E3 telles que : – E1 désigne le nombre de stères de chêne qui restent sans usage pour la solution courante. – E2 désigne le nombre de stères de hêtre qui restent sans usage pour la solution courante. – E3 désigne le nombre d’heures de travail qui restent sans usage pour la solution courante. 1 Certains problèmes donnent un modèle où cette solution de départ n’est pas admissible car certains Bi sont négatifs. Il faut alors trouver un autre point de départ. Nous verrons dans le chapitre 10 page 81 comment le trouver. D’autre part, dans certains cas, la valeur de Z de la solution initiale n’est pas nulle, il faut alors mettre l’opposé de cette valeur dans le ∆j de la colonne «Somme». 66 Eric L ALLET, Jean-Luc R AFFY 2 × M1 4 × M1 10 × M1 600 × M1 + M2 + 8 × M2 + 10 × M2 + 400 × M2 + E1 + E2 + E3 = 2000 = 8000 = 12500 = Z Ce qui donne le tableau : E1 E2 E3 ∆j M1 2 4 10 600 M2 1 8 10 400 E1 1 0 0 0 E2 0 1 0 0 E3 0 0 1 0 Somme 2000 8000 12500 0 8.3 L’algorithme du simplexe Pour décrire cet algorithme, on va noter le tableau du simplexe sous la forme suivante2 : y1 .. . yi .. . ym ∆ x1 a1,1 x2 a1,2 ... ... xj a1,j ... ... xp a1,p Somme SM1 ai,1 ai,2 ... ai,j ... ai,p SMi am,1 ∆1 am,2 ∆2 ... ... am,j ∆j ... ... am,p ∆p SMm Res Dans ce tableau la colonne des variables yi est appelé la base. Au cours de l’algorithme certaines variables xi vont pivoter et vont venir se mettre en base. Au tout début de l’algorithme les variables de base sont les m variables d’écart. L’algorithme du simplexe est un algorithme itératif qui à chaque tour va trouver une nouvelle solution qui augmente la valeur de Z jusqu’à ce qu’on ne puisse plus l’améliorer. Chaque tour de cet algorithme se passe en deux grandes étapes. – La recherche du pivot (grâce à une heuristique qui permet généralement de converger rapidement vers la solution) – La mise en base de la variable du pivot, et le calcul du nouveau tableau Algorithme 8.1 (Algorithme du simplexe) 1. La recherche du pivot : a) Premier critère de Dantzig : On a vu que la dernière ligne donnait le gain marginal des variables. Comme le but est d’augmenter la valeur de Z et d’arriver le plus vite possible à la solution optimale, on va choisir la variable qui a le plus grand gain. Ainsi le pivot se trouve sur la colonne j qui a le ∆j strictement positif le plus grand. b) Second critère de Dantzig : Le premier critère nous a indiqué la variable qui allait passer en base. Le second critère sert à indiquer la variable qui va sortir de la base (et donc passer à 0) pour augmenter le plus possible la variable choisie tout en gardant une solution admissible pour le système d’équations. Le pivot se trouve sur la ligne i qui un ai,j strictement positif et le rapport SMi /ai,j le plus petit. 2 Dans ce tableau il y a p=n+m variables x : les n variables de la fonction économique, plus les m variables d’écart Eric L ALLET, Jean-Luc R AFFY 67 2. Le pivotement : soit ai,j le pivot trouvé à l’étape 1. a) Mise en base de xj Lors du pivotement, la variables yi de la base est remplacée par xj . b) Modification de la ligne du pivot : On divise la ligne par le pivot. Pour l allant de 1 à p faire : a′i,l ← ai,l ai,j Notez que le pivot passe donc à 1. c) Modification des autres lignes On soustrait à toutes les lignes k, avec k 6= i la ligne du pivot proportionnellement à ak,j /ai,j : SMk′ ← SMk − (SMi × ak,j ) ai,j Res′ ← Res − (SMi × ∆j ) ai,j Pour l allant de 1 à p faire : a′k,l ← ak,l − ∆′l ← ∆l − (ai,l × ak,j ) ai,j (ai,l × ∆j ) ai,j Notez que sur la colonne du pivot, mis à part le pivot lui même, toutes les valeurs sont passées à 0. 3. La boucle Si après le nouveau calcul il existe encore un ∆j strictement positif, on peut encore augmenter Z : retournez à l’étape 1. Pour simplifier la description de l’étape «2c» de l’algorithme, il y une formule qui fonctionne pour toutes les valeurs qui ne sont pas sur la ligne du pivot (même sur la colonne «Somme» ou sur la ligne «∆j ») : On recherche v ′ , la nouvelle valeur de v. Soit p le pivot, x et y les valeurs qui sont à l’intersection des lignes et colonnes de v et du pivot, alors : v ′ = v − x × y/p p .. . ... x .. . y ... v ′ = v − x × y/p 8.4 Interprétation du tableau final À la fin de l’algorithme, le tableau du simplexe continue à se lire de la même manière. Ainsi les solutions du problème d’origine se lisent directement dans ce tableau. Les valeurs des variables Xj passées en base à la place de Ei se lisent dans la colonne «Somme» : SMi . Les variables Xj qui ne sont pas passées en base sont nulles. La valeur optimale de Z est l’opposé de la valeur de «Res». Les valeurs des variables d’écart qui ont quitté la base sont nulles. Les variables d’écart Ei qui sont toujours en base indiquent qu’une contrainte n’a pas atteint son maximum. La valeur de cette variable d’écart se lit dans la colonne «Somme» : SMi . 68 Eric L ALLET, Jean-Luc R AFFY Si à la fin de l’algorithme il y a des variables hors base avec un ∆j nul, alors il existe d’autres solutions optimales (une infinité en fait). Vous pouvez faire un pivotement de plus en choisissant la colonne d’une de ces variables pour trouver la solution optimale qui privilégie cette valeur. Si alors qu’il reste des ∆j strictement positifs, il n’est plus possible de trouver un pivot strictement positif sur leur colonne, alors la fonction économique n’est pas bornée. Il existe des solutions qui permettent de monter sa valeur à l’infini . Mais dans le cadre de modèles de gestion, il est peu probable que vous puissiez dégager des bénéfices infinis. Ce diagnostic cache dont très certainement un problème dans votre modélisation (probablement des contraintes oubliées). 8.5 Exemple Reprenons l’exemple de l’ébénisterie. On avait déjà construit le tableau du simplexe suivant. Il correspond à une première solution (non optimale pour Z) du système d’équations : M1 = 0 et M2 = 0. E1 E2 E3 ∆j M1 2 4 10 600 M2 1 8 10 400 E1 1 0 0 0 E2 0 1 0 0 E3 0 0 1 0 Somme 2000 8000 12500 0 Il y a des ∆j strictement positifs : on peut trouver une meilleure solution. Faisons la première itération : 1. a) Le premier critère de Dantzig (le plus grand ∆j ) permet de sélectionner la colonne de M1 pour le pivot. b) Le second critère de Dantzig (le plus petit SMi /ai, j) permet de sélectionner la ligne de E1 pour le pivot. M1 M2 E1 E2 E3 Somme E1 2 1 1 0 0 2000 E2 E3 ∆j 4 10 600 8 10 400 0 0 0 1 0 0 0 1 0 8000 12500 0 2. a) La variable M1 passe en base à la place de E1 . b) La ligne du pivot est divisée par 2. c) on retire à la ligne de E2 4/2 = 2 fois la ligne du pivot. on retire à la ligne de e3 10/2 = 5 fois la ligne du pivot. on retire à la ligne des ∆j 600/2 = 300 fois la ligne du pivot. On obtient un nouveau tableau du simplexe. Son interprétation correspond à la solution M1 = 1000 et M2 = 0. M1 E2 E3 ∆j M1 1 0 0 0 M2 1/2 6 5 100 E1 1/2 -2 -5 -300 E2 0 1 0 0 Eric L ALLET, Jean-Luc R AFFY E3 0 0 1 0 Somme 1000 4000 2500 -600000 69 3. Il reste un ∆j strictement positif. On peut encore améliorer la valeur de Z. Donc on fait une autre itération. Seconde itération : 1. a) Le premier critère de Dantzig permet de sélectionner la colonne de M2 pour le pivot. b) Le second critère de Dantzig permet de sélectionner la ligne de E3 pour le pivot. 2. M1 E2 M1 1 0 M2 1/2 6 E1 1/2 -2 E2 0 1 E3 0 0 Somme 1000 4000 E3 0 5 -5 0 1 2500 ∆j 0 100 -300 0 0 -600000 (a) La variable M2 passe en base à la place de E3 (b) La ligne du pivot est divisée par 5 (c) On retire à la ligne de M1 (1/2)/5 = 1/10 fois la ligne du pivot. On retire à la ligne de E2 (6/5) fois la ligne du pivot. On retire à la ligne des ∆j 100/5 = 20 fois la ligne du pivot. On obtient un nouveau tableau du simplexe. Son interprétation correspond à la solution M1 = 750 et M2 = 500. M1 E2 M2 ∆j M1 1 0 0 0 M2 0 0 1 0 E1 1 4 -1 -200 E2 0 1 0 0 E3 -1/10 6/5 1/5 -20 Somme 750 1000 500 -650000 3. Il ne reste plus aucun ∆j strictement positif. La solution est optimale. L’algorithme s’arrête ici. Il nous reste à interpréter le tableau final. – La somme au bout de la ligne de M1 est 750 : il faut construire 750 bibliothèques M1 («petit chêne»). – La somme au bout de la ligne de M2 est 500 : il faut construire 500 bibliothèques M2 («grand hêtre»). – La valeur de Res est -650000 : le Z optimal est de 650000, qui sera (en euros) la marge dégagée par la vente des bibliothèques construites. – La variable d’écart E2 est toujours en base. La valeur dans sa colonne somme est 1000. Donc pour la solution optimale E2 = 1000. E2 est la variable d’écart qui donne le nombre de stères de hêtre non utilisés. Donc la solution optimale du problème laisse 1000 stères de hêtre sans usage. Trois nombres restent à interpréter. Les valeurs des ∆j pour les colonnes des variables d’écart. Ce sont les «coûts marginaux». Elles indiquent combien on pourrait dégager de marge en plus si on augmentait nos stocks de chêne, de hêtre et d’heures de travail (ou au contraire à quel prix minimum il faudrait vendre ce stock pour qu’il rapporte au moins autant que la production faite avec). – La valeur marginale pour E1 est -200. Et E1 est la variable d’écart qui désigne les stères de chêne non-utilisés. Cela signifie qu’augmenter de 1 E1 , c’est à dire de laisser sans usage 1 stère de chêne, coûterait 200 Euros. Et au contraire, disposer de 1 stère de chêne de plus permettrait de gagner 200 euros supplémentaires. Donc si le stère de chêne coûte moins de 200 euros, il sera intéressant d’en acheter pour produire plus, et s’il coûte plus de 200 euros, il vaudra mieux vendre notre stock plutôt que de produire avec. – La valeur marginale pour E2 est 0. Cela signifie qu’acheter du hêtre en plus ne rapporterait rien. Ce qui est logique puisqu’on vient de voir que l’on n’avait déjà pas épuisé notre propre stock. Et donc on peut vendre ce sur-stock à n’importe quel prix sans perdre d’argent. 70 Eric L ALLET, Jean-Luc R AFFY – La valeur marginale pour E3 est -20. E3 est la variable qui sert à désigner le nombre d’heures de travail non utilisées. Ainsi augmenter le nombre d’heures de travail de 1, permet de gagner 20 euros de plus. Donc l’entreprise n’a intérêt à augmenter le nombre d’heures de travail que si cela ne lui coûte pas plus de 20 euros de l’heure. 8.6 Plus loin au sujet des valeurs marginales Attention l’interprétation des coûts marginaux n’est valable qu’à la marge. Dans ce type de problème on parcourt des paliers avec des effets de seuil. Dès qu’on franchit un seuil les coûts marginaux changent. Dans l’exemple de la section précédente, il reste 1000 stères de hêtre sans usage. Donc les coûts marginaux associés à cette variable sont nuls : on peut vendre ce bois à n’importe quel prix, cela augmentera les gains. Mais cette remarque n’est vrai que pour le stock inutilisé. Au delà des 1000 stères, continuer à vendre du hêtre diminuerait la production de meuble, et donc les gains. C’est le seuil à partir duquel le coût marginal pour les bois de hêtre va changer. Pour le cas des stocks inutilisés le seuil est assez simple à trouver (c’est la grandeur du stock), mais pour les autres variables il faut procéder différemment. Examinons un autre cas : le coût marginal associé au bois de chêne est de 200 euros le stère. Autrement dit si on arrive à vendre ce bois plus cher que 200 euros le stère on a intérêt à le vendre plutôt que de produire avec. Par contre si on arrive à trouver du chêne à moins de 200 euros le stère, on a intérêt à l’acheter et à produire avec pour augmenter les gains. Imaginons que l’ébénisterie trouve un marché où elle peut acheter du chêne à 150 euros le stère. Elle devrait l’acheter. Chaque stère obtenu ainsi va lui permettre d’augmenter ses gains de 50 euros. Mais ce gain ne peut monter que jusqu’à un certain seuil : la production est limitée par le stock de hêtre et le nombre d’heure de travail dont dispose l’ébénisterie. Au delà de ce seuil, elle ne pourra plus produire de meubles avec le chêne acheté, et elle dépensera donc 200 euros pas stère sans pouvoir rien en faire. Quel est ce seuil ? On retombe sur un nouveau problème de programmation linéaire. Si l’ébénisterie accepte d’acheter du chêne tant que c’est rentable, on retrouve le même problème que précédemment avec une contrainte de moins : celle concernant le stock de chêne. Sa modélisation est donc identique à avant, excepté l’inégalité concernant cette contrainte qui disparaît : Z = 600 × M1 + 400 × M2 hhh ( ( ( ( h h h 2× M +( M( ≤h 2000 la contrainte sur le chêne n’existe plus 1( 2h ( ( h h ( 4 × M1 + 8 × M2 ≤ 8000 contrainte sur le hêtre avec 10 × M1 + 10 × M2 ≤ 12500 contrainte sur les heures de travail M1 ≥ 0 et M2 ≥ 0 On obtient ainsi le même tableau du simplexe que précédemment mais avec la variable E1 (celle concernant le chêne) en moins : E2 E3 ∆j M1 4 10 600 M2 8 10 400 E2 1 0 0 E3 0 1 0 M2 4 1 -200 E2 1 0 0 E3 -2/5 1/10 -60 Somme 8000 12500 0 Ce simplexe se résout en une seule itération : E2 M1 ∆j M1 0 1 0 Somme 3000 1250 750000 Grâce à l’achat de stères supplémentaires, une nouvelle solution optimale se dessine : – M1 vaut 1250. Il faut produire 1250 bibliothèques «petit chêne». – M2 n’est pas en base, donc M2 vaut 0. Il ne faut plus produire de bibliothèques «petit hêtre» Eric L ALLET, Jean-Luc R AFFY 71 – E2 vaut 3000. Il reste donc 3000 stères de hêtre inutilisé. Chaque bibliothèque «petit chêne» consomme 2 stères de chênes. Il a donc fallu un total de 1250 × 2 = 2 500 stères de chêne pour la production. Comme le stock initial était de 2 000, il a fallu acheter 500 stères supplémentaires. Le coût de cet achat est : 150 × 500 = 75 000 euros. Et attention le nouveau gain pour l’ébénisterie est donc de 675 000 euros. En effet, même si le gain qui apparaît dans le dernier tableau du simplexe est 750 000 euros, il faut penser à lui soustraire le prix des stères de chêne qu’il fallut acheter pour obtenir la nouvelle solution : 750 000 − 75 000 = 675 000. Il existe un autre moyen de calculer ce nouveau gain : dans le problème précédent le gain était de 650 000 euros. On a vu qu’en achetant le chêne à 150 euros le stère, on augmentait le gain de 50 euros par stères. Donc les 500 stères ont augmenté le gain de 500 × 50 = 25 000. Et 650 000 + 25 000 redonne bien la même valeur : 675 000. 8.7 Unités et simplifications 8.7.1 Les unités des variables Un risque important d’erreurs dans l’interprétation du tableau du simplexe est de se tromper dans les unités. En effet entre les données originales du problème, leur interprétation, la mise en équation, les simplifications, la construction du tableau et les pivotements il y a de nombreuses occasions d’erreurs. Dans le tableau du simplexe les nombres qui ont besoin d’être interprétés sont dans la dernière ligne et la dernière colonne. Leurs unités sont directement liées aux variables dans la première ligne et la première colonne. Il faudra donc veiller à toujours bien indiquer le nom de ces variables lors de la création du tableau et lors des divers pivotements. L’unité d’un nombre sur la dernières colonne est celle de la variable en première colonne. Attention, celle-ci peut changer lors d’un pivotement. L’unité d’un nombre sur la dernière ligne est celle de Z divisée par celle de la variable en première ligne. Y1 .. . Ym ∆j X1 ... Xp Unité de Z/Unité de X1 ... Unité de Z/Unité de Xp Somme Unité de Y1 .. . Unité de Ym Unité de Z Dans un problème classique les unités des variables du problème et l’unité de Z sont généralement bien identifiées. Par contre il y a souvent plus d’incertitudes sur les unités des variables d’écart. Tant qu’on ne cherchera qu’à connaître la valeur de Z et des variables du problèmes il sera possible de laisser ce flou sur les variables d’écart, mais si on doit interpréter les valeurs marginales liées à ces variables, il faudra être très rigoureux. Un des risques majeurs de se tromper dans leur unités apparaît lors de la simplification des inégalités du problème. Reprenons l’exemple traité précédemment, mais cette fois ci en simplifiant les nombres lorsque cela est possible. 8.7.2 Simplification de la fonction économique Toutes les simplifications faites sur la fonction économique apportent un changement d’unité de Z. Pour illustrer cela, reprenons l’exemple de la modélisation de la page 58. On avait décrit Z avec la fonction : Z = 600 × M1 + 400 × M2 . M1 et M2 étaient le nombre de modèles de chaque étagère. Chaque modèle M1 rapporte 600 euros, et chaque modèle M2 , 400 euros. Donc ici l’unité de Z est l’euro. Mais on peut décider de simplifier les nombres, et dire que chaque modèle M1 rapporte 6 «hecto euros3 » et chaque modèle M2 4 «hecto euros». Alors on obtient une fonction Z ′ = 6 × M1 + 4 × M2 exprimée en «hecto euros». 31 72 hecto euro = 100 euro Eric L ALLET, Jean-Luc R AFFY 8.7.3 Simplification des inégalités Les simplifications faites sur les inégalités obtenues grâce aux diverses contraintes laissent inchangées les unités des variables du modèle, mais changent les unités des variables d’écarts. Reprenons encore le problème de la page 58 pour illustrer ce type de simplification. Le modèle avait 3 contraintes, et donc trois inégalités. – La première concernait la consommation des stères de chêne à disposition. Chaque modèle M1 consomme 2 stères de chêne et chaque modèle M2 consomme 1 stère de chêne. Comme on ne dispose que de 2000 stères de chêne on a : 2 × M1 + M2 ≤ 2000. L’unité des variables du modèle M1 et M2 est «le nombre de modèle». Mais les coefficients placés devant (2 pour M1 et 1 pour M2 ) sont en «stère de chêne par modèle». Donc l’unité des membres de cette inégalité est le «stère de chêne». Lors du passage à la forme standard, la variable d’écart ajoutée (E1′ ) sera homogène avec les autres membres de cette inégalité, et sera donc exprimée en «stère de chêne». Il n’y aucun intérêt à simplifier cette inégalité qui va donc rester inchangée. – Le seconde contrainte concernait la consommation de stères de hêtre. Chaque modèle M1 consomme 4 stères de hêtre et chaque modèle M2 consomme 8 stères de hêtre. Comme on ne dispose que de 8000 stères de hêtre on a : 4 × M1 + 8 × M2 ≤ 8000. L’unité des variables du modèle M1 et M2 reste toujours «le nombre de modèle», mais les coefficients placés devant (4 pour M1 et 8 pour M2 ) sont en «stère de hêtre par modèle». Donc l’unité des membres de cette inégalité est le «stère de hêtre». Il est intéressant de simplifier cette inégalité par 4. On obtient : M1 + 2 × M2 ≤ 2000. Mais si on devait maintenant interpréter cette inégalité, il faudrait changer d’unités. Il faudrait parler le «4 stères de hêtre». Chaque modèle M1 consomme 1 «4 stères de hêtre», chaque modèle M2 consomme 2 «4 stères de hêtre», et on dispose de 2000 «4 stères de hêtres». Donc l’unité des membres de l’inégalité simplifiée est «4 stères de hêtre». La variable d’écart qui sera ajoutée lors du passage à la forme standard (E2′ ) devra être homogène avec les autres membres, et aura donc pour unité «4 stères de hêtre». – Enfin, la troisième contrainte concernait la consommation d’heures de travail. Chaque modèle M1 et M2 nécessite 10 heures de travail. Comme on ne dispose que de 12500 heures de travail on a : 10 × M1 + 10 × M2 ≤ 12500. Les unités de M1 et M2 reste «le nombre de modèle», mais les coefficients placés devant (10 pour M1 et M2 ) sont en «heure de travail par modèle». Donc l’unité des membres de cette inégalité est «l’heure de travail». Il est intéressant de simplifier cette inégalité par 10. On obtient : M1 + M2 ≤ 1250. Les coefficients devant M1 et M2 ont (en apparence) disparu. Et une lecture rapide pourrait interpréter cette inégalité en «nombre de modèle». Mais en fait devant les variable M1 et M2 se cache un «1×» qui dit 1× «10 heures de travail» par modèle. Donc la véritable unité des membres de cette inégalité est «10 heures de travail». La variable d’écart qui sera ajoutée lors du passage à la forme standard (E3′ ) devra être homogène avec les autres membres, et aura donc pour unité «10 heures de travail». En résumé on obtient, trouver le maximum de Z ′ avec : 2 × M1 + M2 ≤ 2000 unité des membres : stère de chêne M1 + 2 × M2 ≤ 2000 unité des membres : 4 stères de hêtre M1 + M2 ≤ 1250 unité des membres : 10 heures de travail avec Z ′ = 6 × M1 + 4 × M2 unité des membres : 100 euros M1 ≥ 0 et M2 ≥ 0 8.7.4 Calculs et interprétations Il faut ensuite tenir compte de ces changements d’unités lors des calculs et des interprétations. Durant la phase de calcul il n’y en fait aucun changement, sauf bien sûr des nombres plus simples à manipuler. Continuons le traitement de l’exemple après la simplification : Lorsque l’on passe à la forme standard il faut ajouter 3 variables d’écart au problème. Ces 3 variables vont récupérer l’unité de leur équation. On va donc avoir : – E1′ : le nombre de stères de chêne non utilisés. – E2′ : le nombre de «4 stères de hêtre» non utilisés. – E3′ : le nombre de «10 heures de travail» non utilisés. Ainsi l’unité de E1′ est «1 stère de chêne», celle de E2′ est «4 stères de hêtre» et celle de E3′ est «10 Eric L ALLET, Jean-Luc R AFFY 73 heures de travail». Mis sous la forme du simplexe, on obtient : E1′ E2′ E3′ ∆j M1 2 1 1 6 M2 1 2 1 4 E1′ 1 0 0 0 E2′ 0 1 0 0 E3′ 0 0 1 0 M2 1/2 3/2 1/2 1 E1′ 1/2 -1/2 -1/2 -3 E2′ 0 1 0 0 E3′ 0 0 1 0 Somme 1000 1000 250 -6000 M2 0 0 1 0 E1′ 1 1 -1 -2 E2′ 0 1 0 0 E3′ -1 -3 2 -2 Somme 750 250 500 -6500 Somme 2000 2000 1250 0 Après le premier pivotement on a : M1 E2′ E3′ ∆j M1 1 0 0 0 Après le second pivotement on a : M1 E2′ M2 ∆j M1 1 0 0 0 Le simplexe s’arrête ici. Il faut maintenant faire l’interprétation des résultats. L’interprétation des variables M1 et M2 ne posent aucun problème. Leur unité n’a pas changé. Il faut donc construire 750 modèles 1 et 500 modèles 2. L’interprétation de Z ′ demande plus de vigilance : son unité est «100 euros». Donc la marge dégagée sera de 6500 «100 euros», autrement dit 650000 euros. La valeur de E2′ est de 250. Mais attention, son unité est «4 stères de hêtre». Donc à la fin, il reste 250 «4 stères de hêtre» sans usage, autrement dit 1000 stères de hêtre sans usage. La valeur marginale dans la colonne de E3′ est −2. Son unité est celle de Z ′ divisée par celle de E3′ , donc «100 euros»/«10 heures de travail». Donc le coût marginale de l’heure de travail est de 2 «100 euros»/«10 heures de travail», autrement dit 20 euros par heure de travail. Ainsi, une fois interprétés avec leurs bonnes unités les nombres donnés par le tableau du simplexe des équations simplifiées donnent heureusement la même solution que précédemment. 8.8 Exercices Exercice 8.1 (Une histoire de fromage) Une laiterie s’est spécialisée dans deux fromages. Le premier est un AOC qui exige plus d’heures de travail et un lait en provenance d’une région bien précise. Le second demande moins de travail, et peut être fabriqué avec n’importe quel lait. Par contre sa vente dégage une marge moindre. La laiterie dispose de 21 000 heures de travail annuel, elle reçoit 4 millions de litres de lait de la zone AOC, et 6 millions de litres d’autres zones. 74 Eric L ALLET, Jean-Luc R AFFY Le tableau suivant indique les ressources nécessaires pour produire 1 tonne de fromage. Fromage Fromage 1 (AOC) Fromage 2 heures de travail par tonne de fromage 30 h 15 h litres de lait par tonne de fromage 10 000 l 7 500 l Sachant qu’un kilo du fromage AOC dégage une marge de 3 euros et qu’un kilo de l’autre fromage seulement 1 euro, quelle production doit fabriquer cette laiterie pour optimiser ses bénéfices ? Correction page 132. Exercice 8.2 (Une histoire de fromage (bis)) Même question, mais cette fois ci, avec une marge de 2 euros par kilo pour le fromage AOC et toujours d’un seul euro pour le second fromage. Correction page 134. Exercice 8.3 (Problème électrique) Un revendeur d’électricité a promis à sa clientèle qu’au moins 25% de son électricité serait d’origine renouvelable. Il a calculé que pour l’année qui arrive il aura un marché de 18 TWh (térawattheure). Il a aussi pré-sélectionné trois fournisseurs à qui il va acheter son électricité en gros. Voici les quantités (en TWh), le taux d’électricité renouvelable et la marge dégagée (en k euro/TWh) que peuvent lui fournir ces trois producteurs. Producteur 1 Producteur 2 Producteur 3 % d’électricité renouvelable 10 % 46 % 100 % Quantité d’électricité achetable (TWh) 25 6 4 Marge (k Euro/TWh) 900 700 500 Chez quels producteurs et en quelle quantité ce revendeur doit-il acheter son électricité pour avoir le meilleurs bénéfice possible ? Correction page 135. Exercice 8.4 (Problème électrique (bis)) Même problème mais avec ces nouvelles marges : Producteur 1 Producteur 2 Producteur 3 % d’électricité renouvelable 10 % 46 % 100 % Quantité d’électricité achetable (TWh) 25 6 4 Marge (k euros/TWh) 850 710 500 Pour des raisons politiques le revendeur aimerait privilégier le second producteur. Est-il possible d’acheter une partie de l’électricité chez lui sans faire baisser les profits ? Correction page 137. Eric L ALLET, Jean-Luc R AFFY 75 76 Eric L ALLET, Jean-Luc R AFFY Chapitre 9 Le problème dual 9.1 Introduction En programmation linéaire à tout problème où il faut trouver le maximum d’une fonction économique encadrée par des contraintes de type «inférieur ou égal», il existe un problème associé où il faut trouver le minimum d’une fonction économique encadrée par des contraintes de type «supérieur ou égal» (et réciproquement). Chaque problème est le «dual» de l’autre. Ces deux problèmes sont liés par de nombreuses propriétés. Par exemple la valeur maximale de la fonction économique de l’un est exactement la valeur minimale de la fonction économique de l’autre. En fait résoudre un des deux problèmes permet de connaître la solution de l’autre. Voila pourquoi dans certains cas, plutôt que de résoudre le problème, on va chercher à résoudre son dual. Cela peut être par exemple, un moyen de réduire le nombre de variables pour utiliser la méthode géométrique. Dans les sections suivantes nous allons utiliser cette métode pour transformer un problème de type «minimisation» en problème de type «maximisation» afin de pouvoir utiliser le simplexe pour le résoudre. 9.2 Création du problème dual Si problème primal avec ses «m» contraintes et sa fonction économique Z dont on cherche le maximum s’exprime ainsi : n variables m contraintes : z (1) A1.1 A2.1 Z= Am.1 C1 ×X1 + ×X1 + .. . ×X1 + ×X1 + (2) A1.2 A2.2 Am.2 C2 }| { ×X2 + . . . + ×X2 + . . . + (n) A1.n A2.n. ×Xn ×Xn ≤ ≤ (Z ′ ) B1 B2 ×X2 + . . . + ×X2 + . . . + Am.n Cn ×Xn ×Xn ≤ Bm Xi ≥ 0 ∀i alors son problème dual avec ses «n» contraintes et sa fonction économique Z’ dont on cherche le minimum s’exprimera ainsi : Eric L ALLET, Jean-Luc R AFFY 77 m variables n contraintes : z }| { A1.1 × Y1 +A2.1 × Y2 + . . . +Am.1 × Ym ≥ C1 (2) A1.2 × Y1 .. . +A2.2 × Y2 + . . . +Am.2 × Xm ≥ C2 (n) A1.n × Y1 +A2.n × Y2 + . . . +Am.b × Ym ≥ Cn +B2 × Y2 + . . . +Bm × Ym (1) Z ′ = B1 × Y1 Yi ≥ 0 ∀i Quelques remarques : – Le dual d’un problème de maximisation est un problème de minimisation (et réciproquement). – Le dual du dual est identique au primal – Il y a autant de variables dans le dual que de contraintes dans le primal. – Il y a autant de contraintes dans le dual que de variables dans le primal. – Le sens des inégalités dans le dual est l’inverse de celui du primal. – Les seconds membres des inégalités du primal deviennent les coefficients de la fonction économique Z’ du dual. – Les coefficient de la fonction économique du primal deviennent les seconds membres des inégalités du dual. – Les lignes de coefficients des contraintes du primal deviennent les colonnes des contraintes du dual (et réciproquement). – Les variables du primal et celles du dual doivent êtres positives ou nulles. Les deux problèmes ont aussi d’autres liaisons très intéressantes qui vont pouvoir être exploitées pour résoudre certains problèmes : – La valeur optimale Z de la fonction économique du primal est identique à la valeur optimale Z’ de la fonction économique du dual. – Lorsque le problème primal est résolu, l’opposé des valeurs marginales des «m» variables d’écart des équations du problème primal sont les valeurs des «m» variables de la solution du problème dual (et réciproquement). Imaginons que l’on doive résoudre un problème où il faut minimiser une fonction économique avec sur les variables (positives ou nulles) des contraintes «supérieures ou égales». En passant au problème dual on tombe sur un problème que le simplexe sait résoudre. Grâce à la solution du simplexe on connaît la valeur marginale des variables d’écart du problème dual, et donc on connaît la valeur des variables du problème primal. 9.3 Exemple de résolution par le problème dual Le directeur de l’atelier d’ébénisterie s’est rendu compte que sa production optimale n’utilisait que 7000 des 8000 stères de hêtre qu’on lui livrait chaque année. Il décide donc de renégocier son approvisionnement. Après un appel d’offre, il se retrouve avec la possibilité d’acheter son bois par lots. Il peut acheter deux types de lots. Le lot 1 est composé de 140 stères de hêtre et 20 stères de chêne. Le lot 2 est composé de 70 stères de hêtre et 30 stères de chêne. Les deux types de lots sont vendus à 10k euros l’unité. Sachant la production de cet atelier utilise 7000 stères de hêtre et 2000 stères de chêne, combien faut-il acheter de chaque lots pour obtenir un coût d’achat minimal ? La première étape est la modélisation du problème. Si on nomme L1 la variable pour le nombre de lots 1 et L2 celle pour les lots 2, la fonction économique à minimiser est Z = 10 × L1 + 10 × L2 (avec Z exprimé en «k euros»). 78 Eric L ALLET, Jean-Luc R AFFY Les contraintes de production imposent un minimum d’achats. On les modélise par : 140 × L1 + 70 × L2 ≥ 7000 (au moins 7000 stères de hêtre) 20 × L1 + 30 × L2 ≥ 2000 (au moins 2000 stères de chêne) Une fois les équations simplifiées, on obtient donc le problème suivant : Minimiser la fonction Z avec : Z= (Z ′ ) (1) (2) 2 ×L1 2 ×L1 10 ×L1 L1 ≥ 0 et +1 +3 +10 L2 ×L2 ×L2 ×L2 ≥0 ≥ ≥ 100 200 En passant sur le problème dual, on tombe sur un problème que le simplexe sait résoudre. Le problème dual s’exprime ainsi : Maximiser la fonction Z ′ avec (1) (2) 2 ×X1 1 ×X1 Z ′ = 100 ×X1 X1 ≥ 0 et X2 ≥ 0 +2 ×X2 +3 ×X2 +200 ×X2 ≤ ≤ 10 10 On obtient le tableau du simplexe suivant : E1 E2 ∆j X1 2 1 100 X2 2 3 200 E1 1 0 0 E2 0 1 0 Somme 10 10 0 Selon les critères de Dantzig la colonne du pivot est celle de X2 , et sa ligne celle E2 . – On passe donc X2 en base à la place de E2 . – On divises la ligne du pivot par 3. – On retire 2/3 de la ligne du pivot à celle de E1 . – On retire 200/3 de la ligne du pivot à celle des ∆j On obtient ce nouveau tableau : E1 X2 ∆j X1 4/3 1/3 100/3 X2 0 1 0 E1 1 0 0 E2 -2/3 1/3 -200/3 Somme 10/3 10/3 -2000/3 Cette fois ci le pivot est sur la colonne de X1 et la ligne de L1 . – E1 passe en base à la place de E1 . – La ligne du pivot est divisée par 4/3 (donc multipliée par 3/4) – On retire ((1/3)/(4/3)) = 1/4 de la ligne du pivot à celle de X2 . – On retire ((100/3)/(4/3)) = 25 fois la ligne du pivot à celle des ∆j On obtient ce nouveau tableau : X1 X2 ∆j X1 1 0 0 X2 0 1 0 E1 3/4 -1/4 -25 E2 -1/2 1/2 -50 Somme 5/2 5/2 -750 Il ne reste plus de ∆j strictement positif. L’algorithme du simplexe s’arrête ici. Les valeurs marginales (les ∆j ) des colonne de E1 et E2 sont les solutions de notre problème de départ. Il suffit de prendre l’opposé de leur valeur. L’atelier doit donc acheter 25 lot 1, et 50 lot 2. Ce qui lui coûtera 750k Euros. Eric L ALLET, Jean-Luc R AFFY 79 9.4 Exercices Exercice 9.1 (Achat d’électricité) Un revendeur d’électricité a promis à sa clientèle qu’au moins 25% de son électricité serait d’origine renouvelable. Il a calculé que pour l’année qui arrive il aura un marché de 18 TWh (térawattheure). Après un appel d’offre auprès de ses fournisseurs, il a reçu trois propositions pour répondre à ses besoin en électricité. Voici les quantités (en TWh), le taux d’électricité renouvelable et le prix (en millions d’euros/TWh) que peuvent lui fournir ces trois producteurs. Producteur 1 Producteur 2 Producteur 3 % d’électricité renouvelable 10 % 45 % 100 % Quantité d’électricité achetable (TWh) pas de limite 6 4 Prix (M Euro/TWh) 65 73 83 Chez quels producteurs et en quelle quantité ce revendeur doit-il acheter son électricité pour l’avoir à moindre prix ? Correction page 138. 80 Eric L ALLET, Jean-Luc R AFFY Chapitre 10 Simplexe : le cas général 10.1 Introduction On a vu que l’algorithme du simplexe était un algorithme itératif qui allait de solution admissible en solution admissible jusqu’à trouver une optimale. Mais pour que cet algorithme fonctionne il faut que la solution initiale (celle du premier tableau de l’algorithme) soit effectivement une solution admissible. Jusqu’à présent on est toujours parti de la solution «Xi = 0 ∀i». Mais il y a des cas où cette solution n’est pas dans le domaine admissible. Dans cette situation il faut changer le point de départ de l’algorithme du simplexe. Cette situation se produit si la formalisation du problème contient un mélange d’inégalités de type «≤» et de type «≥». Ou plus exactement, si la forme canonique du problème de maximalisation (la forme avec que des inégalités de type «≤») contient des seconds membres (les Bi ) strictement négatifs. 10.2 Exemple Prenons un exemple pour illustrer cette situation et décrire la méthode à suivre dans ce cas. Un revendeur de café propose de vendre son stock sous la forme de dosettes expresso prête à l’usage. A la base il possède deux types de café brut : 40 tonnes d’arabica et 20 tonnes de robusta. Il sait produire deux types de dosettes : – la première 100% arabica utilise 10 grammes du café arabica brut et dégage une marge de 1,2 centime d’euro par dosette vendue. – la seconde 50% arabica, 50% robusta utilise 5 gramme de chaque café et dégage une marge de 1 centime d’euro par dosette vendue. Une chaîne de cafétérias est prête à lui acheter sa production mais à deux conditions : il doit lui fournir au moins 5 millions dosettes dont au moins 2,5 millions arabica pur. Ce revendeur peut-il répondre à cette demande, et si oui quelle production lui donnera une marge maximale ? 10.3 La forme canonique La première étape reste celle que l’on a faite jusqu’à présent : formaliser le problème pour arriver à sa forme canonique. Le but est d’optimiser la marge. Celle-ci s’exprime en fonction des dosettes 100% arabica (D1 ) et des dosettes 50% arabica 50% robusta (D2 ) : Z = 1.2 × D1 + D2 avec Z exprimé en centime d’euro. – Le revendeur dispose de 20 tonnes de robusta. Chaque dosette D2 en consomme 5g, donc : 5 × D2 ≤ 20000000 – Le revendeur dispose de 40 tonnes d’arabica. Une dosette D1 en consonne 10g et une dosette D2 5g, donc 10 × D1 + 5 × D2 ≤ 40000000. – Le revendeur doit fournir au moins 5 millions dosettes : D1 + D2 ≥ 5000000. Eric L ALLET, Jean-Luc R AFFY 81 – Le revendeur doit fournir au moins 2,5 millions dosettes arabica : D1 ≥ 2500000. En changeant les unités pour que D1 et D2 soient en «million de dosettes» et pour que Z soit exprimé en «k euro», on obtient : Maximiser la fonction Z avec Mis sous la forme canonique : D2 ≤ 4 2 × D1 + D2 ≤ 8 D1 + D2 ≥ 5 D 1 ≥ 2.5 Z = 12 × D1 + 10 × D2 D1 ≥ 0 et D2 ≥ 0 Maximiser la fonction Z avec D2 ≤ 4 2 × D1 + D2 ≤ 8 −D1 − D2 ≤ −5 −D1 ≤ −2.5 Z = 12 × D1 + 10 × D2 D1 ≥ 0 et D2 ≥ 0 On a deux inégalités avec un second membre strictement négatif. On est donc bien dans un cas où la solution D1 = 0 et D2 = 0 n’est pas dans le domaine admissible. Il va falloir trouver un autre point de départ. 10.4 La méthode par l’exemple Étape 1 : mise sous la forme standard. La première étape consiste à passer le problème sous sa forme standard. On a joute donc 4 variables d’écart (Ei ) et on obtient : Avec Dj ≥ 0 ∀j et Ei ≥ 0 ∀i, trouver le maximum de Z pour : D2 + E1 = 4 2 × D1 + D2 + E2 = 8 −D1 − D2 + E3 = −5 −D1 + E4 = −2.5 Z = 12 × D1 + 10 × D2 On transforme les équations pour que tous les seconds membres soient positifs ou nuls : Avec Dj ≥ 0 ∀j et Ei ≥ 0 ∀i, trouver le maximum de Z pour : (1) D2 + E1 = 4 (2) 2 × D1 + D2 + E2 = 8 (3) D1 + D2 − E3 = 5 (4) D1 − E4 = 2.5 Z = 12 × D1 + 10 × D2 Dans cette expression, ce sont donc les contraintes (3) et (4) qui posent problème. En effet si on débute avec D1 = 0 et D2 = 0 il n’est pas possible de garder E3 et E4 positifs conformément aux hypothèses. 82 Eric L ALLET, Jean-Luc R AFFY Étape 2 : ajout de variables artificielles. Pour rendre ce point de départ possible, on va ajouter une nouvelle variable artificielle pour chacune des contraintes problématiques. Soit X1 et X2 avec X1 ≥ 0 et X2 ≥ 0. Et on transforme les deux contraintes problématiques de cette façon : (3) devient D1 + D2 + X1 − E3 = 5 (4) devient D1 + X2 − E4 = 2.5 Maintenant il va falloir tout faire pour que notre recherche de solution annule ces deux variables artificielles. Comme le simplexe tend à trouver le maximum de Z, on va faire en sorte que cette recherche pousse à annuler ces deux variables. Pour cela on va changer le Z à maximaliser en ajoutant X1 et X2 dans son expression. Le nouveau Z devient : Z = 12 × D1 + 10 × D2 − k × X1 − k × X2 Et on dit juste que k est une constante positive très grande. Donc la première chose à faire pour maximiser Z sera d’annuler X1 et X2 . Si à la fin de l’algorithme du simplexe on n’y arrive pas, cela signifiera que les contraintes du problème étaient contradictoires et qu’il n’y avait pas de solution. Maintenant le problème s’exprime ainsi : Avec D1 ≥ 0, D2 ≥ 0, X1 ≥ 0, X2 ≥ 0 et Ei ≥ 0∀i trouver le maximum de Z pour : (1) D2 + E1 = 4 (2) 2 × D1 + D2 + E2 = 8 (3) D1 + D2 + X1 − E3 = 5 (4) D1 + X2 − E4 = 2.5 Z = 12 × D1 + 10 × D2 − k × X1 − k × X2 Étape 3 : calcul de la solution admissible de départ. Grâce à l’ajout des variables artificielles on peut à nouveau construire une solution admissible évidente : on fixe toujours D1 et D2 à zéro et on fixe aussi les variables d’écarts des contraintes problématiques (E3 et E4 ) à zéro. – La contrainte (1) donne E1 = 4 – La contrainte (2) donne E2 = 8 – La contrainte (3) donne X1 = 5 – La contrainte (4) donne X2 = 2.5 Les quatre variables non nulles de notre solution admissible de départ sont donc E1 , E2 , X1 , X2 . Ce seront donc les quatre variables en base sur le premier tableau du simplexe. Il faut aussi réussir à exprimer la valeur des coûts (ou gains) marginaux des diverses variables pour notre point de départ. Il faut pour cela faire disparaître de l’expression de Z les variables en base. – X1 est en base, et la contrainte (3) permet de dire : X1 = 5 − D1 − D2 + E3 – X2 est en base, et la contrainte (4) permet de dire : X2 = 2.5 − D1 + E4 Donc Z = 12 × D1 + 10 × D2 − k × (5 − D1 − D2 + E3 ) −k × (2.5 − ×D1 + E4 ). | {z } {z } | X1 X2 Z = (12 + 2k) × D1 + (10 + k) × D2 − k × E3 − k × E4 − 7.5k. En résumé : Avec D1 ≥ 0, D2 ≥ 0, X1 ≥ 0, X2 ≥ 0 et Ei ≥ 0∀i il faut trouver le maximum de Z pour : (1) D2 + E1 = 4 (2) 2 × D1 + D2 + E2 = 8 (3) D1 + D2 + X1 − E3 = 5 (4) D1 + X2 − E4 = 2.5 (12 + 2k) × D1 + (10 + k) × D2 − k × E3 − k × E4 = Z + 7.5k Avec pour solution admissible de départ : E1 = 4, E2 = 8, X1 = 5, X2 = 2.5 et donc Z = −7.5k Eric L ALLET, Jean-Luc R AFFY 83 Étape 4 : le simplexe. On a tout ce qu’il faut pour commencer le simplexe1 : D1 0 2 1 1 12+2k E1 E2 X1 X2 ∆j D2 1 1 1 0 10+k X1 0 0 1 0 0 X2 0 0 0 1 0 E1 1 0 0 0 0 E2 0 1 0 0 0 E3 0 0 -1 0 -k E4 0 0 0 -1 -k Somme 4 8 5 2.5 7.5k k est une constante positive «très grande» donc le premier pivot est sur la colonne D1 . La ligne du pivot est sur la ligne de X2 . D1 0 0 0 1 0 E1 E2 X1 D1 ∆j D2 1 1 1 0 10+k X1 0 0 1 0 0 X2 0 -2 -1 1 -12-2k E1 1 0 0 0 0 E2 0 1 0 0 0 E3 0 0 -1 0 -k E4 0 2 1 -1 12+k E3 1 1 -1 0 10 E4 -1 1 1 -1 2 Somme 4 3 2.5 2.5 -30+2.5k Le second pivot est sur la colonne de D2 et la ligne de X1 . E1 E2 D2 D1 ∆j D1 0 0 0 1 0 D2 0 0 1 0 0 X1 -1 -1 1 0 -10-k X2 1 -1 -1 1 -2-k E1 1 0 0 0 0 E2 0 1 0 0 0 Somme 1.5 0.5 2.5 2.5 -55 Le troisième pivot est sur la colonne de E3 et la ligne de E2 . E1 E3 D2 D1 ∆j D1 0 0 0 1 0 D2 0 0 1 0 0 X1 0 -1 0 0 -k X2 2 -1 -2 1 8-k E1 1 0 0 0 0 E2 -1 1 1 0 -10 E3 0 1 0 0 0 E4 -2 1 2 -1 -8 Somme 1 0.5 3 2.5 -60 L’algorithme s’arrête là. On a réussi à faire sortir de la base les variables artificielles X1 et X2 , il y avait donc une solution possible. Cette solution est D1 = 2.5, D2 = 3, et Z = 60. Donc pour optimiser sa marge le revendeur devra produire 2,5 millions de dosettes 100% arabica, 3 millions de dosettes 50% arabica 50% robusta, et sa marge sera de 60 000 euros. 10.5 Exercices Exercice 10.1 (Noix et cacahouètes) Un traiteur doit renouveler ses stocks de noix de pécan et noix de cajou. Il a besoin de 25 tonnes de noix de pécan et de 6 tonnes de noix cajou. Il fait un appel d’offre et deux types de lots retiennent son attention : – Un fournisseur lui propose des «lots 1» composés de 5kg de noix de pécan et 2kg de noix de cajou au prix unitaire de 110 euros. 1 Noter que dans la forme standard exprimée au dessus le Z + 7.5k a été volontaire mis dans le membre de droite pour bien montrer qu’ici la colonne «Somme» du ∆j ne débute pas avec 0, mais avec 7.5k, la valeur opposée de Z pour la solution initiale. 84 Eric L ALLET, Jean-Luc R AFFY – Un autre fournisseur lui propose des «lots 2» composés de 15kg de noix de pécan, 2kg de noix de cajou et 30 kg de cacahouètes au prix unitaire de 224 euros. Par contre il ne peut fournir que 2000 lots. Le traiteur n’a actuellement pas besoin de cacahouètes. Mais il peut éventuellement écouler les cacahouètes obtenues avec les lots 2 : un confrère est prêt à lui racheter des lots composés de 5kg de noix de pécan et 20kg de cacahouètes au prix unitaire de 60 euros. Combien de lots le traiteur doit-il acheter et revendre pour renouveler ses stocks à prix minimum. Correction page 139 Eric L ALLET, Jean-Luc R AFFY 85 86 Eric L ALLET, Jean-Luc R AFFY Chapitre 11 Programmation linéaire en nombres entiers 11.1 Introduction Jusqu’à présent on a oublié de considérer un problème important : le simplexe ne travaille pas avec des nombres entiers. Les solutions que l’on parcourt sont des points à des intersections de droites (plans, etc. . . ) et dans le cas de problèmes réels il y a fort peu de chance d’obtenir des nombres entiers. Lorsque les variables représentent des éléments fractionnables (des litres de pétrole, des tonnes de blé, des kilowattheures, . . . ) cela ne pose aucun problème. Mais dans le cas contraire (des passagers transportés, des meubles vendus, . . . ) il n’est pas possible de donner une solution non entière. Arrondir les chiffres de la solution fractionnaire pour obtenir une solution entière n’est pas une bonne méthode : d’une part il n’est pas sûr que cette solution soit encore dans le domaine admissible, et d’autre part il se peut que la solution entière optimale soit très loin de la solution fractionnaire optimale. Pour les problèmes en nombres entiers, il n’existe pas d’algorithme simple1 qui trouve à coup sûr la solution optimale. Il existe juste des algorithmes qui pour un nombre d’itérations acceptable, ont beaucoup de chances de la donner et qui en tout cas donne une solution proche de l’optimale. Nous allons voir l’un d’entre eux. 11.2 Exemple Prenons un exemple pour illustrer ce problème. Un constructeur immobilier a trouvé le terrain pour bâtir 10 petits immeubles. Il construit ses immeubles selon trois plans standards qui offrent trois types d’appartements différents allant du F1 au F3. Voici un tableau donnant le nombre d’appartements suivant le modèle d’immeuble : Modèle 1 Modèle 2 Modèle 3 Appartements F3 3 1 2 Appartements F2 3 6 1 Appartements F1 5 5 12 Quelque soit le modèle d’immeuble il fait une marge de 15k euros sur les F1, 50k euros sur les F2 et 80k euros sur les F3. Il a sur son carnet de commandes des demandes pour 24 F3, 35 F2 et 150 F1. Combien doit-il construire de chacun des modèles pour optimiser sa marge ? Si on résout ce problème avec un simplexe classique, la solution optimale loge 58 demandeurs de F1 et tous les demandeurs de F2 et de F3. Elle dit de construire 45/7 du modèle 1, 17/7 du modèle 2 et 8/7 du modèle 3. Elle dégage une marge de 4,540 millions d’euros. 1 au sens de la complexité. Donc qui se termine dans un temps «acceptable». Eric L ALLET, Jean-Luc R AFFY 87 Mais évidement, les immeubles ne se construisent pas par 1/7. Il faut donc trouver une solution en nombres entiers. 11.3 La méthode par l’exemple La méthode débute comme un simplexe classique : il faut modéliser pour trouver le premier tableau du simplexe et son premier pivot. On commence par modéliser notre problème sous sa forme canonique. – Un immeuble de modèle 1 permet de dégager une marge de 3 × 80 + 3 × 50 + 5 × 15 = 465 k euros. – Un immeuble de modèle 2 permet de dégager une marge de 1 × 80 + 6 × 50 + 5 × 15 = 455 k euros. – Un immeuble de modèle 3 permet de dégager une marge de 2 × 80 + 1 × 50 + 12 × 15 = 390 k euros. Donc si M1 , M2 , et M3 sont les variables qui représentent le nombre d’immeubles de modèle 1, 2 et 3, la fonction économique Z à maximiser est : Z = 465 × M1 + 455 × M2 + 390 × M3 . – (1) : M1 ≥ 0, M2 ≥ 0, M3 ≥ 0. – (2) : Il y a 24 commandes de F3, donc 3 × M1 + M2 + 2 × M3 ≤ 24 – (3) : Il y a 35 commandes de F2, donc 3 × M1 + 6 × M2 + M3 ≤ 35 – (4) : Il y 150 commandes de F1, donc 5 × M1 + 5 × M2 + 12 × M3 ≤ 150. – Il y a assez de commandes pour remplir 10 immeubles (les commandes permettent au moins de remplir 10 immeubles de modèle 3), donc on est sûr de bâtir les 10 immeubles : M1 + M2 + M3 = 10 On utilise la dernière égalité pour faire disparaître une des variables du problème : M3 = 10−M1 −M2 . Donc en reportant cette information dans les autres équations on obtient la forme canonique suivante : Maximiser Z avec : (1) (2) (3) (4) M1 ≥ 0 M2 ≥ 0 M1 + M2 ≤ 10 (M3 ≥ 0) M1 − M2 ≤ 4 2 × M1 + 5 × M2 ≤ 25 −7 × M1 − 7 × M2 ≤ 30 Z = 75 × M1 + 65 × M2 + 3900 (1) (2) (3) M1 ≥ 0 M2 ≥ 0 M1 + M2 ≤ 10 (M3 ≥ 0) M1 − M2 ≤ 4 2 × M1 + 5 × M2 ≤ 25 Z = 75 × M1 + 65 × M2 + 3900 Comme M1 et M2 sont positifs, la contrainte (4) est toujours vraie. On peut la retirer du modèle sans perdre d’information. On obtient la forme standard suivante : Maximiser Z avec : Notez que pour la solution initiale M1 = 0 et M2 = 0, Z vaut 3900. On en tient compte pour initialiser la case «Res» dans le premier tableau du simplexe qui suit : E1 E2 E3 ∆j M1 1 1 2 75 M2 1 -1 5 65 E1 1 0 0 0 E2 0 1 0 0 E3 0 0 1 0 Somme 10 4 25 -3900 C’est à partir de cette étape que la méthode du simplexe est modifiée. Pour obtenir une solution entière, on va réduire le domaine des solutions admissibles en lui retirant à chaque itération un petit morceau dans lequel on est sûr qu’il n’existe aucune solution entière. Réduction après réduction, l’algorithme va réussir à faire coïncider l’optimum obtenu par le simplexe avec une solution entière. 88 Eric L ALLET, Jean-Luc R AFFY À chaque itération du simplexe deux cas peuvent se produire : – Le pivot vaut 1 : on ne peut pas réduire le domaine de solution sans perdre de solutions entières. On procède alors avec la méthode habituelle du simplexe. Et on est sûr que les valeurs du tableau vont rester entières. – Le pivot ne vaut pas 1 : on va réduire le domaine de solution en effectuant une troncature. Cette troncature va consister à ajouter une contrainte supplémentaire qui va éliminer un morceau du domaine admissible, mais en s’assurant qu’aucune solution entière ne sera dans la partie rejetée. Cette troncature va aussi assurer que la nouvelle solution admissible obtenue après cette itération sera toujours entière. La méthode pour effectuer la troncature passe par 4 étapes : – Étape 1 : réécrire l’inégalité correspondant à la ligne du pivot : Cela consiste à retirer de la ligne le coefficient de la colonne correspondant à sa variable en base et rétablir l’inégalité. Prenons le cas d’un pivot (p = ai,j ) sur la colonne d’une variable hors base Xj , et sur la ligne d’une variable en base Vi . X ... X X= X1 . . . Xj ... Somme Xk XV n Xi .. . 0 Vi ai,1 . . . p=ai,j . . . . . . ai,n Bi A1 .. . 0 L’inégalité correspondante est donc : ai,1 × X1 + . . . + ai,j × Xj + . . . + ai,k−1 × Xk−1 + ai,k+1 × Xk+1 + . . . + ai,n × Xn ≤ Bi – Étape 2 : faire la troncature de cette inégalité : Pour cela il faut diviser cette inégalité par le pivot et ne garder que les parties entières des coefficients. La partie entière d’une valeur M sera notée [M ] et si n ≤ M < n + 1 avec n ∈ Z alors [M ] = n. ai,1 ai,j ai,n Bi × X1 + . . . + × Xj + . . . + × Xn ≤ ai,j ai,j ai,j ai,j h i a Notez que ai,j = 1. i,j – Étape 3 : créer une nouvelle variable d’écart (T ) : On ajoute une nouvelle variable d’écart T ≥ 0 telle que : ai,1 ai,j ai,n Bi × X1 + . . . + × Xj + . . . + × Xn + T = ai,j ai,j ai,j ai,j Cette variable d’écart permet d’ajouter cette nouvelle égalité au tableau du simplexe. Ce tableau est ainsi agrandi d’une ligne pour cette égalité, et d’une colonne pour la nouvelle variable d’écart (T ). Il devient : X1 ... Xj . . . Xk = Vi . . . Xn T Somme V1 a1,1 ... a1,j . . . 0 ... a1,n 0 B1 .. .. . . Vi ai,1 ... ai,j ... 1 ... ai,n 0 Bi .. .. . . Vm T ∆j am,1 [ai,1 /ai,j ] C1 ... ... ... am,j 1 Cj ... ... ... 0 0 0 ... ... ... am,n [ai,n /ai,j ] Cn Eric L ALLET, Jean-Luc R AFFY 0 1 0 Bm [Bi /ai,j ] Res 89 – Étape 4 : pivoter sur ce nouveau pivot On pivote sur la ligne de T et la colonne j. Donc la variable Xj passe en base à la place de T . La nouvelle égalité introduite dans la tableau du simplexe par la troncature est une nouvelle contrainte qui réduit le domaine des solutions admissibles. Mais la méthode assure que la partie «perdue» par ce découpage ne contenait aucune solution entière. Itération après itération, et donc découpage après découpage, l’algorithme va faire coïncider l’optimum du nouveau domaine admissible avec une solution entière. Revenons à notre exemple. La tableau du simplexe obtenu était le suivant : M1 1 1 2 75 E1 E2 E3 ∆j M2 1 -1 5 65 E1 1 0 0 0 E2 0 1 0 0 E3 0 0 1 0 Somme 10 4 25 -3900 Le premier pivot est sur la colonne de M1 et la ligne de E2 . Comme il vaut 1, on procède à une itération normale du simplexe : M1 0 1 0 0 E1 M1 E3 ∆j M2 2 -1 7 140 E1 1 0 0 0 E2 -1 1 -2 -75 E3 0 0 1 0 Somme 6 4 17 -4200 Regardons l’interprétation géométrique de cette première itération. Le simplexe est parti de la solution admissible (mais pas optimale !) S0 de départ où M1 = 0 et M2 = 0. Le premier critère de Dantzig a sélectionné la variable qui fait augmenter le plus vite la fonction économique (M1 : chaque unité de M1 en plus augmente de 75 la valeur de Z). Ensuite on a augmenté du maximum possible cette variable tout en restant dans le domaine admissible. Donc M1 est passé à 4 (etM2 est toujours à 0). Cela donne une nouvelle solution admissible au problème (S1). Elle n’est toujours pas optimale, mais elle est meilleur que la solution S0 de départ. Pour la seconde itération le nouveau pivot (colonne M2 , ligne E3 ) vaut 7. Il faut faire une troncature. 1. Retour à l’inégalité : On réécrit l’inégalité correspondant à la ligne de E3 (la ligne du pivot). E3 M1 0 M2 7 E1 0 E2 -2 Z E 3 Z 1A Somme 17 On obtient : 7 × M2 − 2 × E2 ≤ 17 2. Troncature de l’inégalité : On divise par le pivot et on garde les parties entières. 7 −2 17 × M2 + × E2 ≤ 7 7 7 90 Eric L ALLET, Jean-Luc R AFFY On obtient2 : M2 − E2 ≤ 2 3. Ajout d’une variable d’écart : On crée une variable d’écart T1 ≥ 0 telle que : M2 − E2 + T1 = 2. On ajoute cette nouvelle égalité dans le tableau du simplexe : E1 M1 E3 T1 ∆j M1 0 1 0 0 0 M2 2 -1 7 1 140 E1 1 0 0 0 0 E2 -1 1 -2 -1 -75 E3 0 0 1 0 0 T1 0 0 0 1 0 Somme 6 4 17 2 -4200 4. Pivotement sur cette nouvelle ligne : On pivote sur ce nouveau pivot (celui de la ligne T1 , colonne M2 ) : E1 M1 E3 M2 ∆j M1 0 1 0 0 0 M2 0 0 0 1 0 E1 1 0 0 0 0 E2 1 0 5 -1 65 E3 0 0 1 0 0 T1 -2 1 -7 1 -140 Somme 2 6 3 2 -4480 Regardons l’interprétation géométrique de cette seconde itération. Pour cette itération le premier critère de Dantzig a sélectionné la colonne de la variable M2 . Mais si on avait appliqué l’algorithme classique du simplexe, la nouvelle solution trouvée n’aurait pas été entière. On a donc fait une troncature. Celle-ci s’est traduite par l’inégalité M2 − E2 ≤ 2. La variable E2 est la variable d’écart que l’on avait introduite pour l’équation (2) de la forme standard du problème : M1 − M2 + E2 = 4. Donc E2 = 4 − M1 + M2 . Ainsi l’expression de la troncature en fonction des variables M1 et M2 dit : M1 ≤ 6. Grâce à cette troncature la nouvelle solution (S2) tombe sur une solution entière : M1 = 6 et M2 = 2. Par contre, même en tenant compte de la réduction du domaine des solutions admissibles, la solution S2 n’est toujours pas la solution optimale de ce domaine. Passons à la troisième itération : Il reste des ∆j strictement positifs. On peut encore essayer d’augmenter Z. Le pivot est sur la colonne de E2 et la ligne de E3 . Il vaut 5, il faut faire une troncature. 1. On revient à l’inégalité correspondant à la ligne du pivot : E3 M1 0 M2 0 E1 0 E2 5 Z E 3 Z A1 T1 -7 Somme 3 On obtient : 5 × E2 − 7 × T1 ≤ 3 2. On divise par le pivot et on garde les parties entières : 5 −7 3 × E2 + × T1 ≤ 5 5 5 2 Attention aux parties entières des nombres négatifs : ˆ −2 ˜ 7 = −1 et non pas 0 ! Eric L ALLET, Jean-Luc R AFFY 91 On obtient3 : E2 − 2 × T1 ≤ 0 3. On crée une variable d’écart T2 et on ajoute cette nouvelle inégalité dans le tableau du simplexe : E1 M1 E3 M2 T2 ∆j M1 0 1 0 0 0 0 M2 0 0 0 1 0 0 E1 1 0 0 0 0 0 E2 1 0 5 -1 1 65 E3 0 0 1 0 0 0 T1 -2 1 -7 1 -2 -140 T2 0 0 0 0 1 0 Somme 2 6 3 2 0 -4480 T2 -1 0 -5 1 1 -65 Somme 2 6 3 2 0 -4480 4. On pivote sur ce nouveau pivot (celui de la ligne T2 , colonne E2 ). E1 M1 E3 M2 E2 ∆j M1 0 1 0 0 0 0 M2 0 0 0 1 0 0 E1 1 0 0 0 0 0 E2 0 0 0 0 1 0 E3 0 0 1 0 0 0 T1 0 1 3 -1 -2 -10 Regardons l’interprétation géométrique de cette troisième itération. La variable d’écart E2 passe en base lors de cette nouvelle itération. Les valeurs de M1 , M2 et donc de Z restent inchangée. Par contre, cette étape ajoute une nouvelle troncature :E2 − 2 × T1 ≤ 0. T1 est la variable d’écart introduite pour que M2 −E2 +T1 = 2, on a 2×M2 −E2 ≤ 4. De plus E2 = 4 − M1 + M2 . Ainsi la contrainte exprimée avec les variables M1 et M2 devient M1 + M2 ≤ 8. On reporte cette contrainte sur la représentation géométrique. On constate alors que la solution optimale du nouveau domaine admissible coïncide avec la solution entière découverte à l’étape précédente. Donc cette itération a permis de prouver grâce à une troncature supplémentaire (qui à chaque fois n’élimine aucune solution entière) que la solution S2 était la solution entière optimale. Voila pourquoi, après cette itération, tous les ∆j sont négatifs ou nuls. On a donc obtenu la preuve que la solution entière optimale était : M1 = 6, M2 = 2 et M3 = 10 − M1 − M2 = 2. Enfin Z = 4480. Donc le constructeur doit construire 6 immeubles du modèle 1, et 2 des modèles 2 et 3. Il aura une marge de 4,48 millions d’euros. Comme pour la solution optimale en nombre fractionnaire les 24 commandes de F3 sont satisfaites, par contre 3 commandes de F2 ne le sont plus. En contrepartie 6 commandes F1 supplémentaires sont réalisées. 11.4 Conclusion L’exemple de la section précédente a été spécialement construit pour obtenir une convergence très rapide. Avec des cas réels, la plupart du temps la solution entière proposée converge très vite vers la solution entière optimale. Par contre le nombre de troncatures qu’il faut faire pour prouver que c’est bien la solution optimale peut être beaucoup plus élevé. En fait même si ces modèles ne correspondent généralement pas à ceux obtenus pour des problèmes économiques réels, il est possible de concevoir des cas où la convergence ne se fera pas. On aura très probablement trouvé la bonne solution, mais on ne pourra pas le prouver. 3 Attention 92 ˆ −7 ˜ 5 vaut -2 et non pas -1 ! Eric L ALLET, Jean-Luc R AFFY Malheureusement les problèmes de programmation linéaire en nombre entier étant très complexe, il n’existe aucun algorithme qui permettra dans tous les cas d’obtenir avec un nombre raisonnable d’itérations la bonne solution et la preuve qu’elle est bien la bonne solution. Cependant, l’algorithme de la section précédente a un grand avantage. À toutes les étapes il propose une solution entière admissible. Celle-ci ne peut que progresser vers son optimum. Et si la solution ne progresse plus, mais que l’algorithme ne se termine pas pour autant, il est tout à fait possible de l’arrêter et d’accepter la solution courante. Il est fort probable qu’elle soit la solution optimale même si on n’en a pas la preuve. 11.5 Exercices Exercice 11.1 (Meubles de rangement) Un client d’un magasin obtient régulièrement des points cadeaux. Il peut les échanger contre divers cadeaux. Il vient de s’apercevoir qu’il avait 59 points cadeaux qui arrivaient à échéance. Il doit les échanger rapidement, ou les perdre. En consultant la liste des cadeaux accessibles pour ce nombre de points il n’en trouve que deux qui l’intéressent : – Contre 10 points, il peut obtenir un petit meuble rectangulaire qui permet de ranger 10 CD. – Contre 12 points, il peut obtenir un petit meuble en forme de tour qui permet de ranger 11 CD. Comme ces meubles ont été conçus pour s’emboîter les uns avec les autres, il peut en prendre plusieurs pour en composer un qui lui permettra de ranger ces CD. Comment doit-il faire l’échange pour obtenir le plus de rangements possible ? Correction page 142. Eric L ALLET, Jean-Luc R AFFY 93 94 Eric L ALLET, Jean-Luc R AFFY Troisième partie Modélisation Eric L ALLET, Jean-Luc R AFFY 95 Chapitre 12 Modélisation 12.1 Chemin de la question à la réponse D’une manière générale, les problèmes auxquels on est confronté dans le monde réel sont d’une complexité telle qu’il est difficile, voire impossible, de les résoudre directement On dispose également d’une masse d’informations dont certaines ne sont pas utiles à la résolution du problème considéré. C’est pour cette raison que l’on passe par une phase de modélisation. Un modèle est UNE représentation simplifiée du monde réel, pertinente au regard du problème à résoudre. Il doit inclure toutes les informations utiles mais uniquement celles-ci. Le choix du modèle dépend donc directement du type de problème à résoudre mais aussi de la technique de résolution que l’on a choisie. Des simplifications peuvent être éventuellement effectuées sur le modèle de façon à réduire le nombre d’itérations de l’algorithme. La solution du problème trouvée, il faut revenir à la réalité pour apporter la réponse à la question initiale. F IG . 12.1 – Modélisation et résolution d’un problème La principale difficulté est dans l’étape de modélisation. On vient cependant de voir des techniques permettant de répondre à certaines questions. – Ordonner, planifier des tâches : Gantt et potentiel-tâches. – Construire un réseau à moindre coût : Arbre de recouvrement minimal. – Minimiser un stock, un coût, une tournée,. . . : le plus court chemin. – Maximaliser un flot, une production, un transport, . . . : le flot max. Eric L ALLET, Jean-Luc R AFFY 97 – Maximaliser un flot, une production, un transport à moindre coût : le flot max coût min. – Optimiser un problème à multiples variables et multiples contraintes : programmation linéaire Mais il faut aussi savoir les utiliser dans des cas moins attendus : – Le chemin critique du potentiel-tâche est en fait une recherche du plus long chemin. Donc cette technique peut servir aussi à maximaliser un gain, ou tout autre chose. – Les marges totales d’un potentiel-tâche peuvent être vu comme du «temps disponibles» dans un emploi du temps. On peut s’en servir pour synchroniser des plannings pour trouver une date de réunion sur des emplois du temps a priori déjà plein. – Le flot max à coût min peut être décliné de bien des façons. On peut essayer d’obtenir le maximum de choses (objets, services, . . . ) pour un coût donné. Il suffit de décider d’arrêter l’algorithme quand on atteint le coût fixé plutôt que de l’arrêter quand on atteint le flot maximum. On peut aussi s’en servir pour connaître le coût minimum pour tout flot inférieur au maximum. – ... 12.2 Les erreurs à ne pas faire Il est bien d’apprendre de ses erreurs. Mais parfois ces erreurs se payent un peu cher. Alors autant apprendre des erreurs des autres. Dans cette section vous allez trouver une collection d’erreurs trouvées dans diverses copies lors des contrôles. Essayez de bien comprendre quelle erreur a été faite, et ne la faites pas vous même à l’avenir. Erreur 12.1 (Diagramme de GANTT) Utiliser un diagramme de GANTT pour trouver le chemin critique et les marges totales des tâches. Le diagramme de GANTT est parfait pour calculer la durée d’un projet et donner un planning facilement lisible à une équipe. Mais il n’est pas adapté à la recherche du chemin critique. Pour ce genre de recherche il faudra par exemple utiliser un potentiel-tâches. Erreur 12.2 (Potentiel-tâches) Placer sur le graphe d’un potentiel-tâches, la durée des tâches sur les arcs entrants. Sur le graphe d’un potentiel-tâches la durée des tâches se place sur les arcs qui partent de la tâche, et non pas sur ceux qui y arrivent. Le graphe erroné pourra éventuellement vous donner la durée du projet, mais par contre les dates au plus tôt et les dates au plus tard seront toutes fausses. Ainsi, de par leur construction les arcs qui partent du sommet α ajouté à la source du graphe doivent obligatoirement être valués avec une durée nulle (voir figure 12.2). Erreur 12.3 (Potentiel-tâches) Placer des valeurs différentes sur deux arcs partants d’un même sommet (c’est à dire d’une même tâche). L’arc qui part d’un sommet est valué par la durée de la tâche qui est modélisée par ce sommet. Une tâche ne peut pas avoir plusieurs durées. Donc obligatoirement, tous les arcs qui partent d’un sommet reçoivent la même valeur. F IG . 12.2 – Sur un potentiel-tâches, la durée des tâches se place sur les arcs SORTANT des sommets 98 Eric L ALLET, Jean-Luc R AFFY Erreur 12.4 (Graphes avec arcs valués) Mettre la valeur (capacité, longueur, coût, durée) sur les sommets. Les valeurs des graphes valués vus dans ce cours (potentiel-tâches, plus court chemin, flot max, flot-max coût-min. . . ) se placent sur les arcs et non pas sur les sommets. Même pour le potentiel-tâches, les valeurs que l’on place lorsqu’on déroule l’algorithme directement sur le graphe sont les résultats de l’algorithme et non pas les valeurs obtenues lors de la modélisation. Pour tous ces graphes, si dans votre modélisation une valeur est apparue sur un sommet, c’est qu’il y a une erreur. Généralement vous avez tout simplement oublié des arcs dans votre modèle. Erreur 12.5 (Modélisation et simplifications) Simplifier votre modèle avant d’avoir fini la modélisation. Il faut éviter de simplifier votre modèle trop tôt. Même si des arcs ou des contraintes sont visiblement inutiles, gardez les dans votre modèle s’ils en font vraiment partie. Ensuite une fois la modélisation finie, avant de mettre la technique en œuvre, simplifier ce qui peut l’être. Les arcs ou les contraintes a priori inutiles peuvent devenir nécessaires après le changement de la valeur d’un simple paramètre de votre problème. Ils peuvent aussi être très utiles pour donner une interprétation complète et correcte de votre solution. Prenons un exemple pour illustrer cette démarche. Imaginons un problème de programmation linéaire où il faut trouver le maximum de Z avec le modèle suivant : (1)X1 + X2 ≤ C1 (2)X1 + X2 ≤ C2 (Modèle 1) (3)X1 ≤ C3 Z = 2 × X1 + X2 M1 ≥ 0 et M2 ≥ 0 Si C1 ≤ C2 on peut faire disparaître l’inégalité (2) pour obtenir le modèle : (1)X1 + X2 ≤ C1 (3)X1 ≤ C3 (Modèle 2) Z = 2 × X1 + X2 M1 ≥ 0 et M2 ≥ 0 Et par contre si C2 ≤ C1 on peut faire disparaître l’inégalité (1) pour obtenir le modèle : (2)X1 + X2 ≤ C2 (3)X1 ≤ C3 (Modèle 3) Z = 2 × X1 + X2 M1 ≥ 0 et M2 ≥ 0 Lors de votre modélisation vous serez forcement dans l’un des deux cas. Donc vous serez fortement tenté de faire disparaître de votre modèle l’inégalité inutile. Il est vrai que si votre problème est bien fixe et que les paramètres ne risquent pas de changer, le modèle simplifié fera très bien l’affaire. Mais imaginons qu’immédiatement après ce premier problème, vous rencontrez le même avec juste des paramètres qui changent (par exemple de C1 ≤ C2 on est passé à C2 ≤ C1 ). Si vous avez modélisé avec le modèle complet (modèle 1), votre modélisation reste exacte, vous avez juste à procéder à la bonne simplification avant d’utiliser la technique de résolution (par exemple un simplexe). Si vous avez d’office utilisé un modèle simplifié, il ne correspond plus au nouveau problème et vous devez refaire une nouvelle modélisation. Erreur 12.6 (Simplexe) Utiliser le simplexe pour ensuite refaire les calculs à la main. Le simplexe est un algorithme très complet. Il ne se contente pas de trouver la valeur des variables de votre problème, il calcule aussi celles de la fonction économique, des variables d’écarts, des valeurs marginales. Alors évitez d’utiliser le simplexe en ne calculant que la valeur des variables en base pour ensuite faire le calcul à la main pour trouver la valeur de la fonction économique. Par contre à titre de vérification, vous pouvez effectivement recalculer à la main la valeur de la fonction économique à partir de la valeur des variables pour la comparer à celle trouver par votre simplexe : une différence démontre une erreur de calcul. Eric L ALLET, Jean-Luc R AFFY 99 12.3 Exercices Dans les chapitres précédents il était aisé de deviner la technique à mettre en œuvre pour les exercices puisqu’ils concernaient le sujet traité juste au dessus. Voila pourquoi la plupart des exercices ont été placés dans ce chapitre. Ainsi vous n’aurez plus d’a priori sur le type de modélisation que vous devrez utiliser pour les résoudre. Il faudra le trouver par votre analyse du problème. Exercice 12.1 (Commerce de guilde) Une guilde du «Seigneur des Anneaux Online» a décidé de faire commerce de son artisanat. Elle vient de recevoir une commande pour un ensemble de 10 arbalètes, 10 sets complets d’armures lourdes, et 10 épées. Pour réaliser cette commande il faut récolter deux types de fer (le fer de nain et le fer ancien), du bois et du cuir. Il faut ensuite faire divers alliages de fer, traiter le bois et le cuir. Enfin il faut réaliser les objets. Elle décide de confier ces tâches à trois de ses membres : – Tawar : Elfe chasseur menuisier, il aura pour tâche d’aller récolter le bois, de chasser pour rapporter le cuir. C’est aussi lui qui fera le traitement du bois et du cuir. Enfin c’est lui qui réalisera les arbalètes. – Gorog : Nain prospecteur et ferronnier, il aura pour tâche de ramasser le fer de nain. C’est aussi lui qui aura la tâche de faire les armures. Mais attention, Gorog exige d’avoir le droit à une pause de 15 minutes à la taverne entre ses 2 tâches ! – Albin : Humain prospecteur et fabriquant d’arme, il aura pour tâche de ramasser le fer ancien. C’est lui qui transformera tout le fer (fer de nain, et fer ancien) afin d’obtenir les alliages utiles aux arbalètes, aux armures et aux épées. Enfin c’est lui qui réalisera les épées. Tawar prévoit de passer 45 minutes pour récolter la totalité du cuir et du bois. Il lui faudra 15 minutes pour en faire le traitement. Les arbalètes sont fabriquées avec du bois traités et un alliage de fer. Il lui faudra 20 minutes pour toutes les faire. Gorog prévoit de passer 1h pour récolter le fer de nain. La fabrication de ses armures utilisent des alliages de fer et du cuir traité. Il pense pouvoir faire toutes les armures en 25 minutes. Albin passera 1h à ramasser le fer ancien. Il lui faudra 20 minutes pour réaliser les alliages. Ensuite pour fabriquer toutes les épées qui ne nécessitent que des alliages de fer, il lui faudra 10 minutes. Une fois tout réalisé, Albin doit réunir la commande pour aller la livrer. Cela doit lui prendre 10 minutes. Combien de temps faut-il prévoir pour livrer cette commande ? Gorog a-t-il retardé la livraison à cause de sa pause à la taverne ? Quelle est la pause maximale qu’il peut faire sans retarder la livraison ? Correction page 143 Exercice 12.2 (Commerce de guilde (suite)) Les épées et les arbalètes ont satisfait les clients. La guilde a reçu de nombreuses commandes. Elle décide de les produire en série. Pour fabriquer une arbalète il faut ramasser 25 morceaux de bois, et 20 blocs de fer de nain. Pour fabriquer une épée il faut 25 blocs de fer ancien et 20 blocs de fer de nain. Tawar peut ramasser 1000 morceaux de bois par semaine, Gorog 1000 blocs de fer de nain et Albin 1000 blocs de fer ancien. Sachant que la guilde vend une épée pour 1 pièce d’or (1 pièce d’or = 1000 pièces d’argent) et une arbalète pour 500 pièces d’argent, quel est le gain maximal qu’elle peut faire par semaine. Gorog a négocié de recevoir 1 chope de bière par épée vendue, et 2 chopes par arbalète vendue. Or cette semaine c’est lui qui dirige la production. Sachant qu’il va privilégier son intérêt (la bière !) quelles vont être les pertes de gain pour la guilde cette semaine ? Correction page 144 Exercice 12.3 (Commerce de guilde (fin)) Un client se propose d’acheter le stock de matières premières (bois, fer de nain, et fer ancien). A quel prix minimum la guilde doit-il le vendre pour ne pas perdre d’argent par rapport à la vente optimale des produits fabriqués ? (on sait dors et déjà que le prix minimum du stock total est celui de la vente optimale du problème 12.2. Il faut trouver la modlélisation qui le justifie.) Correction page 146 100 Eric L ALLET, Jean-Luc R AFFY Exercice 12.4 (Reconstruction) Vous êtes le Ministre du Budget d’un petit pays victime d’une catastrophe naturelle qui a détruit toute infrastructure et quasiment toutes les ressources de production sauf celles situées dans la ville de Coudebolle. Le Ministre de l’Equipement a fait chiffrer par ses services les coûts de reconstruction du réseau routier entre les principales villes (seules peuvent être construites, les routes dont les coûts sont indiqués dans le tableau suivant) Coudebolle Coudebolle Borivage Ollala Pompays Tecuge Borivage 3000 Ollala 7000 2000 Pompays 2000 Tecuge 7000 4000 3000 6000 Quelle solution allez-vous adopter pour obtenir un réseau routier minimal au moindre coût ? On entend par réseau routier minimal, un réseau permettant d’aller de n’importe quelle ville vers n’importe quelle autre. Correction page 146 Exercice 12.5 (Reconstruction (suite)) Le Ministre de l’Industrie intervient alors et vous reproche d’avoir une vue à court terme et qu’il faut aussi prendre en compte le fait que toutes les ressources de production sont maintenant concentrées à Coudebolle. Il vous transmet donc les coûts de transport (par tonne) estimés entre les différentes villes. Coudebolle Coudebolle Borivage Ollala Pompays Tecuge Borivage 3 4 6 Ollala 7 2 4 8 8 Pompays 2 3 6 Tecuge 7 4 3 6 8 (Vous aurez remarqué que le coût de transport de A vers B n’est pas obligatoirement le même que de B vers A). En supposant que le réseau routier est complet (toutes les routes possibles existent), optimisez les coûts de transport à partir de Coudebolle vers toutes les villes. Correction page 147 Exercice 12.6 (Reconstruction (fin)) Comme tout Ministre du Budget, vous tentez de concilier les intérêts de l’Etat (reconstruire au coût minimum) et des acteurs économiques (ici, coûts de transport minimum). Quelle solution adopteriez-vous et pourquoi ? Quel sera le surcoût par rapport à ce que vous avez calculé à la première question ? Correction page 148 Eric L ALLET, Jean-Luc R AFFY 101 Exercice 12.7 (Donjon et trésors) Vous avez inventé un jeu vidéo très simple dont le scénario est le suivant : Le joueur doit découvrir une salle aux trésors dans un donjon hanté. Pour cela il doit parcourir des salles et dans chaque salle il est soumis à certaines épreuves. Il n’existe bien sûr pas de chemin unique pour aller à la salle aux trésors mais suivant le parcours du joueur, le nombre d’épreuves qu’il aura à affronter peut être différent. Votre jeu connaît un succès appréciable et votre éditeur vous demande d’organiser un grand tournoi. Vous adaptez les règles pour ce tournoi. Le nombre de points sera déterminé par le nombre d’épreuves passées et le temps départegera les joueurs ex-aequo. Pour des raisons d’organisation, l’organisateur veut savoir combien de temps il faut au minimum pour parvenir à la salle au trésor en ayant passé le maximum d’épreuves. De plus il veut que vous déterminiez pour chacune des salles un temps maximum pour y parvenir au-delà duquel le joueur est éliminé. Ce temps est fixé a priori de façon à ce que le joueur ne puisse plus terminer le jeu moins d’une heure après le temps minimal quelque soit le chemin qu’il emprunte ensuite. Le château possède 8 salles (plus la salle aux trésors). Le tableau suivant vous indique le nombre d’épreuves par salle. Salle S1 S2 S3 S4 S5 S6 S7 S8 Nombre d’épreuves 2 4 3 5 4 2 6 3 Le temps minimum pour chaque épreuve est de 10 minutes. Le tableau qui suit indique les possibilités de passage d’une salle à l’autre. S1 S1 S2 S3 S4 S5 S6 S7 S8 S2 X S3 X X S4 S5 X X X S6 S7 S8 X X X X X Le joueur part de la salle S1 et doit se rendre à la salle S8 qui lui donne l’accès à la salle aux trésors. Quel chemin doit emprunter un joueur pour avoir le maximum de points possibles ? Quelle est l’heure maximale d’arrivée dans chaque salle pour ne pas être éliminé (l’heure 0, étant l’heure d’entrée dans la salle 1, et le joueur aura le droit d’emprunter un chemin qui ne donne pas le maximum de points) ? Correction page 148. Exercice 12.8 (Préparation des secours) Un pays tropical doit faire face avec ses propres et maigres moyens à un cyclone en approche. Les prévisions indiquent que le cyclone arrivera sur le sud d’une île du pays et qu’il risque de dévaster la région dont la ville principale, Farniente est hautement touristique. Le gouvernement a fait évacuer la zone et décide de préparer des équipes de secours pour réparer au plus vite les infrastructures après le passage du 102 Eric L ALLET, Jean-Luc R AFFY cyclone. Il veut pouvoir disposer d’un maximum de personnel qualifié dans une ville hors du chemin du cyclone, mais à proximité : Estival. Actuellement ce personnel est cantonné dans la capitale : Aunor. Le gouvernement dispose de quelques jours pour transporter le plus de personnes possible depuis la capitale jusqu’à Estival. Pour cela il dispose de plusieurs moyens de transport (voir figure 12.3) : F IG . 12.3 – Les infrastructures de transports – Par bateau : Le voyage se fait en trois étapes. Depuis Aunor jusqu’à Bordelot la capacité de transport sera au total de 1000 personnes. Depuis Bordelot jusqu’à Danlo la capacité de transport sera au total de 1000 personnes. Et depuis Danlo jusqu’à Estival la capacité totale de transport sera de 700 personnes. – Par avion : Le voyage se fait en deux étapes. Depuis Aunor jusqu’à Danlo la capacité de transport sera de 1000 personnes. Et depuis Danlo jusqu’à Estival la capacité totale de transport sera de 700 personnes. – Par route : Une fois arrivée à Bordelot, une route mène en deux étapes à Estival en passant par Campagne. Entre Bordelot et Campagne la capacité totale sera de 1000 personnes. Entre Campagne et Estival la capacité totale sera de 700 personnes. Toutes ces capacités de transports prennent en compte la totalité des gens que l’on peut transporter sur les quelques jours de préparation. Elle concernent des horaires qui permettent des correspondances pour acheminer les personnes jusqu’à Estival. Combien de personnes au maximum sera-t-il possible d’acheminer depuis Aunor jusqu’à Estival ? Pour chaque étape en bateau, le coût de transport d’une personne est de 1 galet (l’unité monétaire du pays). Pour chaque étape en avion le coût monétaire de transport d’une personne est de 6 galets. Pour chaque étape de route le coût monétaire de transport d’une personne est de 2 galets. Le gouvernement dispose d’un budget de 5400 galets pour le transport des personnes. Combien pourra-t-il en transporter ? Correction page 149 Eric L ALLET, Jean-Luc R AFFY 103 Exercice 12.9 (Déploiement des secours) Le cyclone est passé, l’heure de la reconstruction est venue. Par chance les routes, le port et l’aéroport de Farniente ne sont que partiellement endommagés. Il est possible de les utiliser avec des transports légers pour acheminer le personnel et le matériel nécessaire. Une équipe de reconstruction est composée de 20 personnes et de 1 tonne de matériel. Toutes les équipes ont été composées à Estival et pour des raisons logistiques et d’organisation il faut transporter les 20 personnes d’une même équipe dans le même transport. De même chaque lot de 1 tonne de matériel ne doit pas être divisé durant la transport. Enfin, même si le matériel peut voyager sur un autre transport que le personnel, il faut qu’à l’arrivée il y ait autant d’équipes de 20 personnes que de lots de matériel. Trois moyens de transports sont disponibles : – Des avions : ils peuvent transporter chacun 2 équipes. Chaque voyage coûte 250 galets. – Des bateaux : ils peuvent transporter chacun 1 équipe et 7 lots de matériel. Chaque voyage coûte 150 galets. – Des camions : ils peuvent transporter chacun 3 équipes et 1 lot de matériel. Chaque voyage coûte 150 galets. Pour cette phase des opérations le gouvernement dispose d’un budget de 3500 galets. Combien pourra-t-il déployer d’équipes (avec son matériel) sur place ? Correction page 154 104 Eric L ALLET, Jean-Luc R AFFY Quatrième partie Appendix Eric L ALLET, Jean-Luc R AFFY 105 Annexe A Corrections des exercices A.1 Graphe A.1.1 Correction de l’exercice 1.1 de la page 9 Pour ce problème il faut construire le graphe des rencontres. Mais ils ne suffit pas de relier les gens entre eux, car il faut tenir compte de la notion du temps. Après chaque rencontre les personnages sont «nouveaux». Il faut donc créer un nouveau sommet pour chaque personnage après chaque rencontre. Arnaud fait 2 rencontres, il sera donc représenté par 3 sommets : A, A1 et A2. Bertrand ne fait qu’une rencontre. Il faudra 2 sommets : B, B1. Cyril fait 2 rencontres. il faudra 3 sommets : C, C1, C2. Ainsi de suite jusqu’à Fanny et ses 2 rencontres (F, F1, F2). On arrive au graphe de la figure A.1. F IG . A.1 – Graphe des rencontres Maintenant il faut être capable de trouver un chemin pour acheminer les colis. Il en existe bien un allant de Bertrand à Fanny : Il passe par A1, C1, D2, E3 et finit sur F2. Donc il faut que Bertrand donne son colis à Arnaud lundi qui le donne à Cyril le mardi, qui le transmet à Dorothée le mercredi. Jeudi Étienne le reçoit pour l’acheminer à Fanny le vendredi. Par contre aucun chemin n’existe entre Étienne et Arnaud. Il n’est pas possible d’acheminer ce colis. Eric L ALLET, Jean-Luc R AFFY 107 A.1.2 Correction de l’exercice 1.2 de la page 9 À la lecture des témoignages, au moins Gabriel ne semble pas très net. Mais analysons le problème de près. Déjà dessinons le graphe des rencontres (comme tous les témoignages sont cohérents, on va utiliser un graphe non orienté : les rencontres sont réciproques). Voir la figure A.2. C G B F A E D F IG . A.2 – Graphe des rencontres Comment peut-on interpréter ce graphe ? Chaque sommet est en fait un (ou plusieurs pour les tricheurs !) intervalle de temps. Les autres personnes qui y sont reliés sont les personnes qui ont été présentes dans la salle durant cet intervalle de temps. Réduisons ce graphe à F, E, D A (voir figure A.3). On voit que Fanny a vu Étienne mais pas Dorothée. Comme Étienne a vu Dorothée, on peut en conclure que le passage d’Étienne s’est passé entre celui de Fanny et Dorothée avec un peu de temps en commun avec chacune des deux. Donc un chemin du style F,E,D,A correspond au déroulement du temps (même si on ne peut pas dire dans quel sens va le temps). G F F A E A E D D F IG . A.3 – Réductions du graphe à des sous-ensembles Si on prends la réduction du graphe à F, E, D, A, G (voir figure A.3). On a toujours notre ligne de temps, mais avec Gabriel relié à tous. Cela veut juste dire qu’il a été témoin de toutes les autres rencontres. Mais comme sa présence est continue, il a pu faire cela sans quitter la pièce. Donc ce sous graphe ne pose aucun problème avec les règles du test. Prenons par contre la réduction du graphe à A, B, C, D (voir figure A.4). Ici on a cycle. Et comme on a toujours une personne qui n’a pas été vu d’une autre, cela prouve que personne n’est resté en continu dans la salle. Comme le temps ne cycle pas, seul le double passage d’une des 4 personnes peut expliquer ce cycle. Il y a donc un tricheur parmi elles. De la même manières tout cycle de 4 ou plus personnes où les gens ne sont reliés qu’à deux autres prouvera l’existence d’une tricherie. On peut trouver 2 cycles de genre sur le graphe. On les voit en réduisant le graphe à A,B,C,D et à C, D, E, F (voir figure A.4). Il y a eu ici 2 boucles temporelles. Dans le cycle A, B, C, D au moins un acteur est entrée deux fois dans la pièce, et la même chose pour le cycle C, D, E, F. En fait, si on retire C du graphe d’origine, on obtient un graphe sans anomalies (voir la figure A.5). Ce graphe dernier permet de bien faire ressortir la chronologie des événements (sauf pour ce qui est du «sens» du temps : on va supposer que temps commence avec l’arrivée de F dans la salle, mais il est possible que le temps doive être pris dans sens inverse et donc F soit le dernier a quitté la salle). En ne tenant pas compte de Cyril, on obtient : Fanny ou Gabriel est entré en premier. Étienne est arrivé avant le départ de Fanny. Fanny est sortie. Dorothée est alors arrivée. La sortie d’Étienne a précédé l’arrivée d’Arnaud. Dorothée est sortie avant que n’arrive Bertrand. Comme Fanny a vu Cyril sans que Étienne ne le voit, Cyril était déjà dans la pièce avant Fanny, mais il 108 Eric L ALLET, Jean-Luc R AFFY C C B F A E D D F IG . A.4 – Des sous-graphes incompatibles G B F A E D F IG . A.5 – Sous graphe sans anomalies est sorti avant l’arrivée d’Étienne. Dorothée a vu Cyril, mais ni Étienne ni Arnaud ne l’ont vu. Donc Cyril est repassé dans la pièce entre l’arrivée de Dorothée et l’arrivée d’Arnaud. Bertrand a aussi vu Cyril, mais Arnaud non. Donc Cyril est repassé une troisième fois après le départ d’Arnaud. Comme Gabriel n’a vu entrer personne deux fois de suite on peut aussi déduire qu’il est entrée dans la pièce après le premier départ de Cyril (donc après Fanny), et qu’il l’a quitté avant le troisième passage de Cyril (donc avant Bertrand). On a donc la chronologie complète des passages. Comme Cyril a fait 3 passages, on a l’explication des 2 entrées en trop. Il n’y a donc qu’un seul tricheur. A.1.3 Correction de l’exercice 1.3 de la page 10 Le graphe des rencontres est dessiné sur la figure A.6. C G B F A E D F IG . A.6 – Graphe des rencontres Il y a bien un cycle anormal : F, C, D, E. On est donc sûr qu’il y a eu tricherie. Mais on est incapable de dire combien il y a eu de tricheries et qui a triché. Les informations fournies ne permettent pas de le dire. A.1.4 Correction de l’exercice 1.4 de la page 10 Pour cet exercice il faut commencer par établir la liste de tous les dispositions autorisées de nos 4 protagonistes. Pour cela on va symboliser le fermier par un F, le loup par un L, la chèvre par un C, le choux par un X et la rivière par un /. Donc par exemple l’état de départ est «FLCX/» et l’état final voulu est «/FLCX». L’état où le loup et le choux sont sur la rive d’origine alors que le fermier et la chèvre sur l’autre rive s’écrit : «LX/FC» Les dispositions autorisées sont celles où on ne trouve pas la chèvre sur la même rive que le loup ou Eric L ALLET, Jean-Luc R AFFY 109 le choux alors que le fermier est sur l’autre rive. Donc toutes les combinaisons 3/1 ou 1/3 avec le fermier parmi les 3 sont possibles, mais les seules combinaisons 2/2 possibles sont FC/LX ou LX/FC. On obtient la liste sur la figure A.7. FLCX/ FLX/C FLC/X FCX/L FC/LX LX/FC L/FCX X/FLC C/FLX /FLCX F IG . A.7 – Les dispositions possibles Maintenant on trace une arête entre deux sommets lorsqu’il est possible de passer d’une disposition à l’autre par un voyage en barque du fermier (et de son éventuel passager). On obtient un graphe biparti avec dans un ensemble (en haut) les sommets où le fermier est sur la rive d’origine, et dans l’autre (en bas) les sommets où le fermier est sur la rive d’arrivée (voir figure A.8). FLCX/ FLX/C FLC/X FCX/L FC/LX LX/FC L/FCX X/FLC C/FLX /FLCX F IG . A.8 – Les connexions possibles entre les dispositions Pour résoudre le problème, il suffit maintenant d’emprunter un chemin allant de la disposition FLCX/ à la disposition /FLCX. A.2 Ordonnancement A.2.1 Correction de l’exercice 2.1 de la page 24 Suite à ces explications très claires de votre collègue, la première étape va être d’identifier toutes les tâches et leurs dépendances. Commençons par l’aspect logistique, qui ne dépend pas de l’aspect scientifique : Tâche A : Choix du comité d’organisation. Sans lui, aucune tâche logistique ne peut se faire. Durée : 1 semaine. Tâche B : Choix de l’hôtel. Il est fait par le comité d’organisation : après A. Durée : 3 semaines. Tâche C : Choix des menus et prix des repas. Il faut avoir choisi l’hôtel : après C : Durée : 1 semaine. Tâche D : Choix du lieux du banquet. Il est fait par le comité d’organisation : après A. Durée : 2 semaines. Tâche E : Détermination du prix payé par les conférenciers. Cela dépend du banquet et des menus : après C et D. Durée : 1 semaine. Traitons maintenant l’aspect scientifique : Tâche F : Choix du comité de programme. De lui dépend tout l’aspect scientifique. Durée : 3 semaines. Tâche G : Première réunion. Il faut que le comité scientifique et l’hôtel soient choisis : après B et F. Durée : 0 semaine. Tâche H : Appel et attente des communications : Cette tâche arrive après la première réunion et la détermination du prix : après G et E. Durée : 8 semaines. Tâche I : Sélection des articles. Elle arrive après les réponses à l’appel : après H. Durée 8 semaines. 110 Eric L ALLET, Jean-Luc R AFFY Tâche J : Second réunion. Elle suit la sélection des articles et arrive après le choix du lieux de banquet : après I et D. Elle doit arriver au moins 3 semaines avant le colloque : durée 3 semaines. Tâche K : Mise en forme des articles sélectionnés. Elle arrive après la sélection des articles : après I. Durée 4 semaines. Tâche L : Impression des «Proceedings». Elle arrive après la mise en forme des articles : après K. Durée 6 semaines. Tâche M : Réception des livres. Elle suit l’impression : après la tâche L. Il faut les recevoir au moins 1 semaine avant le colloque : durée 1 semaine. Tâche ω : Le début du colloque. Il faut que tous les aspects logistiques soit réglés que le programme final soit fixé (deuxième réunion), et que les livres soient reçus : après E, J et M. Après avoir ajouté une tâche fictive α de durée nulle placée avant les tâches sans dépendances, on obtient le graphe de la figure A.9 F IG . A.9 – Le graphe des tâches On peut simplifier un peu ce graphe. Lorsqu’on a un chemin X → Y → Z, avec Y seul successeur de X, et Z seul successeur de Y, on peut supprimer Y, et remplacer le chemin par X → Z. La durée du nouvel arc reçoit la somme des durées des deux anciens. À la fin pour retrouver la date au plus tôt et la date au plus tard de Y, il suffira d’ajouter la durée de la tache X aux dates de X (et donc la marge totale de Y sera exactement la même que celle de X ). Donc une fois simplifié on obtient le graphe de la figure A.10 : F IG . A.10 – Le graphe simplifié des tâches Maintenant, il suffit de mettre en œuvre le potentiel-tâches pour avoir la réponse à toutes les questions. Cela donne le graphe de la figure A.11 La durée minimale du projet est donc de 33 semaines. Vous devez à tout prix commencer 33 semaines avant le 17 décembre c’est à dire avant le 30 avril. Vous avez une marge de 2 semaines sur la date de la première réunion (tâche G) et 8 semaines sur la date de la seconde (tâche J). Eric L ALLET, Jean-Luc R AFFY 111 F IG . A.11 – Le résultat du potentiel-tâches A.2.2 Correction de l’exercice 2.2 de la page 25 La modélisation de ce problème ne saute pas aux yeux. Mais l’énoncé indique qu’il faut le modéliser avec un graphe et une recherche de plus long chemin. On va donc le modéliser ainsi. Mais notez que exactement le même exercice est aussi proposé dans la section de la recherche du plus court chemin. Donc la modélisation qui suit est une modélisation parmi d’autres, et non pas la seule possible ! La recherche d’un plus long chemin est bien adaptée à une recherche de maximum. Dans notre problème on trouve des gains et des coûts. Il est évidemment bien plus pertinent de trouver le maximum des gains. On va donc modéliser avec un graphe où les arcs seront valués avec des gains. Pour réussir à modéliser les coûts sur ce graphe, on va les interpréter comme des gains négatifs. Une fois le graphe obtenu, il faudra trouver le chemin qui nous donnera le gain maximal. Ce gain pourra être positif ou négatif. Suivant le cas on pourra conseiller à Apollodore de travailler ou non. La première étape consiste à trouver un graphe qui modélise les possibilités d’Apollodore. Chaque jour le travail d’Apollodore va faire évoluer son stock de repas. Il pourra soit l’augmenter de 50 (le lundi, le mardi et le jeudi), soit le diminuer de 100 (le mardi et le vendredi), soit le laisser inchangé (tous les jours). L’état de ce stock à la fin de chaque journée convient parfaitement pour modéliser les possibilités d’Apollodore. Comme il produit ses repas par 50, qu’il les consomme pas 100 et que son stock maximal est de 100, à la fin de chaque journée son stock a trois états possibles : 0 repas, 50 repas ou 100 repas. Si modélise immédiatement la contrainte qui l’oblige à finir avec un stock nul le vendredi soir, notre graphe devra passer par les états de la figure A.24. F IG . A.12 – Tous les états possibles du stock d’Apollodore Il faut maintenant placer les arcs entre ces états. Le lundi Apollodore peut ne rien faire (le stock reste à 0) ou produire 50 repas (le stock passe à 50 -état Lun 50-). S’il produit 50 repas, cela va lui coûter 2k euros (donc un gain de -2k). On va donc valuer cet arc avec la valeur -2 (notre unité sera le kilo euros). L’état Lun 100 ne peut pas être atteint, il faudra le retirer du graphe. Le mardi le stock d’Apollodore ne lui permet pas 112 Eric L ALLET, Jean-Luc R AFFY de répondre à la demande du premier banquet. Il n’a donc que 2 choix possibles : ne rien faire (son stock ne bouge pas), ou produire 50 repas pour un coût de 2k euros (son stock monte de 50). Le mercredi il n’a pas accès aux cuisines pour produire. Il n’a que deux choix : ne rien faire, ou servir les 100 repas du banquets de mercredi (si son stock le lui permet). Ce banquet lui rapporte 3k euros (il faut penser à retirer le 1k euros que lui coûte le service de chaque banquet). L’arc va être valué avec la valeur 3. On continue ainsi jusqu’à la fin de la semaine et on arrive à la figure A.13 F IG . A.13 – Ajouts des arcs suivants les actions d’Apollodore Sur le graphe de la figure A.13, l’état «Jeu 50» se trouve en dehors de tout chemin menant au seul état final acceptable (stock vide vendredi soir). Il faut donc le retirer de notre modélisation. On obtient le graphe de la figure A.14. F IG . A.14 – Graphe nettoyé des états impossibles On peut encore maintenant simplifier ce graphe avant de faire tourner l’algorithme de recherche de plus long chemin : on supprime les états sur lesquels il n’y qu’un seul arc entrant et un seul arc sortant. On remplace les 2 arcs par un nouvel arc valué par la somme des deux valeurs. On obtient le graphe de la figure A.15. Il nous reste plus qu’à appliquer le même algorithme que pour le potentiel-tâches. Attention, même si on parle du même algorithme, ce graphe n’est absolument pas celui d’un potentiel-tâches (petit rappel : par construction, sur un graphe d’un potentiel-tâches les valeurs des arcs partant du premier sommet sont toutes nulles, et les valeurs des arcs partant d’un même sommet sont toutes identiques. Ce n’est pas le cas du graphe que l’on a construit ici !). On obtient le graphe de la figure A.16. Eric L ALLET, Jean-Luc R AFFY 113 F IG . A.15 – Graphe simplifié avant algorithme F IG . A.16 – Recherche du plus long chemin Sur ce graphe on a stoppé l’algorithme dès l’étape du calcul équivalent à la recherche des «dates au plus tôt». Ces valeurs correspondent à celles du plus long chemin menant vers chacun des sommets. Or la valeur obtenue pour le sommet en bout de graphe est 0. Il n’est donc même pas la peine de chercher par quel chemin on arrive à cette valeur (cette recherche consisterait à rechercher ce qui correspondrait au chemin critique sur le potentiel-tâches), puisque le meilleurs scénario n’est pas intéressant pour Apollodore. Dans le meilleurs de cas, même s’il travaille, il ne peut pas gagner d’argent ! Donc il vaut mieux lui conseiller de ne rien faire cette semaine. A.2.3 Correction de l’exercice 2.3 de la page 25 La modélisation de cet exercice est exactement identique à celle du précédant. Par contre l’aide apportée par Aristodème va enrichir le nombre de scénarios possibles. Grâce à cette main d’œuvre supplémentaire il sera possible de produire jusqu’à 100 repas le lundi, mardi et jeudi. De plus même si l’un des deux sert le banquet du mardi, l’autre pourra produire 50 repas le même jour. Ainsi il est envisageable de ne diminuer le stock que de 50 repas tout en servant ce banquet. On obtient le graphe de la figure A.17. 114 Eric L ALLET, Jean-Luc R AFFY F IG . A.17 – Ajouts des arcs en tenant compte des actions d’Apollodore et d’Aristodème Sur le graphe de la figure A.17, l’état «Jeu 50» se trouve en dehors de tout chemin menant au seul état final acceptable (stock vide vendredi soir). Il faut donc le retirer de notre modélisation. On obtient le graphe de la figure A.18. F IG . A.18 – Graphe nettoyé des états impossibles On peut encore maintenant simplifier ce graphe avant de faire la recherche du plus long chemin : on supprime les états sur lesquels il n’y qu’un seul arc entrant et un seul arc sortant. On remplace les 2 arcs par un nouvel arc valué par la somme des deux valeurs. On obtient le graphe de la figure A.19. On applique l’algorithme utilisé sur les graphes d’un potentiel-tâches pour obtenir le graphe de la figure A.20. Cette fois on obtient la valeur 3 sur le sommet final du graphe. Donc le meilleurs scénario permet de dégager un gain de de 3k euros. Apollodore et Aristodème ont donc intérêt à travailler ensemble cette semaine. Le chemin critique du graphe permet de dégager ce meilleurs scénario. Interprétons-le : – Il faut commencer par augmenter le stock de 100 dès le lundi. Donc les 2 traiteurs doivent travailler en cuisine le lundi. – Ensuite le stock repasse à 0 le mardi. Donc l’un des deux doit servir le banquet du mardi pendant que l’autre se repose. – Mercredi le stock reste à 0. Donc les deux traiteurs se reposent. Eric L ALLET, Jean-Luc R AFFY 115 F IG . A.19 – Graphe simplifié avant algorithme F IG . A.20 – Recherche du plus long chemin – Il faut remonter le stock à 100 le jeudi. Donc les deux doivent travailler en cuisine. – Et vendredi le stock repasse à 0. Donc l’un sert le banquet du vendredi pendant que l’autre se repose. A.2.4 Correction de l’exercice 2.4 de la page 25 Apollodore et Aristodème se demandent comment organiser leurs tâches pour être le plus efficace possible. Il s’agit donc évidemment d’un problème d’ordonnancement. La question porte juste sur le choix entre deux scénarios possibles. Il suffit donc de calculer le temps pris par les deux scénarios et de choisir le plus rapide. Il n’est même pas utile de trouver les tâches critiques, donc un simple diagramme de Gantt suffira. Bien sûr un potentiel-tâches répond tout aussi bien à la question. Pour cette correction nous allons faire un diagramme de Gantt. La première étape consiste à trouver les dépendances des tâches. Pour le premier scénario, Apollodore doit commencer par préparer la pâte brisé avant de faire la tarte elle même. Aristodème étalera cette pâte après la préparation de crème anglaise. On obtient donc les dépendances suivantes : 116 Eric L ALLET, Jean-Luc R AFFY Nom de la tâche A B C D E F G H I J K L Description Préparer la pâte Laisser reposer la pâte Préparer la crème Étaler la pâte Laisser refroidir la crème Mettre la crème au réfrigérateur Préparer le moule Préparer les pommes Mettre en place des pommes Caraméliser les pommes Placer la pâte Cuisson Durée (en minute) 5 30 15 5 15 30 5 10 10 5 5 15 dépendances après A après B et C après C après E après A après G après H après I après D et J après K Traduit sous la forme d’un diagramme de GANTT, on obtient : Tâches 05 10 15 20 25 30 35 40 45 50 55 60 65 A B C D E F G H I J K L Donc avec ce scénario, en 60 minutes tout est prêt. Regardons maintenant le second scénario : seule la tache A change d’acteur. Donc Apollodore peut commencer la tâche G immédiatement, par contre Aristodème doit reporter le début de la tâche C après la fin de la tache A. On obtient les dépendances suivantes : Eric L ALLET, Jean-Luc R AFFY 117 Nom de la tâche A B C D E F G H I J K L Description Préparer la pâte Laisser reposer la pâte Préparer la crème Étaler la pâte Laisser refroidir la crème Mettre la crème au réfrigérateur Préparer le moule Préparer les pommes Mettre en place des pommes Caraméliser les pommes Placer la pâte Cuisson Durée (en minute) 5 30 15 5 15 30 5 10 10 5 5 15 dépendances après A après A après B et C après C après E après G après H après I après D et J après K Traduit sous la forme d’un diagramme de GANTT, on obtient : Tâches 05 10 15 20 25 30 35 40 45 50 55 60 65 A B C D E F G H I J K L Donc avec ce second scénario il faut 65 minutes pour que tout soit prêt. Apollodore et Aristodème devraient suivre la premier scénario pour terminer leur préparation le plus vite possible. A.3 Arbre A.3.1 Correction de l’exercice 3.1 de la page 34 Aucun doute possible pour cette exercice, il s’agit de trouver un arbre de recouvrement minimal. De plus le graphe est presque déjà dessiné par le plan de la commune. Il faut juste penser à considérer tous points déjà reliés par une route en bon état comme étant un seul et même sommet du graphe. 118 Eric L ALLET, Jean-Luc R AFFY Donc le réseau du Centre-Bourg forme un seul sommet. Il est relié aux Fays par ch1, à la Bergerie par ch3, à la Dauberie par ch9, à la Croisée par ch8 et enfin aux Haies par ch11. De plus les Iris et la Croisée ne forme qu’un seul et même sommet. Pour la suite de ce problème, on ne parlera plus que du sommet «la Croisée» relié aux Haies par ch13 et aux Joncs par ch15. En nommant «CB» le sommet du Centre-Bourg et les habitations par leur initiale, on obtient la matrice d’adjacence suivante (les distances sont exprimées en hectomètre) : CB A B C D E F G H J CB A B C ch3=14 ch8=15 ch9=14 ch5=14 ch7=13 ch6=16 ch1=5 ch4=8 ch2=12 D E F G H J ch10=5 ch11=14 ch13=13 ch15=17 ch14=15 ch16=13 ch12=16 Le même graphe dessiné donne la figure A.21. ch1=5 F ch3=14 ch2=12 B ch4=8 ch5=14 ch10=5 D ch11=14 G ch12=16 H ch8=15 ch6=16 ch7=13 A ch9=14 CB ch13=13 ch15=17 C J ch14=15 ch16=13 E F IG . A.21 – Le réseau de chemin de la commune On va par exemple utiliser l’algorithme de Prim en utilisant les matrices. La premier sommet (qui peut être choisi au hasard) placé va être «CB». CB CB A B C D E F ch3=14 ch8=15 ch9=14 G H J ch11=14 A B C D E F G H J ch1=5 OUI La plus petite arête partant de «CB» est celle allant vers «F». On ajoute donc «F» à notre ensemble de sommets traités. On calcule le nouveau cocycle (on ajoute la ligne et la colonne de «F» mais en supprimant les arêtes reliées aux éléments déjà dans l’ensemble). Eric L ALLET, Jean-Luc R AFFY 119 CB CB A B C D E F ch3=14 ch8=15 ch9=14 G H J ch11=14 X X ch1=5 X OUI A B ch4=8 OUI ch2=12 C D E F G H J Dans le nouveau cocycle, la plus petite arête est celle allant de «F» à «A». On ajoute «A» à l’ensemble des sommets traités, et on calcule le nouveau cocycle. CB A CB A B C D E F ch3=14 ch8=15 ch9=14 ch5=14 ch7=13 X X ch1=5 X OUI X X ch4=8 X OUI G H J ch11=14 B C D E F G H J ch2=12 OUI C’est maintenant au tour de l’arête allant de «F» à «B». On ajoute le sommet «B» à l’ensemble : CB A B C D E F G H J CB A B X X X ch3=14 X ch8=15 X X X ch5=14 X ch7=13 OUI ch6=16 X X ch4=8 X OUI X X X ch2=12 X OUI C D E F G H J ch9=14 X X ch1=5 X OUI ch11=14 À cette étape c’est l’arête allant de «A» vers «C» qui est prise. Et quelques itérations plus tard on obtient au final : 120 Eric L ALLET, Jean-Luc R AFFY CB A B C D E F CB A B X X ch3=14 X X X XX ch8=15 X X X X ch5=14 X X X X ch7=13 X OUI X X X ch6=16 X X X ch4=8 X OUI X X X ch2=12 X OUI X X X ch9=14 X OUI X X ch1=5 X OUI C D G H h h( ( h( h ( ch13=13 OUI h h( ( h( ( h ch15=17 h h( ( h( h ( ch11=14 J E X X X ch10=5 X OUI F h h( ( h( h ( ch14=15 OUI h h( ( h( ( h ch16=13 OUI G H J h h( ( h( h ( ch12=16 Les 9 chemins à transformer en route sont donc : ch1, ch2, ch4, ch7, ch9, ch10, ch13, ch14, ch16. La longueur totale à payer sera donc : 5+12+8+13+14+5+13+15+13=98 hm. Et le nouveau plan de la commune est visible sur la figure A.22. Centre Bourg ch1 Bergerie Fays ch3 ch2 ch4 ch5 ch6 ch9 Dauberie Aqueduc ch10 Grignon ch7 ch8 ch12 Croisée ch11 Haies ch13 Légende: : Chemin : Route ch14 Iris Epis d’or ch15 ch16 Joncs F IG . A.22 – Nouveau plan de la commune A.4 Plus court chemin A.4.1 Correction de l’exercice 4.1 de la page 42 Pour ce problème il faut rechercher un «plus court chemin» au sens du temps entre Lyon et Agen. Il faut commencer par trouver le graphe qui va servir à résoudre le problème. Il n’est pas utile de conserver les noeuds intermédiaires qui ne concernent que les changements de noms des routes (comme Feurs, Orange, . . . ). Seuls les noeuds aux intersections des routes sont intéressants pour notre modèle. Eric L ALLET, Jean-Luc R AFFY 121 Il faut aussi calculer le temps de parcours entre chacun des ces noeuds : – Entre Lyon et Clermont-Ferrand : il y a 77km de nationales et 88 km d’autoroutes. (77/70+88/110)× 60 = 114 minutes de trajet. – Entre Lyon et Montpellier : il y a 308km d’autoroutes. (308/110) × 60 = 168 minutes de trajet. – Entre Lyon et Brioude : il y a 182km de nationales. (182/70) × 60 = 156 minutes de trajets. – Entre Montpellier et Brioude : il y a 275km d’autoroutes. (275/110) × 60 = 150 minutes de trajet. – Entre Brioude et Clermont-Ferrand : il y a 66km d’autoroutes. (66/110) × 60 = 36 minutes de trajet. – Entre Clermont-Ferrand et Cahors : il y a 275km d’autoroutes. (275/110) × 60 = 150 minutes de trajet. – Entre Brioude et Cahors : il y a 238km de nationales. (238/70) × 60 = 204 minutes de trajet. – Entre Montpellier et Montauband : il y a 275km d’autoroutes. (275/110) × 60 = 150 minutes de trajet. – Entre Cahors et Montauband : il y a 88km d’autoroutes. (88/110) × 60 = 48 minutes de trajet. – Entre Cahors et Agen : il y a 105km de nationales. (105/70) × 60 = 90 minutes de trajet. – Entre Montauband et Agen : il y a 66km d’autoroutes. (66/110) × 60 = 36 minutes de trajets. On n’a pas d’aprioris sur le sens de parcours de l’axe transversal entre Montpellier et Clermont-Ferrand. Il faudra donc mettre les arcs dans les deux sens pour ces routes. On obtient le graphe de la figure A.23. Clermont 150 11 4 36 36 Cahors 90 Agen iou de 182 48 Lyon 204 Br 36 150 8 150 16 Montauband 150 Montpellier F IG . A.23 – Graphe modélisant les temps de trajet Il nous reste à trouver le chemin le plus court (au sens du temps). On utilise l’algorithme de Ford-Moore. m 0 1 λ(Ly) 0 λ(Cl) H ∞ H 114/Ly 2 X X X 218/Br 3 X X X 186/Br λ(Br) H ∞ H X X X 182/Ly 150/Cl X X X 318/Ml X λ(M l) H ∞ H 168/Ly λ(Ca) H ∞ H λ(M b) H ∞ H X X X 332/Br X X 264/Cl X 318/Ml X X X 386/Br X X X X 300/Br X X X 354/Br 312/Ca 4 λ(Ag) H ∞ H X X 354/Ca X X X X 354/Mt X 348/Mb changés Ly Cl Br Ml Br Ca Mb Mb Ag Ag Γ+ Cl, Br, Ml Ca, Br Cl, Ca, Ml Br, Mb Cl, Ca, Ml Mb, Ag Ag Ag Le voyageur prendra donc 5h48 (348 minutes) pour faire le trajet. Il passera par les sommets Lyon, Clermont, Cahors et Montauband. Donc son plan de route consiste à commencer son voyage sur des nationales et des départementales jusqu’à Feurs. Là, il passe sur le réseau autoroutier en rejoignant Clermont-Ferrand par l’A72. Il emprunte alors l’A71 jusqu’à Combronde où il passe sur l’A89 jusqu’à Brive la Gaillarde. Il change alors en passant sur l’A20 jusqu’à Montauband, où il rejoint l’A62 qui le mènera jusqu’à Agen. 122 Eric L ALLET, Jean-Luc R AFFY A.4.2 Correction de l’exercice 4.2 de la page 42 Nous allons modéliser ce problème avec une recherche de plus court chemin, mais on a vu précédemment (page 25) qu’il était possible de le modéliser avec une recherche du chemin le plus long. La recherche du plus court chemin sert à trouver un optimum reposant sur un graphe orienté. L’optimum en question est un minimum. Que peut-on chercher à minimiser pour optimiser notre problème ? On a des coûts et des gains. . . Les deux étant en fait un peu la même chose : un gain est un coût négatif, et un coût est un gain négatif. Pour optimiser notre problème on doit soit maximiser les gains, soit minimiser les coûts. La technique de la rechercher du plus court chemin est parfaite pour le recherche d’un minimum. On va donc chercher à minimiser les coûts (en transformant les gains en coûts négatifs). La semaine de travail sera rentable que si le minimum obtenu est un nombre négatif. Sinon cela signifiera qu’elle coûtera de l’argent. Comment modéliser la semaine de travail d’Apollodore sur un graphe faisant apparaître les coûts ? On va construire un graphe où chaque état représentera l’état du stock des repas d’Apollodore à la fin de chaque journée. Il démarre avec un stock vide, et doit finir le vendredi avec un stock vide. Sa production est de 50 repas, et un banquet en utilise 100. Le stock maximal est de 100 repas. Donc à la fin de chaque journée il y a trois états possibles pour ce stock : 0 repas, 50 repas ou 100 repas. Notre graphe devra donc passer par les états de la figure A.24 F IG . A.24 – Tous les états possibles du stock d’Apollodore Il faut maintenant placer les arcs entre ces états. Le lundi Apollodore peut ne rien faire (le stock reste à 0) ou produire 50 repas (le stock passe à 50 -état Lun 50-). S’il produit 50 repas, cela va lui coûter 2k euros. On va donc valuer cet arc avec la valeur 2 (notre unité sera le kilo euros). L’état Lun 100 ne peut pas être atteint, il faudra le retirer du graphe. Le mardi le stock d’Apollodore ne lui permet pas de répondre à la demande du premier banquet. Il n’a donc que 2 choix possibles : ne rien faire (son stock ne bouge pas), ou produire 50 repas pour 2k euros (son stock monte de 50). Le mercredi il n’a pas accès aux cuisines pour produire. Il n’a deux que deux choix : ne rien faire, ou servir les 100 repas du banquets de mercredi (si son stock le lui permet). Ce banquet lui rapporte 3k euros (il faut penser à retirer le 1k euros que lui coûte le service de chaque banquet). Comme ici on modélise avec des coûts, ce gain va être reporté comme un coût négatif. L’arc va être valué avec la valeur -3. On continue ainsi jusqu’à la fin de la semaine et on arrive à la figure A.25 Sur le graphe de la figure A.25, l’état «Jeu 50» se trouve en dehors de tout chemin menant au seul état final acceptable (stock vide vendredi soir). Il faut donc le retirer de notre modélisation. On obtient le graphe de la figure A.26. On peut encore maintenant simplifier ce graphe avant de faire tourner l’algorithme de Ford-Moore : on supprime les états sur lesquels il n’y qu’un seul arc entrant et un seul arc sortant. On remplace les 2 arcs par un nouvel arc valué par la somme des deux valeurs. On obtient le graphe de la figure A.27. Eric L ALLET, Jean-Luc R AFFY 123 F IG . A.25 – Ajouts des arcs suivants les actions d’Apollodore F IG . A.26 – Graphe nettoyé des états impossibles F IG . A.27 – Graphe simplifié avant algorithme On applique l’algorithme de Ford-Moore sur ce graphe : 124 Eric L ALLET, Jean-Luc R AFFY m λ(D) λ(L0) λ(L50) λ(M a50) λ(M a100) λ(M e0) λ(J100) λ(V 0) 0 1 0 ∞ Z Z 0/D ∞ Z Z 2/D ∞ Z Z ∞ Z Z ∞ Z Z ∞ Z Z ∞ Z Z 2/L0 2/L50 4/L50 2 3 0/L0 h ( ( h (h ( h 1/Ma100 3/Ma50 h ( ( h (h ( h 4/Ma100 0/Me0 0/J100 4 Sommets changés D L0 L50 Ma50 Ma100 Me0 J100 Γ+ L0, L50 Me0, Ma50 Ma50, Ma100 J100 J100, Me0 V0 V0 V0 Le plus court chemin vers Ven0 a pour valeur 0. Donc le coût minimal pour une semaine de travail d’Apollodore est de 0. Autrement dit, son gain (la valeur opposé du coût pour ce modèle) est de 0. Il vaut mieux conseiller à Apollodore de ne pas travailler dans ces conditions. A.4.3 Correction de l’exercice 4.3 de la page 42 Pour la seconde partie de ce problème, la modélisation est exactement la même, sauf que la présence d’Aristodème permet d’ajouter d’autres chemins sur le graphe. En effet les jours de productions les deux amis peuvent produire 100 repas. Et mardi, il est possible de consommer 100 repas pour le banquet et d’en produire 50 par ailleurs et donc au bilan de n’en consommer que 50. On obtient donc le graphe de la figure A.28 F IG . A.28 – Ajouts des arcs en tenant compte des actions d’Apollodore et d’Aristodème Sur le graphe de la figure A.28, l’état «Jeu 50» se trouve en dehors de tout chemin menant au seul état final acceptable (stock vide vendredi soir). Il faut donc le retirer de notre modélisation. On obtient le graphe de la figure A.29. On peut encore maintenant simplifier ce graphe avant de faire tourner l’algorithme de Ford-Moore : on supprime les états sur lesquels il n’y qu’un seul arc entrant et un seul arc sortant. On remplace les 2 arcs par un nouvel arc valué par la somme des deux valeurs. On obtient le graphe de la figure A.30. Eric L ALLET, Jean-Luc R AFFY 125 F IG . A.29 – Graphe nettoyé des états impossibles F IG . A.30 – Graphe simplifié avant algorithme 126 Eric L ALLET, Jean-Luc R AFFY On applique alors l’alogorithme de Ford-Moore : m λ(D) λ(L0) λ(L50) λ(L100) λ(M a0) λ(M a50) λ(M a100) λ(M e0) λ(J100) λ(V 0) 0 1 0 ∞ Z Z 0/D ∞ Z Z 2/D ∞ Z Z 4/D ∞ Z Z ∞ Z Z ∞ Z Z ∞ Z Z ∞ Z Z ∞ Z Z X X 0/L0 X X 2/L0 X X 2/L50 X -2/L100 0/L100 2 3 Eric L ALLET, Jean-Luc R AFFY 4 5 4/L0 4/L50 4/L100 -2/Ma0 X X 1/Ma50 X h ( h ( ( ( h h (h (h ( h ( h 1/Ma100 4/Ma100 0/Me0 X X X -2/Me0 X X -2/J100 X -3/J100 Sommets changés D L0 L50 L100 Ma0 Ma50 M100 Me0 J100 J100 V0 V0 Γ+ L0, L50, L100 Ma0, Ma50, Ma100 Ma50, Ma100 Ma0, Ma50, Ma100 Me0 J100 Me0, J100 J100, V0 V0 V0 127 Pour ce graphe le plus court chemin fait -3 : il passe par Début, Lun100, Mar0, Mer0, Jeu100 et Ven 0. Cela signifie qu’Apollodore et Aristodème peuvent travailler ensemble cette semaine pour un coût de -3k euros, autrement dit un gain de 3k euros. Ils ont donc intérêt à le faire. Interprétons le chemin pour leur donner le bon scénario : Début → Lun 100 Ils doivent monter leur stock à 100 dès le premier jour. Ils doivent donc travailler en cuisine tous les deux le lundi. Lun 100 → Mar 0 Ils doivent consommer les 100 repas (en servant le banquet du mardi), sans en produire d’autres. Donc un seul des deux doit travailler le mardi au service du banquet du mardi, l’autre peut se reposer. Mar 0 → Mer 0 Leur stock ne bouge pas ce jour là. Le mercredi est un jour de repos pour les deux amis. Mer 0 → Jeu 100 Ils doivent remonter leur stock à 100 le jeudi. Ils doivent donc travailler en cuisine tous les deux. Jeu 100 → Ven 0 Ils doivent consommer les 100 repas (en servant le banquet du vendredi), sans en produire d’autres. Donc un seul des deux doit travailler le vendredi au service du banquet du vendredi, l’autre peut se reposer. A.5 Flot maximal A.5.1 Correction de l’exercice 5.1 de la page 52 Il s’agit d’un problème de flot maximal. La première étape consiste à dessiner le graphe des cursus possibles pour les élèves. Ils vont devoir passer par l’acquisition des trois U V . Comme la seconde école a des accords d’équivalence avec les deux autres, il peut y avoir des échanges entre cette école et les autres à chaque étape de la formation. Mais encore faut-il que les dates le permettent. Comme la première école commence plus tôt, les seuls transferts possibles avec elle vont de la première vers la seconde. Et comme la troisième école termine toujours ses U V après le début de la seconde, les transferts possibles entre elles vont de la deuxième vers la troisième. On arrive au graphe de la figure A.31. Sur cette figure «D» signale les débuts de formation, «F» les fins. Le premier nombre qui suit désigne l’école, et après le point le second nombre désigne l’U V . Donc par exemple «D2.3» désigne le début de la formation pour l’U V3 dans l’école 2. F IG . A.31 – Graphe modélisant le cursus des élèves Ce premier modèle peut être simplifié. Il est possible de supprimer les noeuds qui n’ont qu’une seule arête entrante et une seule arête sortante. On remplace alors ces deux arêtes par une arête ayant la capacité minimale des deux arêtes. c1 S1 −→ c2 S2 −→ min(c1 , c2 ) S3 devient S1 −→ S3 On obtient alors le graphe de la figure A.32. Maintenant il faut trouver le flot maximal que l’on peut faire circuler sur ce graphe. Pour cela on va commencer avec un flot représentant le cas où chaque élève essaye de suivre la totalité de son cursus dans une seule école. En saturant chaque école on arrive au flot de la figure A.33. 128 Eric L ALLET, Jean-Luc R AFFY F IG . A.32 – Graphe simplifié F IG . A.33 – Premier flot. Chaque élève reste dans son école de départ Ensuite on utilise l’algorithme de Ford-Fulkerson pour voir s’il est possible d’améliorer ce flot. La figure A.34 montre le marquage d’une chaîne qui permet de marquer le puits (on n’a laissé sur le graphe que les marquages appartenant à cette chaîne). F IG . A.34 – Marquage d’une chaîne améliorante On obtient la donc chaîne suivante : 40 − 20 = 20 Début −→ ∞−0 = ∞ F1.1 −→ 30 D2.2 ←− ∞−0 =∞ F2.1 −→ 35 − 20 = 15 D3.2+3 −→ Fin On calcule les capacités restantes sur les arcs directs de cette chaîne et le flot passant sur les arcs inverses (il n’y qu’un seul arc inverse pour notre cas), et on prend le minimum de ces valeurs : 15. Il est donc possible d’augmenter de 15 le flot entre Début et Fin. Il faut ajouter 15 aux flots des arcs directs de la chaîne et retirer 15 à l’arc inverse. On obtient le nouveau flot de la figure A.35 Le flot est maintenant de 85 élèves. On tente une nouvelle itération de l’algorithme de Ford-Fulkerson. On n’arrive plus à marquer le puits (voir figure A.36). Donc le flot maximal est déjà atteint. Le flot maximal est de 85. Pour obtenir la formation de 85 élèves, l’organisme doit envoyer 35 élèves suivre l’U V1 dans la première école. 20 de ces élèves continueront la formation dans celle-ci, mais 15 autres iront faire les U V2 et U V3 dans la deuxième école. Il doit aussi envoyer 30 élèves suivre l’U V1 dans la deuxième école. 15 continueront dans celle-ci, mais 15 autres iront suivre le module qui regroupe les U V2 et U V3 dans la troisième école. Enfin 20 élèves feront toutes les U V dans la troisième école. Eric L ALLET, Jean-Luc R AFFY 129 F IG . A.35 – Nouveau flot après amélioration F IG . A.36 – Nouveau marquage : impossible de trouver une chaîne améliorante A.5.2 Correction de l’exercice 5.2 de la page 53 Il s’agit d’un problème de type flot-maximal à coût minimal. Mais attention, on sait que la capacité de notre réseau est de 85 élèves. On veut n’en faire passer que 63. Donc il faudra arrêter l’algorithme avant le flot maximal. Le schéma modélisant notre problème est celui de la figure A.37. F IG . A.37 – Graphe modélisant la recherche du flot maximal à coût minimal Il est possible de simplifier ce graphe. On peut supprimer tous les noeuds n’ayant qu’une seule arête entrante et une seule arête sortant. On remplace ces deux arêtes par une arête ayant la capacité minimale et la somme des coûts des deux arêtes. cap1 /coût1 S1 −→ cap2 /coût2 S2 −→ min(cap1 ,cap2 )/coût1 +coût2 S3 devient S1 −→ S3 On obtient le graphe de la figure A.38. Il faut mettre en œuvre l’algorithme de Busacker et Gowen. Pour cela on démarre avec un flot nul, et on recherche le chemin le plus court (au sens du coût) allant de la source au puits. Il s’agit du chemin1 passant pas les U V de l’école 2 . Le coût de ce chemin est de 24k euros. Sa capacité maximale est de 30 élèves. On peut donc déjà placer un premier flot de 30 élèves sur le graphe (voir figure A.39) dont le coût global 1 Pour 130 alléger la correction de cet exercice, les calculs de recherche des chemins les plus courts ne seront pas reportés ici Eric L ALLET, Jean-Luc R AFFY F IG . A.38 – Graphe simplifié est 24k × 30 = 720k euros. On peut aussi calculer le nouveau graphe associé pour l’étape suivante (figure A.39). F IG . A.39 – Premier flot de 30 élèves Sur le nouveau graphe associé, le plus court chemin passe par Début → F1.1 → D2.2 → F2.1 → D3.2+3 → Fin. Son coût est de 30k euros. Sa capacité est de 30 élèves (concrètement à cette étape de l’algorithme, on demanderait à 30 élèves de l’école 2 de poursuivre leur scolarité dans l’école 3 pour que 30 élèves de l’école 1 puissent finir à moindre coût leur apprentissage dans l’école 2). Le coût globale de ce flot est de 30k × 30 = 900k euros. On obtient les nouveaux graphes de la figure A.40. On n’a toujours pas atteint le flot de 63 élèves. On doit donc continuer l’algorithme. Sur le nouveau graphe associé, le chemin le plus court est celui qui passe par l’école 3. Son coût est de 33k euros, et sa capacité de 5 élèves. Mais il ne nous manque que 3 élèves pour atteindre le flot recherché. Il suffit donc de rajouter 3 élèves pour un coût de 33k × 3 = 99k euros. On obtient le flot de la figure A.41. La solution optimale coûte 720k + 900k + 99k = 1719k euros. Elle consiste à envoyer 30 élèves faire l’U V1 dans l’école 1, et les U V2 et U V3 dans l’école 2. 30 autres élèves feront l’U V1 dans l’école 2, et suivront le module réunissant les U V2 et U V3 dans l’école 3. Enfin les 3 derniers feront toutes les U V dans l’école 3. Eric L ALLET, Jean-Luc R AFFY 131 F IG . A.40 – Un second flot de 30 autres élèves F IG . A.41 – Solution optimale pour 63 élèves A.6 Méthode géométrique et Simplexe A.6.1 Correction de l’exercice 8.1 de la page 74 Il s’agit d’un problème de programmation linéaire. Commençons par trouver la fonction économique à optimiser. Si on nomme F1 le nombre de tonnes de fromage AOC vendues en une année et F2 le nombres de tonnes de l’autre fromage, la marge annuelle (exprimée en k euros) de l’entreprise est : Z = 3 × F1 + F2 . Les ressources imposent des contraintes sur la production : – La laiterie reçoit 4 millions de litres de lait de la zone AOC, et la tonne de fromage AOC en utilise 10 000 litres : 10000 × F1 ≤ 4 000 000 – La laiterie reçoit 10 millions de litres de lait (4 millions de la zone AOC et 6 millions d’autres zones), et tout ce qui n’est pas utilisé par le fromage AOC (10 000 × F1 ) peut être utilisé pour le second fromage qui en utilise 7 500 litres par tonne : 7 500 × F2 ≤ 10 000 000 − 10 000 × F1 – La tonne de fromage AOC nécessite 30 heures de travail, et celle de l’autre fromage 15 heures. La laiterie dispose de 21 000 heures : 30 × F1 + 15 × F2 ≤ 21 000. Donc on obtient (après avoir repasser la variable F1 de la seconde contrainte dans le membre de gauche) : 10 000 × F1 ≤ 4 000 000 10 000 × F1 + 7 500 × F2 ≤ 10 000 000 30 × F1 + 15 × F2 ≤ 21 000 Trouver le max de Z = 3 × F1 + F2 Avec F1 ≥ 0 et F2 ≥ 0 132 Eric L ALLET, Jean-Luc R AFFY Après simplifications : F1 ≤ 400 4 × F1 + 3 × F2 ≤ 4 000 2 × F1 + F2 ≤ 1 400 Trouver le max de Z = 3 × F1 + F2 Avec F1 ≥ 0 et F2 ≥ 0 Ici deux techniques sont utilisables : le simplexe et la méthode géométrique. On va utiliser cette dernière. La délimitation du domaine de solution est visible sur le figure A.42 F IG . A.42 – Domaine de solution On place ensuite la droite représentant la fonction économique Z = 3 × F1 + F2 et on la monte jusqu’à atteindre les limites du domaine. Elle atteint sont maximum lorsqu’elle passe par le point F1 = 400 et F2 = 600 (voir figure A.43) Donc le meilleurs choix économique consiste à utiliser tout le lait de la zone AOC pour fabriquer 400 tonnes du fromage AOC (la maximum que l’on puisse faire), et à utiliser l’autre lait pour fabriquer 600 tonnes fromages de l’autre catégorie. Le bénéfice sera alors de 3×400+600 = 1800 k euros, c’est à dire 1,8 millions d’euros. Notez que les deux contraintes qui bloquent la production sont d’une part la quantité de lait AOC (F1 ≤ 400) et d’autre part le nombre d’heures de travail (2 × F1 + F2 ≤ 1400) (les deux droites qui se croisent au point optimal). La contrainte sur l’autre lait ne bloque pas. D’ailleurs la solution n’utilise que 4,5 millions de litres de lait de la zone non AOC. Il en reste donc 1,5 millions de litres sans usage. F IG . A.43 – Résolution géométrique pour Z = 3 × F1 + F2 Eric L ALLET, Jean-Luc R AFFY 133 A.6.2 Correction de l’exercice 8.2 de la page 75 La modélisation du problème est identique à celle de la question du précédente exceptée pour Z qui change : Z = 2 × F1 + F2 (toujours en k euros). F1 ≤ 400 4 × F1 + 3 × F2 ≤ 4 000 2 × F1 + F2 ≤ 1400 Trouver le max de Z = 2 × F1 + F2 Avec F1 ≥ 0 et F2 ≥ 0 Le domaine de solution ne change pas, on retrouve celui de la figure A.42. Par contre la droite qui va représenter Z n’a plus la même pente. Elle a exactement la même pente que la troisième contrainte. Donc lorsqu’on fait monter cette droite vers son maximum, elle va se confondre avec la droite qui exprime la troisième contrainte (voir figure A.44). F IG . A.44 – Résolution géométrique pour Z = 2 × F1 + F2 Dans ce cas la solution optimale est donnée par tout un segment de droite : le segment compris entre les points (F1 = 100, F2 = 1200) et (F1 = 400, F2 = 600). Donc la solution optimale consiste à fabriquer entre 100 et 400 tonnes du fromage AOC et à utiliser tout le reste du temps de travail pour fabriquer entre 1200 et 600 tonnes de l’autre fromage. Toutes ces solutions rapporteront 1,4 millions d’euros. La solution qui consiste à fabriquer 400 tonnes du fromage AOC et 600 tonnes de l’autre fromage va laisser 1,5 millions de litres de lait (non AOC) sans usage. Si la laiterie arrive à les valoriser autrement, il sera certainement judicieux de choisir cette solution. Voici une seconde correction du même exercice, mais obtenue avec le simplexe : Le tableau du simplexe est : E1 E2 E3 ∆j F1 1 4 2 2 F2 0 3 1 1 E1 1 0 0 0 E2 0 1 0 0 E3 0 0 1 0 Somme 400 4000 1400 0 La premier pivot est sur la colonne de F1 et la ligne de E1 . Après pivotement de F1 à la place de E1 on obtient : F1 E2 E3 ∆j F1 1 0 0 0 F2 0 3 1 1 E1 1 -4 -2 -2 E2 0 1 0 0 E3 0 0 1 0 La second pivot est sur la colonne de F2 et la ligne de E3 . 134 Eric L ALLET, Jean-Luc R AFFY Somme 400 2400 600 -800 F1 E2 F2 ∆j F1 1 0 0 0 F2 0 0 1 0 E1 1 2 -2 0 E2 0 1 0 0 E3 0 -3 1 -1 Somme 400 600 600 -1400 Tout les ∆j sont négatifs ou nuls, on a donc une solution optimale (400 tonnes de fromage AOC, et 600 tonnes de l’autre fromage pour un gain de 1,4 millions d’euros). Mais la variable E1 n’est pas en base et a un ∆j nul. Il existe donc d’autres solutions optimales. On peut faire pivoter cette variable pour connaître l’autre sommet du segment de solutions (la ligne du pivot est celle de E2 ) : F1 E1 F2 ∆j F1 1 0 0 0 F2 0 0 1 0 E1 0 1 0 0 E2 -1/2 1/2 1 0 E3 1.5 -3/2 -2 -1 Somme 100 300 1200 -1400 Donc l’autre solution consiste à fabriquer 100 tonnes du fromage AOC, 1200 tonnes de l’autre fromage pour le même bénéfice (et bien sûr, toutes les solutions intermédiaires sont aussi valables). Comme dit précédemment, choisir de fabriquer 400 tonnes de fromage AOC permet de laisser 1,5 millions de litres de lait non AOC sans usage. Et comme il sera probablement possible de le revendre pour augmenter les profits, on choisira certainement cette solution. A.6.3 Correction de l’exercice 8.3 de la page 75 Il s’agit d’un problème de programmation linéaire. Il faut commencer par trouver la fonction économique à optimiser. Il faut maximaliser la marge de l’entreprise. Si on nome P1 l’électricité achetée au producteur 1, P2 celle du producteur 2, et P3 celle du producteur 3, cette marge se définit par : Z = 900 × P1 + 700 × P2 + 500 × P3 (unités : k euro et TWh). Il faut ensuite mettre les contraintes en équation : – On ne pourra pas vendre plus de 18 TWh : P1 + P2 + P3 ≤ 18. Avec les chiffres de cet exemple où les producteurs offrent plus de 18 TWh et où chaque TWh vendu rapporte de l’argent, on pourrait remplacer le «≤» par un «=», et donc faire disparaître du problème une des trois variables. Mais en faisant ainsi on perdrait le coté général de la modélisation. Le modèle «≤» demeure valable si on modifie les chiffres et que par exemple on ne trouve plus assez d’électricité sur le marché, ou que certains fournisseurs nous obligeraient à avoir des marges négatives sur leur électricité. – Le producteur 1 nous propose au maximum 25 TWh : P1 ≤ 25. Évidemment, la contrainte précédente est bien plus forte que celle-ci, mais à cette étape, on modélise : les simplifications viendront plus tard. – Le producteur 2 nous propose au maximum 6 TWh : P2 ≤ 6 – Le producteur 3 nous propose au maximum 4 TWh : P3 ≤ 4 – Il faut 25% d’électricité renouvelable dans le total vendu. La part d’électricité renouvelable est 0.1 × P1 + 0.46 × P3 + P3 . Le total de l’électricité vendu est P1 + P2 + P3 . Il faut donc 0.1 × P1 + 0.46 × P3 + P3 ≥ 0.25 × (P1 + P2 + P3 ), ce qui revient à dire : 0.15 × P1 − 0.21 × P1 − 0.75 × P3 ≤ 0 En résumé on obtient : P1 + P2 + P3 ≤ 18 P1 ≤ 25 P2 ≤ 6 P3 ≤ 4 0.15 × P1 − 0.21 × P2 − 0.75 × P3 ≤ 0 Trouver le max de Z = 900 × P1 + 700 × P2 + 500 × P3 Avec P1 ≥ 0, P2 ≥ 0, P3 ≥ 0 Maintenant que toutes les contraintes ont été bien modélisées, on peut simplifier certaines choses : Comme on a P2 ≥ 0, et P3 ≥ 0 la contrainte P1 + P2 + P3 ≤ 18 implique P1 ≤ 18. Donc elle implique aussi P1 ≤ 25 que l’on peut retirer de notre problème sans perte d’information. En simplifiant les équations cela donne : Eric L ALLET, Jean-Luc R AFFY 135 P1 + P2 + P3 ≤ 18 P2 ≤ 6 P3 ≤ 4 5 × P1 − 7 × P2 − 25 × P3 ≤ 0 Trouver le max de Z = 9 × P1 + 7 × P2 + 5 × P3 Avec P1 ≥ 0, P2 ≥ 0, P3 ≥ 0 Avec Z exprimé en «100 k euros». Le tableau du simplexe donne : P1 1 0 0 5 9 E1 E2 E3 E4 ∆j P2 1 1 0 -7 7 P3 1 0 1 -25 5 E1 1 0 0 0 0 E2 0 1 0 0 0 E3 0 0 1 0 0 E4 0 0 0 1 0 Somme 18 6 4 0 0 Selon le premier critère de Dantzig, le premier pivot est sur la colonne de P1 . Ensuite le second critère de Dantzig donne le pivot de sur la ligne de E4 (attention, il est tout à fait correct de choisir un 0 dans la colonne «Somme», par contre dans les colonnes des variables on ne peut sélectionner qu’un pivot strictement positif). On pivote donc P1 à la place de E4 (attention, soustraire un nombre négatif, veut dire l’ajouter). E1 E2 E3 P1 ∆j P1 0 0 0 1 0 P2 2.4 1 0 -1.4 19.6 P3 6 0 1 -5 50 E1 1 0 0 0 0 E2 0 1 0 0 0 E3 0 0 1 0 0 E4 -0.2 0 0 0.2 -1.8 Somme 18 6 4 0 0 Il reste des ∆j strictement positifs, donc on continue. Le second pivot est sur la colonne de P3 , et la ligne de E1 . On pivote P3 à la place de E1 . P3 E2 E3 P1 ∆j P1 0 0 0 1 0 P2 0.4 1 0 0.6 -0.4 P3 1 0 1 0 0 E1 1/6 0 0 5/6 -25/3 E2 0 1 0 0 0 E3 0 0 1 0 0 E4 -1/30 0 1/30 1/30 -1/5 Somme 3 6 1 15 -150 Tous les ∆j sont négatifs ou nuls. Le simplexe s’arrête là. On a P1 = 15, P3 = 3. P2 n’est pas en base, donc P2 = 0. Et Z = 150. L’entreprise doit donc acheter 15 TWh au premier producteur, 3 au troisième producteur et elle fera une marge de 150 «100 k euros», c’est à dire 15 millions d’euros. 136 Eric L ALLET, Jean-Luc R AFFY A.6.4 Correction de l’exercice 8.4 de la page 75 Pour la modélisation, seule la fonction économique change par rapport à l’exercice précédent : Z = 850 × P 1 + 710 × P 2 + 500 × P 3 Donc on obtient : P1 + P2 + P3 ≤ 18 P1 ≤ 25 P2 ≤ 6 P3 ≤ 4 0.15 × P1 − 0.21 × P2 − 0.75 × P3 ≤ 0 Trouver le max de Z = 850 × P1 + 710 × P2 + 500 × P3 Avec P1 ≥ 0, P2 ≥ 0, P3 ≥ 0 En simplifiant et en exprimant Z en «10 k Euros» : P1 + P2 + P3 ≤ 18 P2 ≤ 6 P3 ≤ 4 5 × P1 − 7 × P2 − 25 × P3 ≤ 0 Trouver le max de Z = 85 × P1 + 71 × P2 + 50 × P3 Avec P1 ≥ 0, P2 ≥ 0, P3 ≥ 0 D’où le tableau du simplexe suivant : P1 1 0 0 5 85 E1 E2 E3 E4 ∆j P2 1 1 0 -7 71 P3 1 0 1 -25 50 E1 1 0 0 0 0 E2 0 1 0 0 0 E3 0 0 1 0 0 E4 0 0 0 1 0 Somme 18 6 4 0 0 Les deux pivotements vont êtres les mêmes que dans l’exercice précédent, et seule la ligne des ∆j change. Premier pivotement : E1 E2 E3 P1 ∆j P1 0 0 0 1 0 P2 2.4 1 0 -1.4 190 P3 6 0 1 -5 475 E1 1 0 0 0 0 E2 0 1 0 0 0 E3 0 0 1 0 0 E4 -0.2 0 0 0.2 -17 E1 1/6 0 0 5/6 -475/6 E2 0 1 0 0 0 E3 0 0 1 0 0 E4 -1/30 0 1/30 1/30 -7/6 Somme 18 6 4 0 0 Second pivotement : P3 E2 E3 P1 ∆j P1 0 0 0 1 0 P2 0.4 1 0 0.6 0 P3 1 0 1 0 0 Somme 3 6 1 15 -1425 On arrive à une solution optimale (toujours en prenant 15 TWh chez le premier producteur, et 3 chez les troisièmes), qui rapporte 14,25 millions d’euros. Mais cette fois ci, à la fin du second pivotement il y a une variable hors base qui a son ∆j nul (P2 ). Cela signifie qu’il y a d’autres solutions optimales. En faisant un troisième pivotement pour faire entrer P2 dans la base on obtient (selon le second critère de Dantzig la ligne de pivotement est celle de E2 ) : Eric L ALLET, Jean-Luc R AFFY 137 P3 P2 E3 P1 ∆j P1 0 0 0 1 0 P2 0 1 0 0.6 0 P3 1 0 1 0 0 E1 1/6 0 0 5/6 -475/6 E2 -0.4 1 0 -0,6 0 E3 0 0 1 0 0 E4 -1/30 0 1/30 1/30 -7/6 Somme 0.6 6 1 11.4 -1425 On obtient alors une autre solution optimale qui consiste à acheter 11,4 TWh chez le premier constructeur, 6 TWh chez le second et 0,6 chez le troisième (toujours pour un profit de de 14,25 millions d’euros). Il y a en fait tout un segment de droite compris entre les deux solutions qui donneront ce même profit optimal. Le revendeur peut donc acheter les 6 TWh du second producteur tout en gardant le meilleurs profit. A.7 Dual A.7.1 Correction de l’exercice 9.1 de la page 80 Il s’agit d’un problème de programmation linéaire, avec une fonction à minimiser. On va donc passer par le problème dual pour résoudre avec le simplexe un problème de programmation linéaire avec une fonction à maximiser. Il faut commencer par modéliser le problème et établir sa forme canonique. Si on nomme P1 la production électrique achetée au fournisseur 1, P2 celle du fournisseur 2, et P3 celle du fournisseur 3, la fonction économique à minimiser est (Z exprimé en M euros) : Z = 65 × P1 + 73 × P2 + 83 × P3 Il faut aussi respecter les diverses contraintes : – Il faut acheter au moins 18 TWh d’électricité (peut-être est-il rentable d’en acheter plus pour avoir le quota d’électricité renouvelable, quitte à revendre le surplus à un autre vendeur d’électricité) : P1 + P2 + P3 ≥ 18 – Il faut fournir au moins 25% d’électricité renouvelable : 0.1 × P1 + 0.45 × P2 + P3 ≥ 18 × 0.25 – Le fournisseur 2 est limité à 6 TWh : P2 ≤ 6 – Le fournisseur 3 est limité à 4 TWh : P3 ≤ 4 En mettant toutes ces inégalités sous leur forme canonique, on obtient : Minimiser Z avec : Z= (1) (2) 1 ×P1 0.1 ×P1 +1 ×P2 +0.45 ×P2 −1 ×P2 65 ×P1 P1 ≥ 0, +73 ×P2 P2 ≥ 0 et (Z ′ ) (3) +1 +1 ×P3 ×P3 −1 ×P2 +83 ×P3 P3 ≥ 0 ≥ ≥ ≥ ≥ 18 4.5 −6 −4 Pour résoudre ce problème de minimisation, on va passer à son problème dual de maximisation et ensuite utiliser le simplexe. Le problème dual est donc : Trouver le maximum de Z ′ avec (1) (2) (3) Z′ = 1 1 1 18 Y1 ×Y1 ×Y1 ×Y1 ×Y1 ≥ 0, +0.1 ×Y2 +0.45 ×Y2 +1 ×Y2 +4.5 ×Y2 Y2 ≥ 0, −1 ×Y3 −6 ×Y3 Y3 ≥ 0 et −1 ×Y4 −4 ×Y4 Y4 ≥ 0 ≤ ≤ ≤ 65 73 83 Nous allons éviter de simplifier les inégalités. Cela apporterait des changements d’unité pour les valeurs marginales dans le tableau du simplexe. Comme nous traitons le dual du problème d’origine ce sont juste138 Eric L ALLET, Jean-Luc R AFFY ment ces valeurs qui contiendront la solution. Pour éviter de compliquer le suivi des unités, nous allons les garder ainsi (ce sont des TWh achetés en million d’euros). Voici le tableau du simplexe pour la première itération : E1 E2 E3 ∆j Y1 1 1 1 18 Y2 0.10 0.45 1 4.50 Y3 0 -1 0 -6 Y4 0 0 -1 -4 E1 1 0 0 0 E2 0 1 0 0 E3 0 0 1 0 Somme 65 73 83 0 Le premier pivot est sur la colonne de Y1 et la ligne de E1 . Après avoir pivoté, on obtient : Y1 1 0 0 0 Y1 E2 E3 ∆j Y2 0.10 0.35 0.90 2.70 Y3 0 -1 0 -6 Y4 0 0 -1 -4 E1 1 -1 -1 -18 E2 0 1 0 0 E3 0 0 1 0 Somme 65 8 18 -1170 Il reste un ∆j strictement positif, l’algorithme continue. Le second pivot est sur la colonne de Y2 et la ligne de E3 . Après avoir pivoté, on obtient : Y1 E2 Y2 ∆j Y1 1 0 0 0 Y2 0 0 1 0 Y3 0 -1 0 -6 Y4 1/9 7/18 -10/9 -1 E1 10/9 -11/18 -10/9 -15 E2 0 1 0 0 E3 -1/9 -7/18 10/9 -3 Somme 63 1 20 -1224 Tous les ∆j sont négatifs ou nuls. L’algorithme s’arrête ici. La valeur marginale pour E1 est -15, pour E2 0, et E3 -3. Z ′ vaut 1224. Donc lorsqu’on revient au problème primal, on a P1 = 15, P2 = 0, P3 = 3 et Z = 1224. Le revendeur d’électricité doit donc acheter 15 TWh d’électricité au fournisseur 1, rien au fournisseur 2, et 3 TWh au fournisseur 3. Celui lui coûtera 1224 M euros, c’est à dire 1,224 milliard d’euros. A.8 Simplexe : le cas général A.8.1 Correction de l’exercice 10.1 de la page 84 Il s’agit d’un problème de programmation linéaire, avec une fonction à minimiser. Il faut commencer par modéliser le problème et établir sa forme canonique. Pour éviter de manipuler des nombres avec trop de zéro, les variables choisies désigneront 1000 lots. Ainsi les variables utilisées seront : – L1 : le nombre de «1000 lots 1» achetés par le traiteur (c’est à dire 5 tonnes de noix de pécan, 2 tonnes de noix de cajou). – L2 : le nombre de «1000 lots 2» achetées par le traiteur (c’est à dire 15 tonnes de noix de pécan, 2 tonnes de noix de cajou, et 30 tonnes de cacahouètes). – L3 : le nombre de «1000 lots» revendus par le traiteur à son confrère (c’est à dire 5 tonnes de noix de pécan, et 20 tonnes de cacahouètes). La fonction économique à minimiser est Z = 110 × L1 + 224 × L2 − 60 × L3 , avec Z exprimé en k euros. Il faut traduire les contraintes en équations : – Il n’y a que 2000 lots 2 en vente : L2 ≤ 2 – Le traiteur a besoin de 25 tonnes de noix de pécan : 5 × L1 + 15 × L2 − 5 × L3 ≥ 25 – Le traiteur a besoin de 6 tonnes de noix de cajou : 2 × L1 + 2 × L2 ≥ 6 – Il faut acheter les cacahouètes des lots revendus : 30 × L2 ≥ 20 × L3 Eric L ALLET, Jean-Luc R AFFY 139 Donc en mettant toutes ces contraintes sous la forme canonique, il faut minimiser Z avec : (1) 5 2 (2) ×L1 ×L1 Z = 110 ×L1 L1 ≥ 0, (Z ′ ) (3) −1 ×L2 +15 ×L2 +2 ×L2 30 ×L2 +224 ×L2 L2 ≥ 0 et −5 ×L3 −20 ×L3 −60 ×L3 L3 ≥ 0 ≥ ≥ ≥ ≥ −2 25 6 0 Pour résoudre ce problème de minimisation, on va passer à son problème dual de maximisation et ensuite utiliser le simplexe. Le problème dual est donc : Trouver le maximum de Z ′ avec (1) −1 ×Y1 (2) (3) Z ′ = −2 ×Y1 Y1 ≥ 0, 5 ×Y2 +15 ×Y2 −5 ×Y2 +25 ×Y2 Y2 ≥ 0, +2 ×Y3 +2 ×Y3 +6 ×Y3 Y3 ≥ 0 et +30 ×Y4 −20 ×Y4 ≤ ≤ ≤ 110 224 −60 Y4 ≥ 0 Le second membre de l’inégalité (3) de la forme canonique est négatif. La solution Y1 = 0, Y2 = 0, Y3 = 0 et Y4 = 0 n’est donc pas dans le domaine de solutions admissibles. Il faudra utiliser la méthode du cas général et utiliser une variable artificielle pour construire la première solution évidente utile au simplexe. De plus nous n’allons pas simplifier les inégalités. Celles-ci apporteraient des changements d’unité pour les valeurs marginales dans le tableau du simplexe. Comme nous traitons le dual du problème d’origine ce sont justement ces valeurs qui contiendront la solution. Pour éviter de compliquer le suivi des unités, nous allons les garder ainsi (ce sont des «milliers lots» achetés ou revendus). Transformons le problème sous la forme standard : Il faut trouver le maximum de Z ′ avec : (1) 5 × Y2 + 2 × Y3 + E1 = 110 (2) −Y1 + 15 × Y2 + 2 × Y3 + 30 × Y4 + E2 = 224 (3) −5 × Y2 − 20 × Y4 + E3 = −60 Z ′ = −2 × Y1 + 25 × Y2 + 6 × Y3 Y1 ≥ 0, Y2 ≥ 0, Y3 ≥ 0, Y4 ≥ 0, E1 ≥ 0 E2 ≥ 0, E3 ≥ 0 Pour construire une première solution admissible évidente on inverse les signes de l’équation (3) pour obtenir un second membre positif, et on lui ajoute une variable artificielle (X1 ≥ 0 ). Pour que l’algorithme du simplexe tende à annuler X1 en cherchant à maximiser Z ′ , ajoute «−k × X1 » à son expression avec k, une constante positive très grande : (1) 5 × Y2 + 2 × Y3 + E1 = 110 (2) −Y1 + 15 × Y2 + 2 × Y3 + 30 × Y4 + E2 = 224 (3) 5 × Y2 + 20 × Y4 + X1 − E3 = 60 Z ′ = −2 × Y1 + 25 × Y2 + 6 × Y3 − k × X1 Y1 ≥ 0, Y2 ≥ 0, Y3 ≥ 0, Y4 ≥ 0, E1 ≥ 0 E2 ≥ 0, E3 ≥ 0, X1 ≥ 0 Et partant de la solution Y1 = 0, Y2 = 0, Y3 = 0, Y4 = 0 et E3 = 0 : – (1) donne E1 = 110 – (2) donne E2 = 224 – (3) donne X1 = 60 X1 est en base au début de l’algorithme du simplexe. On va donc le faire disparaître de l’expression de Z ′ . L’équation (3) donne : X1 = 60 + E3 − 5 × Y2 − 20 × Y4 . Donc : Z ′ = −2 × Y1 + 25 × Y2 + 6 × Y3 − k (60 + E3 − 5 × Y2 − 20 × Y4 ) {z } | X1 Z = −2 × Y1 + (25 + 5k) × Y2 + 6 × Y3 + 20k × Y4 − k × E3 − 60k ′ 140 Eric L ALLET, Jean-Luc R AFFY En résumé, il faut trouver le maximum de Z ′ avec : (1) 5 × Y2 + 2 × Y3 + E1 = 110 (2) −Y1 + 15 × Y2 + 2 × Y3 + 30 × Y4 + E2 = 224 (3) 5 × Y2 + 20 × Y4 + X1 − E3 = 60 −2 × Y1 + (25 + 5k) × Y2 + 6 × Y3 + 20k × Y4 − k × E3 = Z ′ + 60k Y1 ≥ 0, Y2 ≥ 0, Y3 ≥ 0, Y4 ≥ 0, E1 ≥ 0, E2 ≥ 0, E3 ≥ 0, X1 ≥ 0 avec pour solution admissible de départ : Y1 = 0, Y2 = 0, Y3 = 0, Y4 = 0, E3 = 0, E1 = 110, E2 = 224 et X1 = 60. Cela donne ce premier tableau pour le simplexe : E1 E2 X1 ∆j Y1 0 -1 0 -2 Y2 5 15 5 25+5k Y3 2 2 0 6 Y4 0 30 20 20k X1 0 0 1 0 E1 1 0 0 0 E2 0 1 0 0 E3 0 0 -1 -k Somme 110 224 60 60k k est une constante positive très grande. Donc le premier pivot est sur la colonne Y4 et sur la ligne de X1 . E1 E2 Y4 ∆j Y1 0 -1 0 -2 Y2 5 15/2 1/4 25 Y3 2 2 0 6 Y4 0 0 1 0 X1 0 -3/2 1/20 -k E1 1 0 0 0 E2 0 1 0 0 E3 0 3/2 -1/20 0 Somme 110 134 3 0 E2 0 1 0 0 E3 1 3 -1/5 5 Somme 50 44 12 -300 E2 -1 1/2 0 -3 E3 -2 3/2 -1/5 -4 Somme 6 22 12 -432 Le second pivot est sur la colonne de Y2 et la ligne de Y4 . E1 E2 Y2 ∆j Y1 0 -1 0 -2 Y2 0 0 1 0 Y3 2 2 0 6 Y4 -20 -30 4 -100 X1 -1 -3 1/5 -5-k E1 1 0 0 0 Le troisième pivot est sur la colonne de Y3 et la ligne de E2 . E1 Y3 Y2 ∆j Y1 1 -1/2 0 1 Y2 0 0 1 0 Y3 0 1 0 0 Y4 10 -15 4 -10 X1 2 -3/2 1/5 4-k E1 1 0 0 0 Le quatrième pivot est sur la colonne de Y1 et la ligne de E1 . Y1 Y3 Y2 ∆j Y1 1 0 0 0 Y2 0 0 1 0 Y3 0 1 0 0 Y4 10 -10 4 -20 X1 2 -1/2 1/5 2-k E1 1 1/2 0 -1 E2 -1 0 0 -2 E3 -2 1/2 -1/5 -2 Somme 6 25 12 -438 Le simplexe se termine là. À la fin les coûts marginaux correspondant à E1 , E2 et E3 sont respectivement -1, -2 et -2, donc pour le problème primal on a L1 = 1, L2 = 2 et L3 = 2. Z ′ vaut 438, et donc Z vaut aussi 438. Ainsi pour minimiser ses coûts le traiteur devra acheter 1000 lots 1, les 2000 lots 2 et il revendra à son confrère 2000 lots de 5kg de noix de pécan et 20 kg de cacahouètes. Cela lui coûtera 438 k euros. Eric L ALLET, Jean-Luc R AFFY 141 A.9 Programmation linéaire en nombres entiers A.9.1 Correction de l’exercice 11.1 de la page 93 On a faire un problème de programmation linéaire. S’il n’était pas en nombres entiers, il serait même trivial. Le meuble rectangulaire est plus rentable que le meuble en forme de tour (10 rangements pour 10 points, contre 11 rangements pour 12 points). Il faudrait ne prendre que des meubles rectangulaire. . . 5,9 tours pour 59 rangements ! Oui, mais les meubles doivent être entiers ! Il faut donc appliquer une méthode de programmation linéaire en nombres entiers. Et au final, la solution en nombres entiers sera très loin de la solution fractionnaire. Il faut commencer par modéliser notre problème. On doit maximiser le nombre de rangements. Si on nomme M1 le nombre de meubles rectangulaires à 10 rangements et M2 le nombre de meubles en forme de tour à 11 rangements, on obtient : Z = 10 × M1 + 11 × M2 Le nombre de meubles échangeables est limité par le nombre de points. Il en faut 10 pour les meubles rectangulaires, et 12 pour les tours. Le client dispose de 59 points : 10 × M1 + 12 × M2 ≤ 59. La forme canonique du modèle est donc : Trouver le maximum de Z avec : 10 × M1 + 12 × M2 ≤ 59 Z = 10 × M1 + 11 × M2 M1 ≥ 0 et M2 ≥ 0 Donc le premier tableau du simplexe est : E1 ∆j M1 10 10 M2 12 11 E1 1 0 Somme 59 0 Le premier pivot est sur la colonne de M2 et la ligne de E1 . Il vaut 12, il faut procéder à une troncature. La ligne exprime la contrainte : 10 × M1 + 12 × M2 ≤ 59 En divisant par le pivot et gardant les parties entières on obtient : 10 12 59 × M1 + × M2 ≤ 12 12 12 C’est à dire : M2 ≤ 4. Avec une nouvelle variable d’écart T1 , on peut ajouter cette contrainte au tableau du simplexe. On obtient : E1 T1 ∆j M1 10 0 10 M2 12 1 11 E1 1 0 0 T1 0 1 0 Somme 59 4 0 Ensuite on pivote sur la ligne de T1 et la colonne de M2 : E1 M2 ∆j 142 M1 10 0 10 M2 0 1 0 E1 1 0 0 T1 -12 1 -11 Eric L ALLET, Jean-Luc R AFFY Somme 11 4 -44 Pour la seconde itération le pivot est sur la colonne de M1 et la ligne de E1 . Il vaut 10, il faut procéder à une troncature. La ligne exprime la contrainte : 10 × M1 − 12 × T1 ≤ 11. En divisant par le pivot et gardant les parties entières on obtient : −13 11 10 × M1 + × T1 ≤ 10 10 10 C’est à dire : M1 − 2 × T1 ≤ 1 Avec une nouvelle variable d’écart T2 , on peut ajouter cette contrainte au tableau du simplexe. On obtient : E1 M2 T2 ∆j M1 10 0 1 10 M2 0 1 0 0 E1 1 0 0 0 T1 -12 1 -2 -11 T2 0 0 1 0 Somme 11 4 1 -44 T2 -10 0 1 -10 Somme 1 4 1 -54 Ensuite on pivote sur la ligne de T2 et la colonne de M1 : E1 M2 M1 ∆j M1 0 0 1 0 M2 0 1 0 0 E1 1 0 0 0 T1 8 1 -2 9 Il reste un ∆j positif. Il faut donc continuer. En fait il reste encore 5 itérations supplémentaires qui vont ajouter 5 troncatures supplémentaires. Par contre la solution obtenue à la seconde itération ne va plus évoluer. Les 5 autres itérations vont juste réussir à prouver qu’il n’y a pas de meilleur solution entière dans le domaine admissible. Pour alléger la correction les 5 autres itérations ne vont pas être reportées ici. Voici juste le dernier tableau : E1 M2 M1 T1 T2 T3 T4 T5 ∆j M1 0 0 1 0 0 0 0 0 0 M2 0 1 0 0 0 0 0 0 0 E1 1 0 0 0 0 0 0 0 0 T1 0 0 0 1 0 0 0 0 0 T2 0 0 0 0 1 0 0 0 0 T3 0 0 0 0 0 1 0 0 0 T4 0 0 0 0 0 0 1 0 0 T5 0 0 0 0 0 0 0 1 0 T6 -2 1 -1 -1 -1 -1 -1 -1 -1 T7 0 -5 6 5 4 3 2 1 -5 Somme 1 4 1 0 0 0 0 0 -54 Ainsi au final, M1 = 1 et M2 = 4 et Z = 54. Donc le client devra échanger ses 59 points contre 1 meuble rectangulaire à 10 emplacements et 4 meubles en forme de tour à 11 emplacements. Il aura dépenser 58 points, 1 sera inutilisé (E1 = 1 dans la solution finale) et aura obtenu 54 emplacements de rangement. A.10 Modélisation A.10.1 Correction de l’exercice 12.1 de la page 100 Il faut résoudre un problème d’ordonnancement de tâches. Pour la première questions, on a le choix entre GANTT et le potentiel-tâches. Mais le deuxième pose clairement la recherche du chemin critique et Eric L ALLET, Jean-Luc R AFFY 143 de la marge totale d’une tâche. Il faudra donc faire un potentiel-tâches. Autant commencer par là dès la première question. Pour modéliser ce potentiel-tâches, il faut identifier toutes les tâches et leur dépendances. Il y a trois tâches de récoltes qui ne dépendent de rien d’autre : Tâche A : La récolte du bois et du cuir par Tawar qui dure 45 minutes. Tâche B : La récolte du fer de nain par Gorog qui dure 1 heure. Tâche C : La récolte du fer ancien par Albin qui dure 1 heure. Il y a deux tâches de traitement qui dépendent de certaines récoltes : Tâche D : Le traitement du cuir et du bois par Tawar qui dure 15 minutes. Elle arrive après la tâche A. Tâche E : Le traitement de tout le fer par Albin qui dure 20 minutes. Elle arrive après les deux récoltes de fer (tâche B et C). Il y a la pause de Gorog : Tâche F : Cette pause dure 15 minutes et arrive après la récolte fer de nain (tache B). Il y a les trois tâches de production : Tâche G : La production d’arbalètes par Tawar qui dure 20 minutes et arrive après le traitement du fer et du bois (tâche E et D). Tâche H : La production d’armure par Gorog qui dure 25 minutes et arrive après sa pause, mais aussi après le traitement du cuir et du fer (tâche F, D et E). Tâche I : La production d’épée qui dure 10 minutes ne dépend que du traitement du fer (tâche E). Enfin il y a la tache de livraison : Tâche J : Cette livraison prend 10 minutes et arrive après les 3 productions (tâches G, H I). Cela donne le graphe potentiel-tâches de la figure A.45. F IG . A.45 – Graphe potentiel-tâches Il nous reste à l’interpréter : – La livraison se fera au bout de 115 minutes (1h55). – La pause de Gorog (tache F) n’est pas sur le chemin critique. Il n’a pas retardé la livraison avec cette pause. – La marge totale de cette pause est de 5 minutes. Il peut donc rester encore 5 minutes de plus à la taverne sans retarder le projet. Sa pause maximale est donc de 20 minutes. A.10.2 Correction de l’exercice 12.2 de la page 100 Ici il faut résoudre un problème de programmation linéaire. Il faut optimiser le gain de la guilde. Si on appelle A le nombre d’arbalètes vendues, et E celui des épées, la fonction à optimiser est (gain exprimé en pièces d’or) : Z = 0, 5 × A + E . On ne peut pas produire à l’infini ces armes : on a des contraintes sur les ressources. 144 Eric L ALLET, Jean-Luc R AFFY Tout le bois est utilisé pour les arbalètes (25 morceaux par arbalètes), on a donc : 25 × A ≤ 1000. Tout le fer ancien est utilisé pour les épées (25 blocs par épée), on a donc : 25 × E ≤ 1000 Le fer de nain sert aux deux production (20 blocs par arbalète, 20 blocs par épée), on a donc : 20 × A + 20 × E ≤ 1000. Donc en résumé et après simplifications des inégalités on doit résoudre : A ≤ 40 E ≤ 40 A + E ≤ 50 Trouver le max de : Z = 0, 5 × A + E avec A ≥ 0 et E ≥ 0. Ici deux techniques sont parfaitement adaptées : soit la résolution géométrique, soit le simplexe. Pour cette correction je choisis le simplexe. On a trois inégalités, il faut ajouter trois variables d’écart : E1 , E2 , E3 . E1 E2 E3 ∆j A 1 0 1 0,5 E 0 1 1 1 E1 1 0 0 0 E2 0 1 0 0 E3 0 0 1 0 Somme 40 40 50 0 Le premier pivot est sur la colonne de E et la ligne de E2 . Donc après pivotement de E à la place de E2 , on obtient ce second tableau : E1 E E3 ∆j A 1 0 1 0,5 E 0 1 0 0 E1 1 0 0 0 E2 0 1 -1 -1 E3 0 0 1 Somme 40 40 10 -40 Le second pivot est sur la colonne de A et la ligne de E3 . Après le pivotement de A à la place de E3 , on obtient le troisième tableau : E1 E A ∆j A 0 0 1 0 E 0 1 0 0 E1 1 0 0 0 E2 1 1 -1 -0,5 E3 -1 0 1 -0,5 Somme 30 40 10 -45 Tous les ∆j sont négatifs ou nuls, l’algorithme s’arrête là. Donc la solutions donne A = 10, E = 40 et Z = 45. Interprétons ces chiffres : la guilde doit vendre 10 arbalètes et 40 épées. Elle fera un gain de 45 pièces d’or. Lorsque Gorog prend les commandes de l’opération, la seule chose qui change c’est la fonction à optimiser. Cette fois ci, on doit optimiser le nombre de chopes : Z = 2 × A + E. Et il nous reste à résoudre le problème avec cette nouvelle fonction. Alors soit on refait tous les calculs (pas bien longs vus les chiffres), soit on réfléchit un peu, et on se dit que si on parle en «double chopes» la fonction à optimiser est : Z = A + 0, 5 × E. Donc il faut résoudre : A ≤ 40 E ≤ 40 A + E ≤ 50 Trouver le max de : Z = A + 0, 5 × E avec A ≥ 0 et E ≥ 0 Eric L ALLET, Jean-Luc R AFFY 145 C’est à dire EXACTEMENT le même problème que précédemment si ce n’est que les E remplacent les A et réciproquement. Donc on connaît déjà la solution, il suffit d’inverser le A et le E de la solution précédente. Pour notre nouveau problème : A = 40 et E = 10. Donc pour satisfaire Gorog, la guilde produit 40 arbalètes et 10 épées. La vente rapporte 40×0, 5+10 = 30 pièces d’or, soit une perte de 15 pièces d’or par rapport à la solution optimale. A.10.3 Correction de l’exercice 12.3 de la page 100 Trouver le prix minimal de vente des ressources utiles à la production est en fait le problème dual de celui qui consiste à trouver la vente optimale faite grâce à cette production. Voila pourquoi les deux problèmes ont la même solution (45 pièces d’or). Pour bien montrer que ce problème est le dual du premier on va le formaliser. Il faut optimiser la vente des ressources. Si on appelle BO le prix d’un morceau de bois, F A celui d’un bloc de fer de ancien, et F N celui d’un bloc de fer de nain, la fonction Z ′ dont on doit trouver le minimum est : Z ′ = 1000 × BO + 1000 × F A + 1000 × F N . Chaque arbalète rapporte 0, 5 pièce d’or, donc il faut garantir que les ressources vendues rapporte au moins autant : 25 × BO + 20 × F N ≥ 0, 5 Chaque épée rapporte 1 pièce d’or, donc la vente de ressource doit garantir : 25 × F A + 20 × F N ≥ 1 On obtient : Trouver le min de : Z ′ = 1000 × BO + 1000 × F A + 1000 × F N 25 × BO + 20 × F N ≥ 0, 5 25 × F A + 20 × F N ≥ 1 avec BO ≥ 0 et F A ≥ 0 et F N ≥ 0 Si on passe à l’expression du dual on obtient : Trouver le max de : Z = X1 + 0, 5 × X2 25 × X1 ≤ 1000 25 × X2 ≤ 1000 20 × X1 + 20 × X2 ≤ 50 avec X1 ≥ 0 et X2 ≥ 0 Ce qui est bien exactement l’expression du premier problème dont on connaît déjà la solution : 45 pièces d’or. A.10.4 Correction de l’exercice 12.4 de la page 101 On reconnaît ici un problème de recherche d’arbre de recouvrement minimal. Pour cette correction on va appliquer l’algorithme de Kruskal. Pour le mettre en œuvre on va dessiner le graphe et ordonner les arêtes par ordre croissant (voir figure A.46). B u5 4000 u1 2000 u3 3000 O u2 2000 u6 6000 u4 3000 u7 7000 C P u8 7000 F IG . A.46 – Les routes triées par ordre de coût 146 Eric L ALLET, Jean-Luc R AFFY T Maintenant en appliquant Kruskal on s’aperçoit que l’on peut prendre les 4 premières arêtes sans former de cycle. Ce sont donc elles qui forment notre arbre de recouvrement minimal (voir figure A.47). B u5 4000 u1 2000 u3 3000 O P u2 2000 u6 6000 u4 3000 u7 7000 T u8 7000 C F IG . A.47 – Les routes à reconstruire pour un réseau à moindre coût Donc les 4 routes à reconstruire en priorité sont : celle entre Coudebolle et Borivage, celle entre Borivage et Ollala, celle entre Ollala et Pompays et celle entre Ollala et Tecuge. Le coût de cette reconstruction sera de 2000 + 2000 + 3000 + 3000 = 10 000 unités monétaires. A.10.5 Correction de l’exercice 12.5 de la page 101 Cette fois ci c’est un problème de recherche de plus court chemin. Le graphe servant à cette recherche est celui de la figure A.48. B 2 3 4 4 8 4 2 P 7 6 6 3 O 8 3 6 7 T C 8 F IG . A.48 – Graphe des coût de transports Mais on va plutôt utiliser un tableau pour faire tourner l’algorithme de Ford-Moore. m 0 1 2 3 4 λ(C) 0 H 7/B H X X X 13/O X X 15/T X X X 11/O λ(B) H ∞ H 3/C X X X 11/O X X 16/T H 9/O H λ(O) H ∞ H H 7/C H 5/B X X 14/T X X 12/P X X 10/P λ(P ) H ∞ H H 9/O H X X 16/T 7/O λ(T ) H ∞ H 7/C 7/B X X X 10/O H 8/O H X X 15/P X X 13/P changés C B O T O P Γ+ B, O T C, O, T C, B, P, T C, B, O, P C, B, P, T O, T P O, T Depuis Coudebolle, pour aller à : – Borivage, il faut prendre la route directe. Cela coûte 3 unités/tonne – Ollala, il faut passer par Borivage. Cela coûte 5 unités/tonne – Pompays, il faut passer par Borivage et Ollala. Cela coûte 7 unités/tonne – Tecuge, il faut soit prendre la route directe soit passer par Borivage. Cela coûte 7 unités/tonne Eric L ALLET, Jean-Luc R AFFY 147 A.10.6 Correction de l’exercice 12.6 de la page 101 B 4 2 3 2 P Ou O 7 T C F IG . A.49 – Routes pour les transports à moindre coût Si on compare les routes qu’il faudrait utiliser pour un transport à moindre coût (figure A.49) avec celles qu’il faudrait construire pour une reconstruction à moindre coût (figure A.47) on trouve beaucoup de similitudes. La seule différence se trouve sur le chemin allant à Tecuge. Si on garde le réseau de reconstruction à moindre coût, la seule route permettant d’aller à Tecuge coûtera 8 unités/tonne à la place des 7 possibles par les deux autres routes. Par contre si on décide ne remplacer la route Ollala-Tecuge, par la route Borivage-Tecuge, on aura un transport à moindre coût pour toutes les destinations pour une reconstruction 1000 unités plus chère. Si on envisage de transporter plus de 1000 tonnes vers Tecuge l’investissement sera rentabilisé. Alors il vaudra mieux faire ce choix et reconstruire le réseau de la figure A.50 pour 11 000 unités monétaires. B u5 4000 u1 2000 u3 3000 O u2 2000 u6 6000 u4 3000 u7 7000 C P u8 7000 T F IG . A.50 – Réseau à reconstruire si on transporte plus de 1000 tonnes vers Tecuge A.10.7 Correction de l’exercice 12.7 de la page 102 La première question demande de trouver le «plus long chemin» au sens du nombres d’épreuves entre la salle 1 et la salle aux trésors. On peut obtenir ce résultat en trouvant le chemin critique du diagramme potentiel tâche avec un modèle où les noeuds sont les salles, et la durées le nombre d’épreuves (voir figure A.51). F IG . A.51 – Le chemin à suivre pour marquer le plus de points Il font donc faire les salles dans l’ordre 1,2,3,5,4,6 et 8. Il faudra passer 23 épreuves. 148 Eric L ALLET, Jean-Luc R AFFY Par le chemin qui donne le plus de points aux joueurs, le temps minimal pour y arriver est donc de 230 minutes, c’est à dire 3h50. Pour ne pas être éliminé, les joueurs doivent arriver à la salle aux trésors avant 4h50 (290 minutes). Ensuite pour trouver l’heure d’arrivée maximale pour chaque salle du donjon, il faut trouver le chemin le plus court entre les salles et la salle aux trésors et ensuite calculer le temps de ce chemin. Enfin on retirera ce temps à l’heure d’arrivée éliminatoire de la salle aux trésors. On commence par renverser le graphe pour faire une recherche de chemin le plus court entre la salle aux trésors et toutes les autres salles(voir figure A.52). F IG . A.52 – Graphe avec chemin renversé pour le calcul des chemins les plus courts Pour calculer ces chemins on va utiliser l’algorithme de Ford-Moore. m λ(ST ) λ(S8) λ(S7) λ(S6) λ(S5) λ(S4) λ(S3) λ(S2) λ(S1) 0 1 2 0 ∞ Z Z 3/ST ∞ Z Z ∞ Z Z ∞ Z Z ∞ Z Z ∞ Z Z ∞ Z Z ∞ Z Z 9/S8 5/S8 3 13/S7 10/S6 4 X X X 14/S4 X X X 16/S5 13/S4 5 14/S4 X X X 17/S3 15/S3 X X X 16/S2 Sommets changés ST S8 S7 S6 S5 S4 S3 S2 S1 Γ+ S8 S7, S6 S5 S4 S3 S5, S3, S2 S2, S1 S1 Le chemin ayant le moins d’épreuves depuis l’entrée de la salle 1 jusqu’à la salle aux trésors passe par 15 épreuves. Donc il faut au moins 150 minutes pour le parcourir. Pour avoir une chance d’arriver au bout avant l’heure éliminatoire (4h50 = 290 minutes), il faut entrer dans la salle avant 290-150=140 minutes, c’est à dire avant 2h20. En faisant le même raisonnement pour les autres salles, voici les heures d’arrivée maximale pour ne pas être éliminé : S1 S2 S3 S4 S5 S6 S7 S8 290-150=140 minutes = 2h20 290-140=150 minutes = 2h30 290-130=160 minutes = 2h40 290-100=190 minutes = 3h10 290-130=160 minutes = 2h40 290-50=240 minutes = 4h 290-90=200 minutes = 3h20 290-30=260 minutes = 4h20 A.10.8 Correction de l’exercice 12.8 de la page 102 On reconnaît ici un problème de flot maximal. Et la seconde question sera celui d’un flot maximal à coût minimal. Pour résoudre ce problème il faut déjà modéliser le réseau transport par un graphe. Un premier jet donne la figure A.53 Même s’il existe deux moyens de transport différents entre Danlo et Estival, du point de vue du modèle, rien ne les distingue. Ils ont donc été unifiés en un seul arc de capacité 1400. Eric L ALLET, Jean-Luc R AFFY 149 F IG . A.53 – Réseau de transport entre Aunor et Estival Mais il est possible d’apporter des simplification à ce graphe : Lorsqu’un sommet n’a qu’un seul arc entrant et un seul arc sortant, il est possible de le supprimer en remplaçant les deux arcs par un seul arc ayant la capacité minimale des deux arcs. c1 S1 −→ c2 S2 −→ min(c1 , c2 ) S3 devient S1 −→ S3 Donc on peut supprimer le sommet «Campagne» pour ne mettre qu’un arc de capacité 700 entre Bordelot et Estival. On obtient ainsi le réseau de transport de la figure A.54 F IG . A.54 – Réseau de transport entre Aunor et Estival après simplifications Il reste à utiliser l’algorithme de Ford-Fulkerson sur ce graphe. Pour cela on commence par un flot initial en envoyant 1000 personnes en bateau jusqu’à Danlo. Ensuite ces 1000 personnes utilisent bateau et avion pour aller à Estival. Cela laisse la possibilité à 400 personnes de voyager en avion depuis Aunor jusqu’à Danlo, où ils peuvent continuer en bateau ou avion. On obtient le flot de la figure A.55. F IG . A.55 – Flot initial pour commencer l’algorithme de Ford-Fulkerson Lorsqu’on regarde si ce flot peut être amélioré, le marquage de l’algorithme de Ford-Fulkerson arrive jusqu’au puits (voir figure A.56). Il existe donc une chaîne améliorante : Aunor 150 1000 − 400 = 600 −→ Danlo 1000 ←− Bordelot Eric L ALLET, Jean-Luc R AFFY 700 − 0 = 700 −→ Estival F IG . A.56 – Ford-Fulkerson : marquage d’une chaîne améliorante Le gain que l’on peut obtenir sur cette chaîne améliorante est de 600 personnes. On ajoute donc 600 personnes sur les trajets entre Aunor et Danlo et entre Bordelot et Estival. On retire ce flot sur l’arc inverse, entre Danlo et Bordelot. On obtient le nouveau flot de la figure A.57. Comme le flot sortant de la source est saturé, on sait que le flot maximal est atteint. Il est de 2000 personnes. F IG . A.57 – Flot après amélioration : il s’agit du flot maximal Les capacités de transports autorisent donc le gouvernement à acheminer 2000 personnes depuis Aunor jusqu’à Estival. Une solution pour obtenir ce flot consiste à faire partir 1000 personne en bateau depuis Aunor jusqu’à Bordelot. 600 prennent alors la route pour Estival en passant par Campagne, et 400 continuent en bateau jusqu’à Danlo. Là ils sont rejoints par 1000 autres personnes qui arrivent en avion depuis Aunor. Les 1400 personnes arrivées à Danlo continuent jusqu’à Estival en empruntant avion ou bateau. Maintenant il faut savoir combien de personnes le gouvernement a les moyens de transporter. Il s’agit d’un problème de type «flot maximal à coût minimal». Le figure A.58 illustre le premier jet pour modéliser le réseau de transport en intégrant les coûts. Cette fois ci il va falloir distinguer le moyen de transport entre Danlo et Estival, car le coût va changer suivant que l’on prend l’avion ou le bateau. Pour cela il va falloir introduire deux sommets artificiels pour séparer les deux routes. On va donc placer un «port» et un «aéroport» sur notre graphe. F IG . A.58 – Réseau de transport avec coûts entre Aunor et Estival Lorsqu’un sommet n’a qu’un seul arc entrant et un seul arc sortant, il est possible de le supprimer en remplaçant les deux arcs par un seul arc ayant la capacité minimal des deux arcs et la somme des coûts des deux arcs : cap1 /coût1 S1 −→ cap2 /coût2 S2 −→ min(cap1 ,cap2 )/coût1 +coût2 S3 devient S1 Eric L ALLET, Jean-Luc R AFFY −→ S3 151 Donc on peut remplacer les deux arcs adjacents à Campagne par un seul ayant 700 de capacité et 4 galets par personne pour coût. On obtient le modèle de le figure A.59. Il n’est pas possible de faire cette simplification pour les arcs entre Danlo et Estival, car cela placerait deux arcs différents entre le même couple de sommets (on obtiendrait un «multigraphe»), et les algorithmes utilisés par la suite (par exemple la recherche de plus court chemin utilisé pour Busacker et Gowen) ne fonctionne pas sur ce type de graphe. F IG . A.59 – Réseau de transport avec coûts après simplification À partir de ce modèle on peut mettre en œuvre l’algorithme de Busacker et Gowen. Mais attention, la condition d’arrêt sera le coût de transport. Si on atteint le coût maximal autorisé (5400 galets) avant que le flot maximal ne soit atteint, il faudra s’arrêter. Il faut commencer par faire circuler un premier flot par le chemin le plus court au sens du coût2 : c’est le transport en bateau de bout en bout qui coûte le moins cher, 3 galets par personne : 1000/1 Aunor −→ 1000/1 Bordelot −→ 700/1 ∞/0 Danlo −→ Port −→ Estival On peut transporter 700 personnes par ce chemin pour un coût global 700 × 3 = 2100 galets. On reporte ce flot sur le réseau de transport et on calcule le graphe associé pour trouver le nouveau chemin le plus court (voir figure A.60). F IG . A.60 – Busacker et Gowen : premier flot et graphe associé Le chemin le plus court consiste à transporter les personnes en bateau jusqu’à Bordelot pour ensuite prendre la route jusqu’à Estival pour un coût de 5 galets par personne. 300/1 Aunor −→ 700/4 Bordelot −→ Estival On peut transporter 300 personnes par ce chemin pour un coût global de 300 × 5 = 1500 galets. Donc en cumulant les deux flots, on peut transporter 1000 personnes pour un coût de 3600 galets. Le budget maximal pour le transport n’est pas encore atteint, on peut continuer l’algorithme. 2 Pour 152 alléger la correction, les recherches de chemin le plus court ne sont pas reportées ici. Eric L ALLET, Jean-Luc R AFFY Après report du nouveau flot sur le graphe, on obtient la figure A.61. F IG . A.61 – Busacker et Gowen : graphes après ajout du second flot Le nouveau chemin le plus court part d’Aunor, passe par Danlo et Bordelot et arrive à Estival. Il consiste à acheminer par la route une partie des personnes qui prenaient le bateau à Bordelot pour laisser leur place aux personnes qui arrive en avion à Danlo (et qui peuvent ainsi continuer en bateau). Cela revient à 9 galets par personne. 1000/6 Aunor −→ 700/-1 Danlo ←− 400/4 Bordelot −→ Estival On peut transporter 400 personnes par ce chemin pour un coût global de 400 × 9 = 3600 galets. En cumulant ce flot avec les précédents on atteindrait 7200 galets de coût de transport. Ce qui dépasserait le budget maximal. On ne peut donc pas saturer ce nouveau chemin. Le budget restant après les 3600 galets utilisés pour les deux premiers flots est de 5400 − 3600 = 1800 galets. Avec un coût unitaire de 9 galets par personne, on peut donc transporter 200 personnes de plus. La figure A.62 illustre le flot maximal (1200 personnes) pour le budget fixé (5400 galets). F IG . A.62 – Flot maximal pour le budget fixé Pour 5400 galets de budget de transport, le gouvernement peut acheminer 1200 personnes. 1000 prendront le bateau depuis Aunor jusqu’à Bordelot. de là 700 continueront par la route jusqu’à Estival. 300 autre reprendront le bateau jusqu’à Danlo. Là ils seront rejoints par 200 personnes arrivées en avion depuis Aunor. Ces 500 personnes finiront leur voyage en bateau jusqu’à Estival. Eric L ALLET, Jean-Luc R AFFY 153 A.10.9 Correction de l’exercice 12.9 de la page 104 La question de ce problème ressemble beaucoup à celle du problème précédent. On pourrait donc penser qu’il s’agit encore d’un problème de flot maximal à coût minimal. Mais dès qu’on essaie de le modéliser, on se rend vite compte que le problème s’exprime avec des contraintes qui sont des fonctions linéaires de variables. Il faut combiner dans de bonnes proportions les divers moyens de transport pour gérer au mieux le budget. Il s’agit donc d’un problème de programmation linéaire. Le but est d’envoyer le plus possible d’unités de secours sur place. Le nombre d’unités transportées va dépendre des moyens de transports affrétés. Si on nome U le nombre des unités transportées, A le nombre d’avions, B le nombre de bateaux, et C le nombre de camions on obtient le problème suivant : – Il faut maximiser Z = U . – Il faut assez de moyens de transport pour emporter le personnel. Chaque avion peut transporter 2 unités de personnel, chaque bateau 1 seule, et chaque camion 3. Donc U ≤ 2 × A + B + 3 × C – Il faut assez de transports pour emporter les unités de matériel. Les avions ne peuvent pas en transporter, les bateaux peuvent en transporter 7, et les camions 1. Donc U ≤ 7 × B + C – Il ne faut pas dépasser le budget de 3500 galets. Chaque voyage en avion coût 250 galets, ceux en bateau coûtent 150 galets, et ceux en camion 150 galets. Donc : 250×A+150×B +150×C ≤ 3500 En mettant toutes ces équations sous leur forme canonique, et en simplifiant la dernière par 50, on obtient : Trouver le max de : Z = U U −2×A−B−3×C ≤0 U −7×B−C ≤0 5 × A + 3 × B + 3 × C ≤ 70 avec U ≥ 0,A ≥ 0, B ≥ 0 et C ≥ 0 Il ne reste plus qu’à utiliser le simplexe. Mais comme il n’est pas question d’affréter des morceaux d’avion, de bateau ou de camion il faudra utiliser la méthode en nombres entiers. Voici le premier tableau du simplexe : E1 E2 E3 ∆j U 1 1 0 1 A -2 0 5 0 B -1 -7 3 0 C -3 -1 3 0 E1 1 0 0 0 E2 0 1 0 0 E3 0 0 1 0 Somme 0 0 70 0 Pour la première itération, deux pivots sont possibles (colonne de U , ligne E1 ou E2 ), et valent tous les deux 1. On va choisir celui de la ligne E1 . Comme le pivot vaut 1, il n’y a pas besoin de troncature. On obtient ce second tableau : U E2 E3 ∆j U 1 0 0 0 A -2 2 5 2 B -1 -6 3 1 C -3 2 3 3 E1 1 -1 0 -1 E2 0 1 0 0 E3 0 0 1 0 Somme 0 0 70 0 Pour la second itération, le pivot est sur la colonne de C et la ligne de E2 . Comme le pivot vaut 2, il faut faire une troncature. La ligne de E2 exprime la contrainte : 2 × A − 6 × B + 2 × C − E1 ≤ 0 Donc en divisant par le pivot et prenant la partie entière, on obtient : −6 2 −1 2 ×A+ ×B+ ×C+ × E1 ≤ 0 2 2 2 2 154 Eric L ALLET, Jean-Luc R AFFY C’est à dire : A − 3 × B + C − E1 ≤ 0 Avec une variable d’écart T1 , on peut ajouter cette troncature au tableau pour obtenir : U E2 E3 T1 ∆j U 1 0 0 0 0 A -2 2 5 1 2 B -1 -6 3 -3 1 C -3 2 3 1 3 E1 1 -1 0 -1 -1 E2 0 1 0 0 0 E3 0 0 1 0 0 T1 0 0 0 1 0 Somme 0 0 70 0 0 On pivote sur la ligne T1 colonne de C et on obtient (avec ajout anticipé de la ligne de la troncature de l’itération suivante) : U 1 0 0 0 0 0 U E2 E3 C T2 ∆j A 1 0 2 1 0 -1 B -10 0 12 -3 1 10 C 0 0 0 1 0 0 E1 -2 1 3 -1 0 2 E2 0 1 0 0 0 0 E3 0 0 1 0 0 0 T1 3 -2 -3 1 -1 -3 T2 0 0 0 0 1 0 Somme 0 0 70 0 5 0 Attention, pour alléger la correction les lignes et colonnes des troncatures ont été mises de façon anticipées dans le tableau. Avant l’ajout de la variable T 2, le pivot était sur la colonne de B et la ligne de E3 . Comme le pivot valait 12, il fallait faire une troncature. Celle-ci à été ajoutée avec la variable d’écart T2 . On pivote sur la ligne T2 et la colonne de C. On obtient ce quatrième tableau (toujours avec ajout anticipé de la troncature) : U 1 0 0 0 0 0 0 U E2 E3 C B T3 ∆j A 1 0 2 1 0 0 -1 B 0 0 0 0 1 0 0 C 0 0 0 1 0 0 0 E1 -2 1 3 -1 0 0 2 E2 0 1 0 0 0 0 0 E3 0 0 1 0 0 0 0 T1 -7 -2 9 -2 -1 1 7 T2 10 0 -12 3 1 -2 -10 T3 0 0 0 0 0 1 0 Somme 50 0 10 15 5 1 -50 Avant l’ajout de la ligne et colonne de troncature, le pivot était sur la colonne de T1 et la ligne de E3 . Il valait 9. On a donc ajouté une troncature et sa variable d’écart (T3 ). Après pivotement sur la ligne de T3 et colonne de T1 , on obtient ce cinquième tableau. U E2 E3 C B T1 T4 ∆j U 1 0 0 0 0 0 0 0 A 1 0 2 1 0 0 0 -1 B 0 0 0 0 1 0 0 0 C 0 0 0 1 0 0 0 0 E1 -2 1 3 -1 0 0 0 2 E2 0 1 0 0 0 0 0 0 E3 0 0 1 0 0 0 0 0 T1 0 0 0 0 0 1 0 0 T2 -4 -4 6 -1 -1 -2 1 4 T3 7 2 -9 2 1 1 -2 -7 T4 0 0 0 0 0 0 1 0 Somme 57 2 1 17 6 1 0 -57 À ce moment de l’algorithme, la solution entière optimale est trouvée. Mais comme il reste des ∆j strictement positifs, on ne le sait pas encore. Il faut ajouter deux nouvelles itérations pour le prouver. Voici les deux tableaux de ces itérations sans (presque) aucun commentaire : Eric L ALLET, Jean-Luc R AFFY 155 Le pivot initial (colonne T2 , ligne E3 ) valait 6. On a donc ajouté une troncature et sa variable d’écart T4 . Après pivotement on obtient : U E2 E3 C B T1 T2 T5 ∆j U 1 0 0 0 0 0 0 0 0 A 1 0 2 1 0 0 0 0 -1 B 0 0 0 0 1 0 0 0 0 C 0 0 0 1 0 0 0 0 0 E1 -2 1 3 -1 0 0 0 1 2 E2 0 1 0 0 0 0 0 0 0 E3 0 0 1 0 0 0 0 0 0 T1 0 0 0 0 0 1 0 0 0 T2 0 0 0 0 0 0 1 0 0 T3 -1 -6 3 0 -1 -3 -2 1 1 T4 4 4 -6 1 1 2 1 -2 -4 T5 0 0 0 0 0 0 0 1 0 Somme 57 2 1 17 6 1 0 0 -57 Le pivot initial (colonne E1 , ligne E3 ) valait 3. On a donc ajouté une troncature et sa variable d’écart T5 . Après pivotement on obtient : U E2 E3 C B T1 T2 E1 ∆j U 1 0 0 0 0 0 0 0 0 A 1 0 2 1 0 0 0 0 -1 B 0 0 0 0 1 0 0 0 0 C 0 0 0 1 0 0 0 0 0 E1 0 0 0 0 0 0 0 1 0 E2 0 1 0 0 0 0 0 0 0 E3 0 0 1 0 0 0 0 0 0 T1 0 0 0 0 0 1 0 0 0 T2 0 0 0 0 0 0 1 0 0 T3 1 -7 0 1 -1 -3 -2 1 -1 T4 0 6 0 -1 1 2 1 -2 0 T5 2 -1 -3 1 0 0 0 1 -2 Somme 57 2 1 17 6 1 0 0 -57 Tous les ∆j sont négatifs ou nuls, la solution optimale est donc atteintes : A est hors base, et vaut donc 0, B vaut 6 et C 17. Donc avec le budget alloué, on peut transporter 57 unités (1140 personnes, et 57 tonnes de matériels) en utilisant 6 bateaux et 17 camions. Quelques interprétations supplémentaires : – E2 = 2. E2 est la variable d’écart sur la contrainte du transport du matériel. Donc, la capacité de transport de matériel n’est pas totalement utilisée. Avec les moyens mobilisés on pourrait transporter 2 tonnes de matériel en plus. Mais on n’aurait pas les équipes pour l’utiliser. – E3 = 1. E3 est la variable d’écart sur la contrainte de coût. Donc tout le budget n’est pas utilisé. Comme on avait divisé cette contrainte par 50 pour simplifier l’équation, la somme non utilisée est de 50 galets. 156 Eric L ALLET, Jean-Luc R AFFY Index adjacence, 32 algorithme, arbre de recouvrement minimal, 28, 29, 119 Busacker et Gowen, 49, 50, 52, 53, 129, 130, 152 dates au plus tôt, 15, 21 dates au plus tard, 17, 22 Ford-Fulkerson, 45, 52, 128, 150 Ford-Moore, 37, 122, 125, 127, 147, 149 Kruskal, 28, 147 plus court chemin, 37, 49, 122, 125, 127, 147, 149 Prim, 29, 30, 32, 119 simplexe, 67 arête, 3 arête, boucle, 4 cocycle, 4 extrémité, 3 incidence, 4 arbre, 26, 27, 118, 146 arbre de recouvrement minimal, 28, 29, 97 arbre, Kruskal, 28 recouvrement (de), 28, 118, 146 arc, 6 arc, extréminité initiale, 6 extrémité terminale, 6 flot max, 42, 97, 128, 149 flot max, Busacker et Gowen, 49, 50, 52, 53, 129 coût minimal, 49, 50, 52, 53, 97, 129, 151 Ford-Fulkerson, 45, 52, 128 Ford-Fulkerson, 45, 52, 128, 150 Ford-Moore, 37, 122, 125, 127, 147, 149 forme canonique, 57, 65, 81, 82, 88, 138, 140, 142, 154 forme standard, 65, 66, 73, 82, 88, 140 GANTT, 11, 25, 98, 110, 116, 117 GANTT, diagramme, 11 graphe, 13, 107 graphe prédécesseur, 7 successeur, 6 graphe, Γ+ , 7, 17 Γ− , 7, 15 adjacence, 8 arête, 3 arc, 6 biparti, 4, 110 biparti complet, 4 boucle, 4 chaîne, 4 chemin, 7, 107, 110 circuit, 7 Busacker et Gowen, 49, 50, 52, 53, 129, 130, 152 cocircuit, 7 cocycle, 4, 29 chemin, 7 complet, 4 chemin critique, 11, 13, 20, 22, 98, 110, 111, 143, connexité, 5 148 couvrant, 28 cicuit, 7 cycle, 5 cocircuit, 7 degré, 4, 6 cocycle, 4, 29, 32 demi-degré, 6 connexité, 5 forte connexité, 7 connexité, multigraphe, 4, 8 forte, 7 multivoque, 7 nombre, 5 non orienté, 3, 8, 108 ordre, 4 date au plus tôt, 14 orienté, 3, 5, 8, 107 date au plus tard, 17 p-graphe, 7 degré, 4, 6 poids, 28 degré, simple, 4, 8 demi-degré, 6 sommet, 3 demi-degré exterieur, 6 sous-graphe, 28 demi-degré intérieur, 6 valué, 37 durée de projet, 15, 143, 148 Eric L ALLET, Jean-Luc R AFFY 157 Kruskal, 28, 147 méthode géométrique, 59, 133, 145 marge totale, 20, 22, 144 matrice, adjacence, 8, 32 multivoque, 7 sommet, 3 sommet, adjacence, 4 prédécesseur, 7 successeur, 6 successeur, 6 nombres entiers, voir PLNE ordonnancement, 11, 110, 111, 116 PERT, 11, 110 PLNE, 85, 92, 93, 154 PLNE, troncature, 89–93, 154 plus court chemin, 35, 42, 49, 97, 121, 123, 125, 147, 149 plus court chemin, Ford-Moore, 37, 125, 127 plus long chemin, 23, 25, 98, 112, 114 poids, 28 potentiel-tâches, 11, 13, 97, 98, 110, 111, 116, 143, 148 potentiel-tâches, date au plus tôt, 14 date au plus tard, 17 durée de projet, 15, 143, 148 marge totale, 20, 22, 144 prédécesseur, 7 Prim, 29 programmation linéaire, 57, 59, 63, 80, 85, 98, 132– 134, 137–140, 144, 146, 154 nombres entiers (en), voir PLNE programmation linéaire en nombres entiers, voir PLNE programmation linéaire, dual, 75, 78, 138, 140, 146 forme canonique, 57, 65, 81, 82, 88, 138, 140, 142, 154 forme standard, 65, 66, 73, 82, 88, 140 méthode géométrique, 59, 133, 145 simplexe, 63, 80, 84, 85, 134, 137, 139, 140, 145, 154 simplexe cas général, 80, 139, 140 simplexe, 63, 84, 85, 88, 98, 99, 134, 137, 145, 154 simplexe, algorithme, 67 base, 66, 67 cas général, 80, 139, 140 dual, 75, 78, 138, 140, 146 forme canonique, 57, 59, 65, 81, 82, 88, 138, 140, 142, 154 forme standard, 65, 66, 73, 82, 88, 140 marge, 70 pivot, 67 premier critère de Dantzig, 67 second critère de Dantzig, 67 valeur marginale, 70, 78 variable d’écart, 65, 68, 78, 89 158 Eric L ALLET, Jean-Luc R AFFY Bibliographie [1] Jean-Claude Papillon. Eléments de recherche opérationnelle. Dalloz-Sirey, 1992. [2] Roseaux. Exercices et problèmes résolus de recherche opérationnelle : Tome 3 : Programmation linéaire et extensions - Problèmes classiques. DUNOD, 1985. [3] Roseaux. Exercices et problèmes résolus de recherche opérationnelle : Tome 1, Graphes : leurs usages, leurs algorithmes. DUNOD, 1998. [4] Daniel Thiel. Recherche opérationnelle et management des entreprises. Economica, 1990. Eric L ALLET, Jean-Luc R AFFY 159