1 2 3 1
Université de Sherbrooke
Optimisation linéaire
Jean-Pierre Dussault
27 novembre 2019
Jean-Pierre Dussault
227 novembre 2019
1. cJean-Pierre Dussault 2019. Ce manuscrit est mis à disposition selon les termes de la Li- cence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.
2. Professeur titulaire, département d’Informatique, Université de Sherbrooke, Sherbrooke, Ca- nada J1K 2R1
Préface xi
Notation 1
Introduction 3
1 Modélisation 5
1.1 Premier modèle simple détaillé . . . 6
1.2 Modèles variés de recherche opérationnelle . . . 10
1.2.1 Diète . . . 10
1.2.2 Modèle de production . . . 15
1.2.3 Problème de transport . . . 21
1.2.4 Problème d’entreposage . . . 24
1.2.5 Problème du barman . . . 26
1.2.6 Situation plus complexe . . . 29
1.3 Modèles déguisés . . . 40
1.3.1 Min-max . . . 40
1.3.2 Normes polyédrales. . . 42
1.3.3 Modèles pour la compression d’images . . . 44
1.4 Résumé . . . 45
1.5 Extensions et références. . . 45
2 Introduction et intuition géométrique 47 2.1 Formulation du problème . . . 48
2.1.1 Intuition géométrique en 2D . . . 48
2.1.2 Résolution graphique d’un problème en deux dimensions . . . 52
2.1.3 Solutions multiples . . . 53
2.1.4 Domaine réalisable non borné . . . 53 i
2.1.5 Domaine réalisable vide . . . 54
2.2 Résultat de la résolution d’un modèle d’optimisation linéaire . . . 55
2.3 Formes standard . . . 57
2.3.1 Forme standard avec inégalités . . . 57
2.3.2 Forme standard du simplexe . . . 58
2.3.3 Passage d’une forme à l’autre . . . 58
2.4 Parenthèse calculatoire : pivots . . . 65
2.5 Quelques propriétés des contraintes linéaires . . . 67
2.5.1 Propriétés des solutions de base réalisables. . . 69
2.6 Résumé . . . 72
2.7 Tous les exercices du chapitres . . . 72
3 Algorithme du simplexe 79 3.1 Formulation du problème . . . 80
3.2 Solutions de base réalisables . . . 80
3.3 Condition d’optimalité . . . 82
3.3.1 Exemple . . . 83
3.3.2 Équations des conditions d’optimalité . . . 84
3.4 Algorithme du simplexe. . . 85
3.4.1 Organisation calculatoire : forme canonique d’un problème . . . 86
3.4.2 Organisation calculatoire : pivots et tableaux. . . 86
3.4.3 Organisation calculatoire : dictionnaires . . . 91
3.5 Comment obtenir la première solution de base réalisable . . . 92
3.5.1 Contraintes ďavec bě0 . . . 92
3.5.2 Cas général . . . 93
3.5.3 Exemple . . . 93
3.6 Simplexe révisé . . . 97
3.6.1 Exemple . . . 99
3.7 Résumé . . . 101
3.8 Extensions et références. . . 101
3.9 Tous les exercices du chapitres . . . 102
4 Dualité 105 4.1 Théorie de la dualité . . . 106
4.1.1 Exemple du triangle . . . 108
4.1.2 Diverses formulations de problèmes duaux . . . 109
4.1.3 Interprétations et conséquences du théorème de dualité . . . 112
4.1.4 Écarts complémentaires . . . 113
4.2 Algorithme dual du simplexe . . . 115
4.2.1 Exemple simple . . . 115
4.2.2 Notre problème (2.7) . . . 117
4.2.3 Un autre exemple . . . 118
4.2.4 Deux phases. . . 122
4.3 Un lien avec la théorie des jeux . . . 123
4.3.1 Un exemple simpliste . . . 123
4.4 Résumé . . . 131
4.5 Tous les exercices du chapitres . . . 133
5 Convergence de l’algorithme du simplexe 139 5.1 Dégénérescence . . . 140
5.2 Un exemple de cyclage dans l’algorithme du simplexe . . . 141
5.3 Règles d’anti-cyclage . . . 142
5.4 Convergence finie de l’algorithme du simplexe . . . 144
5.4.1 Dualité forte . . . 145
5.5 Résumé . . . 145
5.6 Tous les exercices du chapitres . . . 146
6 Analyse de sensibilité 149 6.1 Un exemple . . . 150
6.2 Algorithme auto-dual paramétrique. . . 157
6.2.1 Idée générale . . . 157
6.2.2 Exemple détaillé . . . 157
6.3 Anti-cyclage probabiliste . . . 161
6.4 Résumé . . . 162
6.5 Extensions et références. . . 163
6.6 Tous les exercices du chapitres . . . 163
7 Quelques extensions 169 7.1 Un algorithme de décomposition . . . 170
7.2 Introduction aux algorithmes de point intérieur . . . 172
7.3 Traitement de variables entières . . . 176
7.3.1 Séparation et évaluation progressive . . . 177
7.3.2 Coupes . . . 180
7.3.3 Remarques . . . 182
7.4 Implantation numérique de l’algorithme du simplexe . . . 182
7.4.1 Utilisation de la décomposition LU . . . 183
7.4.2 Utilisation de la décomposition QR . . . 184
7.4.3 Dégénérescence numérique. . . 184
7.5 Résumé . . . 185 7.6 Extensions et références. . . 185 7.7 Tous les exercices du chapitres . . . 185
A Rappels mathématiques 187
A.1 Rappels d’analyse mathématique : optimisation en une dimension . . . 187 A.2 Rappels d’algèbre linéaire . . . 188 A.2.1 Matrices inversibles . . . 188
B Solutions de quelques exercices 191
2.1 Exemple de droite . . . 49
2.2 Exemple simple bi-dimensionnel . . . 50
2.3 Exemple en 3D . . . 51
2.4 Exemple en 3D . . . 51
2.5 Résolution graphique . . . 52
2.6 Résolution graphique . . . 53
2.7 Résolution graphique . . . 54
2.8 Résolution graphique . . . 55
2.9 Exemple simple bi-dimensionnel . . . 61
2.10 Ensemble convexe . . . 68
2.11 Illustration de tmin ettmax . . . 70
7.1 Exemple . . . 176
7.2 Exemple . . . 177
7.3 Exemple . . . 178
7.4 Arbre des séparations . . . 179
v
3.1 Simplexe révisé. . . 98 4.1 Simplexe dual révisé. . . 119 6.1 Simplexe auto-dual paramétrique. . . 160
vii
1.1 Premier modèle avec AMPL ; fichier : AMPL/premiermodele.mod . . . 8
1.2 Premier modèle avec AMPL – données ; fichier : AMPL/premiermodele.dat . 8 1.3 Modèle avec AMPL ; fichier : AMPL/ex1.1.mod . . . 9
Session AMPL . . . 9
1.4 Modèle de diète ; fichier : AMPL/diet.mod . . . 11
1.5 Données pour le modèle de diète ci-haut ; fichier : AMPL/dietH.dat . . . 12
1.6 Données pour le modèle de diète AMPL ; fichier : AMPL/diet.dat . . . 13
1.7 Modèle de production générique ; fichier : AMPL/ex1.2b.mod . . . 16
1.8 Données du modèle de production spéfifique ; fichier : AMPL/ex1.2b.dat . . 17
1.9 Instructions pour résoudre le modèle ; fichier : AMPL/ex1.2.cmd . . . 18
1.10 Session AMPL . . . 18
1.11 Modèle de production générique — solution entière ; fichier : AMPL/ex1.2bInt.mod 19 1.12 Instructions pour résoudre le modèle avec solution entière ; fichier : AM- PL/ex1.2Int.cmd . . . 19
1.13 Session AMPL . . . 20
1.14 Session AMPL . . . 20
1.15 Session Scilab . . . 20
Session Scilab . . . 21
1.16 Modèle de transport générique ; fichier : AMPL/transp.mod . . . 22
1.17 Données du modèle de trsansport générique ; fichier : AMPL/transpH.dat . . 23
1.18 Session AMPL . . . 23
1.19 Modèle d’entreposage générique ; fichier : AMPL/ex1.4.mod . . . 25
1.20 Données du modèle d’entrepôt générique ; fichier : AMPL/ex1.4.dat . . . 25
1.21 Modèle de barman générique ; fichier : AMPL/barman1.mod . . . 27
1.22 Données de barman spécifiques ; fichier : AMPL/barman1.dat . . . 27
1.23 Session AMPL . . . 28
1.24 Session AMPL . . . 28
1.25 Session AMPL . . . 29 ix
L’optimisation mathématique, également nommée «programmation mathématique» re- groupe un ensemble de sujets dans l’étude de problèmes d’optimisation. Une fonction objectif, parfois nommée critère, est donnée, et le problème consiste à trouver —caractériser— calcu- ler un point minimisant (ou maximisant) cette fonction. Parfois, tous les points de l’espace sont candidats, parfois, des contraintes limitent le domaine de recherche.
En optimisation linéaire, les fonctions utilisées (fonction objectif, contraintes) sont li- néaires. Les outils qui soutiennent l’optimisation linéaire sont donc essentiellement ceux de l’algèbre linéaire et du calcul matriciel.
Avant d’attaquer la théorie et les algorithmes de résolution de modèles d’optimisation linéaire, un chapitre de modélisation regroupe plusieurs exemples tirés de champs d’appli- cation variés. Une démarche est proposée pour effectuer le passage d’une problématique concrète vers un modèle mathématique d’optimisation linéaire. Nous apprendrons également à utiliser un logiciel pour obtenir les solutions des différents modèles que nous aborderons.
Depuis ses débuts dans les années 1940 jusqu’en 2010, l’optimisation mathématique a été nommée “programmation mathématique”, et l’optimisation linéaire “programmation linéai- re” ; la société savante “Mathematical Programming Society” a adopté un changement de nom visant à mieux décrire la discipline et depuis 2010, c’est la “Mathematical optimization society”. En effet, “programmation” ne fait aucunement référence à la programmation des or- dinateurs. On réfère plutôt à l’étude d’une situation que l’on souhaite optimiser, par exemple déterminer une structure de prix permettant deprogrammerdes activités pourminimiserles coûts de production. Les pionniers de la discipline on mis l’accent sur la “programmation”
alors que nous préférons aujourd’hui mettre l’accent sur l’aspect “optimisation” du domaine.
xi
Nous adoptons la convention que Rn consiste en des vecteurs colonnes. On dénote la transposition d’un vecteur par vt. Le produit scalaire entre deux vecteurs colonnes vtv.
Nous étudierons la notion de dualité et nous adopterons la convention que le vecteur de coût et les varibles duales sont des vecteurs lignes. Ces vecteurs appartiennent à l’espace dual de Rn qui est isomorphe à Rn, ce qui motive la convention de les représenter par des lignes.
Les intervalles, ouverts ou fermés, sont dénotés par les crochets r ets comme suit :
‚ ra, bs “ tx:aďxďbu;
‚ ra, br“ tx:aďxăbu;
‚ sa, bs “ tx:aăxďbu;
‚ sa, br“ tx:aăxăbu.
Les vecteurs — ligne ou colonne — peuvent se mesurer à l’aide de normes, }v}; plusieurs normes pourront être utilisées, la norme Euclidienne étant la norme “par défaut” :
‚ }v} “ }v}2 “ařn
i“1vi2 “
?vtv;
‚ }v}1 “řn i“1|vi|;
‚ }v}8 “maxni“1t|vi|u.
Une matricemˆn Aest habituellement dénotée par une majuscule. Ses lignes sont notées ai, i“1,2, . . . , m alors que ses colonnes sont notées Aj, j “1,2, . . . , n. Donc
A “
¨
˚
˚
˚
˝ a1 a2
... am
˛
‹
‹
‹
‚
“`
A1 A2 . . . An˘ .
Les symboles de logique habituels sont p , nonq, p ^ , etq etp _ , ouq.
Puisque le sujet de ce texte concerne l’optimisation, en mémoire aux origines de la langue Française, j’utilise les pluriels latinisés pour maximum, minimum, optimum : maxima, mi- nima, optima.
1
Ce texte est un document pédagogique pour introduire l’optimisation linéaire. Les sujets sont présentés de manière élémentaire et ne nécessitent qu’une connaissance de l’algèbre linéaire.
Dès que l’on utilise un des mots minimum, minimiser, minimal, maximal, maximum, maximiser pour décrire une situation, il devient possible de formuler sous forme mathéma- tique un problème d’optimisation. On parle de caractérisation ou de calcul d’un optimum, d’une solution optimale, le terme optimum signifiant minimum ou maximum selon les cas.
La démarche permettant de décrire une situation donnée sous forme d’un problème d’opti- misation mathématique se nomme modélisation.
Ce texte vise deux objectifs principaux : initier à la démarche de modélisation. Les mo- dèles proviennent de plusieurs champs d’application. La recherche opérationnelle fournit une grande variété de tels modèles.
L’autre objectif est d’étudier un algorithme célèbre, l’algorithme du simplexe, pour ré- soudre les modèles d’optimisation linéaire. Cet algorithme fait partie de la liste des “top ten algorithms in the twentieth century”.
En complément, nous esquisserons une autre famille d’algorithmes importants, les algo- rithmes de points intérieurs. Ce texte d’introduction ne permet pas d’étudier ces algorithmes en profondeur mais seulement d’en comprendre le fonctionnement sans pouvoir en étudier les fondements. En effet, ces algorithmes relèvent d’algorithmes numériques s’appuyant sur l’analyse mathématique vectorielle et l’analyse numérique, sujets que nous ne supposons pas prérequis pour le présent texte.
Également en complément, nous introduirons la problématique résultant de quantités qui doivent absolument prendre des valeurs entières et deux solutions algorithmiques simplistes pour les résoudre.
3
Chapitre 1
Modélisation
‚ Formalisation de modèles à partir de situations informelles.
‚ Description de modèles dans le langage AMPL.
‚ Utilisation naïve de logiciels de résolution.
Sujets du chapitre
5
Introduction
On appelle modélisation la démarche qui considère une situation informelle et se pro- pose de la traduire dans un langage mathématique approprié à l’obtention d’une solution au problème sous-jacent à la situation informelle. Une partie de la démarche est de faire abstraction d’aspects de détails au profit d’une représentation de l’essentiel de la situation.
La distinction entre l’essentiel et les détails moins pertinents relève de l’expérience.
Pour fixer les idées, nous considérons d’abord une situation informelle simple. Dans la suite du chapitre, nous aborderons des patrons fréquents de modélisation. Ce premier chapitre ne présuppose pas de connaissance avancée, mais tout de même un minimum d’algèbre linéaire tel que rappelé à l’appendice A.
1.1 Premier modèle simple détaillé
Voici une premiere situation très simple qui nous conduira à un problème jouet que nous utiliserons pour introduire le vocabulaire des modèles d’optimisation linéaire.
Situation à modéliser
Une entreprise utilise trois machines dénotées A, B, C pour fabriquer deux produits P1 etP2. Chaque unité deP1 requiert une heure de la machine A et deux heures de la machine B. Chaque unité de P2 requiert une heure de chacune des trois machines.
Les disponibilités mensuelles des machinesA, B etC sont de 400, 600 et 300 heures respec- tivement.
Si le profit unitaire est de 1,50$ pour P1 et 1,00$ pour P2, combien l’entreprise doit-elle fabriquer de chacun des produits pour maximiser ses profits ?
Modèle spécifique
Bien entendu, si aucune restriction n’était spécifiée, la solution serait de produire une infinité de chacun des produits puisque le critère à optimiser (maximiser) est 32x1`x2 oùx1 etx2 représentent les quantités de P1 et P2 produites.
On formule trois contraintes pour représenter les restriction de disponibilité de chacune des machines. Chaque contrainte stipule que la somme du temps requis par une machine
donnée pour les deux produits doit être inférieure ou égale à la disponibilité de la machine.
x1`x2 ď 400 (1.1)
2x1`x2 ď 600 (1.2)
x2 ď 300 (1.3)
On doit ajouter à nos restrictions le fait que la quantité produite e doit pas être négative, ce qui nous amène à formuler le modèle complet suivant :
max
xPR2
1.5x1`x2 (1.4)
sujet à x1`x2 ď 400 (1.5)
2x1`x2 ď 600 (1.6)
x2 ď 300 (1.7)
x1, x2 ě 0 (1.8)
La fonction qui sert de critère, ici 1.5x1 `x2 se nomme critère, ou encore fonction objec- tif, parfoisfonction économique, également simplement “objectif”. Les autres inégalités sont nommées contraintes. Les contraintes auraient aussi pu être des égalités, comme nous le verrons plus tard.
Il faut faire attention, en anglais, le terme fonction objectif se traduit objective function et c’est une faute (anglicisme) en français de dire “fonction objective”.
Les x qui satisfont à toutes les contraintes sont dits solution réalisables et l’ensemble réalisable aussi nommé domaine réalisable est composé de toutes les solutions réalisables.
Parmi celles-ci, la solution recherchée se nomme solution optimale.
Modèle générique
Notre situation aurait fort bien pu comporter plus de deux produits, disons n. Similai- rement, leur fabrication aurait pu nécessiter plus de trois machines, disons m. Dans ce cas, il est commode de définir un vecteur de coûts c “ pc1 c2 . . . cnq qui regroupe tous les coûts (profits) des n produits. Similairement, leur quantité est exprimée dans un vecteur x de n composantes. Pour ce qui est des contraintes, nous aurons m expressions impliquant les n quantités de produits, il est naturel de les spécifier dans une matricemˆn, disons A. Enfin, les limites de temps des machines auraient avantage à être regroupé dans un vecteur de dimension m, disons b. Habituellement, les contraintes de non négativité sur les variables x sont conservées telles quelles plutôt que d’être incorporées dans la matrice A. Le modèle générique s’écrit alors comme suit.
maxxPRn
cx “ ÿn
i“1
cixi (1.9)
sujet à Ax ď b (1.10)
x ě 0. (1.11)
Pour un vecteur x ě 0 signifie que toutes ses composantes sont non-négatives, c’est-à-dire xi ě 0,@i P t1,2, . . . , nu. Similairement, une relation Ax ď b signifie pAxqj ď bj,@j P t1,2, . . . , mu.
On peut retrouver le modèle spécifique qui a débuté cette discussion en fixant les valeurs appropriées n“2,m “3, c“`
1,5 1˘ ,b “
¨
˝ 400 600 300
˛
‚,A“
¨
˝ 1 1 2 1 0 1
˛
‚.
Langage de modélisation
Attardons-nous maintenant à transcrire le modèle dans un langage de modélisation, AMPLTM ou de la version logiciel ouvert GLPK.
AMPLTM (A Mathematical Programming Language) est un langage algébrique de mo- délisation très répandu. Ce langage peut être connecté sur des logiciels de résolution afin d’obtenir effectivement la solution des modèles. GLPK (GNU Linear Programming toolKit) offre l’essentiel des fonctionnalités de AMPLTM mais n’est lié à aucune contrainte commer- ciale.
1 set m a c h i n e ;
2 set p r o d u i t ;
3
4 p a r a m A { machine , p r o d u i t } >=0;
5
6 p a r a m b { m a c h i n e };
7
8 p a r a m c { p r o d u i t };
9
10 var x { p r o d u i t } >= 0 ;
11
12 m a x i m i z e p r o f i t _ t o t a l : sum { i in p r o d u i t } c [ i ] * x [ i ];
13
14 s u b j e c t to t e m p s _ r e q u i s { j in m a c h i n e }:
15 sum { i in p r o d u i t } A [ j , i ]* x [ i ] <= b [ j ];
Listing 1.1 – Premier modèle avec AMPL; fichier: AMPL/premiermodele.mod
Le modèle a donc été spécifié sans tenir compte des données, c’est le modèle génériqe. Exac- tement le même modèle pourrait servir avec cent produits et 2000 machines, les données seulement seraient différentes. Les données se retrouvent dans le fichier suivant.
1 d a t a;
2
3 set m a c h i n e := A B C ;
4 set p r o d u i t := P1 P2 ;
5
6 p a r a m b := A 400 B 600 C 3 0 0 ;
7
8 p a r a m c := P1 1.5 P2 1;
9
10 p a r a m A : P1 P2 :=
11 A 1 1
12 B 2 1
13 C 0 1;
Listing 1.2 – Premier modèle avec AMPL – données; fichier: AMPL/premiermodele.dat J’ai choisi une notation proche de la formulation vectorielle–matricielle. On peut aussi formuler le modèle avec des identificateurs plus proches de l’application. Par exemple, le modèle suivant est complètement équivalent. Évidemment, il faut ajuster le fichier “.dat”
pour que les données soient affectées aux bons identificateurs.
1 set m a c h i n e ;
2 set p r o d u i t ;
3
4 p a r a m t _ m a c h i n e _ p a r _ p r o d u i t { machine , p r o d u i t } >=0;
5
6 p a r a m d i s p o { m a c h i n e };
7
8 p a r a m p r o f i t { p r o d u i t };
9
10 var x { p r o d u i t } >= 0 ;
11
12 m a x i m i z e p r o f i t _ t o t a l : sum { i in p r o d u i t } p r o f i t [ i ] * x [ i ];
13
14 s u b j e c t to t e m p s _ r e q u i s { m in m a c h i n e }: sum { p in p r o d u i t }
15 t _ m a c h i n e _ p a r _ p r o d u i t [ m , p ]* x [ p ] <= d i s p o [ m ];
Listing 1.3 – Modèle avec AMPL; fichier: AMPL/ex1.1.mod
Maintenant, pour résoudre notre modèle, nous allons utiliser un outil en ligne de com- mande. Avant d’examiner le résultat, tentez tout de même de résoudre le problème pour identifier la production qui maximise les profits. Même pour un modèle jouet, cela nécessite un peu de réflexion et d’habileté calculatoire.
1 PROMPT > ampl
2 ampl : model ex1 .1. mod ;
3 ampl : data ex1 .1. dat ;
4 ampl : solve;
5 M I N O S 5 . 5 1 : o p t i m a l s o l u t i o n f o u n d .
6 2 i t e r a t i o n s , o b j e c t i v e 500
7 ampl : d i s p l a y x ;
8 x [*] :=
9 P1 200
10 P2 200
11 ;
12 ampl : quit
13 PROMPT >
On lit donc que la solution optimale est x1 “ x2 “ 200 et que la valeur de l’objectif est 500. Rappelons qu’en anglais, on dit “objective function” alors qu’en français, l’expression correcte est “fonction objectif”.
Dans la suite du chapitre, nous allons traiter plusieurs exemples de moins en moins simplistes. Nous utiliserons l’outil AMPL en ligne de commande pour en obtenir les solutions.
Plusieurs exercices seront proposés pour devenir efficaces dans la démarche de modélisation de situations décrites informellement.
1.2 Modèles variés de recherche opérationnelle
Le champ d’application probablement le plus répandu de l’optimisation linéaire provient de la recherche opérationnelle. Selon1, la recherche opérationnelle est cette discipline des mathématiques qui peut être définie comme l’ensemble des méthodes et techniques ration- nelles orientées vers la recherche du meilleur choix dans la façon d’opérer en vue d’aboutir au résultat visé ou au meilleur résultat possible.
1.2.1 Diète
Situation à modéliser
Un éleveur dispose de trois types de grains pour nourrir ses animaux. Chaque type de grain comporte différentes quantités de quatre éléments nutritifs. L’éleveur connaît la quan- tité de chaque élément nutritif requis pour nourrir ses animaux ainsi que le coût au kilo de chacun des grains, données résumées dans le tableau suivant.
L’éleveur veut déterminer la quantité de chaque grain pour constituer un mélange qui, na- turellement, comblera tous les besoins en nutriments et ce, en minimisant le cout total.
1. https://fr.wikipedia.org/wiki/Recherche_opérationnelle
grain 1 grain 2 grain 3 besoins hebdomadaires
nutriment A 2 3 7 1250
nutriment B 1 1 0 250
nutriment C 5 3 0 900
nutriment D 1.2 1.2 1 232.5
Coût/kg 41 35 96
Table 1.1 – Données du problème de diète Modèle générique
La situation est déjà décrite dans une forme très proche du modèle générique. Considérons nsortes de grains,m nutriments, Une matriceAdencolonnes etmlignes décrivant l’apport de chaque grain à un nutriment donné, un vecteur b de besoins en nutriments et un vecteur cde coûts des grains. Le modèle générique s’écrit alors comme suit.
min cx (1.12)
sujet à Ax ě b (1.13)
x ě 0. (1.14)
La différence avec notre premier modèle jouet est que l’objectif est ici de minimiser plutôt que de maximiser et les contraintes sont de type “plus grand ou égal” plutôt que “plus petit ou égal”.
On peut retrouver le modèle spécifique ci-haut en fixant les valeurs appropriées n “ 3, m“4,c“`
41 35 96˘ ,b “
¨
˚
˚
˝ 1250
250 900 232.5
˛
‹
‹
‚ , A“
¨
˚
˚
˝
2 3 7
1 1 0
5 3 0
1.5 1.2 1
˛
‹
‹
‚ .
Langage de modélisation
Ce modèle est tellement répandu que sa version générique fait partie des exemples de AMPL. En fait, le modèle est un petit peu plus général car il incorpore des bornes des deux côtés f_minďxďf_max et n_minďAxďn_max.
1 set N U T R ;
2 set F O O D ;
3
4 p a r a m c o s t { F O O D } > 0;
5 p a r a m f _ m i n { F O O D } >= 0;
6 p a r a m f _ m a x { j in F O O D } >= f _ m i n [ j ];
7
8 p a r a m n _ m i n { N U T R } >= 0;
9 p a r a m n _ m a x { i in N U T R } >= n _ m i n [ i ];
10
11 p a r a m amt { NUTR , F O O D } >= 0;
12
13 var Buy { j in F O O D } >= f _ m i n [ j ] , <= f _ m a x [ j ]; # Buy est le x ...
14
15 m i n i m i z e t o t a l _ c o s t : sum { j in F O O D } c o s t [ j ] * Buy [ j ];
16
17 s u b j e c t to d i e t { i in N U T R }:
18 n _ m i n [ i ] <= sum { j in F O O D } amt [ i , j ] * Buy [ j ] <= n _ m a x [ i ];
Listing 1.4 – Modèle de diète; fichier: AMPL/diet.mod
Exercice 1.2.1 [Diète de AMPL] Adaptez les fichiers diet.mod et diet.dat aux no- tations utilisées ci-haut, les vecteurs b et c, la matrice A. Validez votre adaptation en résolvant les modèles à l’aide de l’outil AMPL en ligne de commande.
En ajustant les identificateurs, voici les données du modèle spécifique. Nous avons spécifié des bornes infinies pour représenter notre modèle qui ne comporte aucune borne supérieure.
1
2 set N U T R := A B C D ;
3 set F O O D := g r a i n 1 g r a i n 2 g r a i n 3 ;
4
5 p a r a m: c o s t f _ m i n f _ m a x :=
6 g r a i n 1 41 0 I n f i n i t y
7 g r a i n 2 35 0 I n f i n i t y
8 g r a i n 3 96 0 I n f i n i t y ;
9
10 p a r a m: n _ m i n n _ m a x :=
11 A 1 2 5 0 I n f i n i t y
12 B 250 I n f i n i t y
13 C 900 I n f i n i t y
14 D 2 3 2 . 5 I n f i n i t y ;
15
16 p a r a m amt :
17 g r a i n 1 g r a i n 2 g r a i n 3 :=
18 A 2 3 7
19 B 1 1 0
20 C 5 3 0
21 D 1.5 1.2 1;
Listing 1.5 – Données pour le modèle de diète ci-haut; fichier: AMPL/dietH.dat La solution est :
14 PROMPT > ampl
15 ampl : model diet . mod ;
16 ampl : data d i e t H . dat ;
17 ampl : solve;
18 M I N O S 5 . 5 1 : o p t i m a l s o l u t i o n f o u n d .
19 4 i t e r a t i o n s , o b j e c t i v e 1 4 5 8 3 . 3 3 3 3 3
20 ampl : d i s p l a y Buy ;
21 Buy [*] :=
22 g r a i n 1 0
23 g r a i n 2 4 1 6 . 6 6 7
24 g r a i n 3 0
Voici maintenant un fichier de données tel que l’exemple classique de AMPL.
1
2 set N U T R := A B1 B2 C ;
3 set F O O D := B E E F CHK F I S H HAM MCH MTL SPG TUR ;
4
5 p a r a m: c o s t f _ m i n f _ m a x :=
6 B E E F 3 . 1 9 0 100
7 CHK 2 . 5 9 0 100
8 F I S H 2 . 2 9 0 100
9 HAM 2 . 8 9 0 100
10 MCH 1 . 8 9 0 100
11 MTL 1 . 9 9 0 100
12 SPG 1 . 9 9 0 100
13 TUR 2 . 4 9 0 100 ;
14
15 p a r a m: n _ m i n n _ m a x :=
16 A 700 1 0 0 0 0
17 C 700 1 0 0 0 0
18 B1 700 1 0 0 0 0
19 B2 700 1 0 0 0 0 ;
20
21 p a r a m amt ( tr ):
22 A C B1 B2 :=
23 B E E F 60 20 10 15
24 CHK 8 0 20 20
25 F I S H 8 10 15 10
26 HAM 40 40 35 10
27 MCH 15 35 15 15
28 MTL 70 30 15 15
29 SPG 25 50 25 15
30 TUR 60 20 15 10 ;
Listing 1.6 – Données pour le modèle de diète AMPL; fichier: AMPL/diet.dat
et sa solution
25 M I N O S 5 . 5 1 : o p t i m a l s o l u t i o n f o u n d .
26 6 i t e r a t i o n s , o b j e c t i v e 88.2
27 ampl : d i s p l a y Buy ;
28 Buy [*] :=
29 BEEF 0
30 CHK 0
31 FISH 0
32 HAM 0
33 MCH 4 6 . 6 6 6 7
34 MTL 1 . 5 7 6 1 8 e -15
35 SPG 8 . 4 2 9 8 2 e -15
36 TUR 0
Les quantités bizarres de MTL et SPG sont dûes à des erreurs d’arrondi dans les calculs numériques. Les ordinateurs calculent en général avec environ 16 décimales de précision et des quantités de l’ordre de 10´15 sont en fait des 0 pollués d’erreurs d’arrondi. Donc, la diète optimale ne comporte que des MCH (“Mac & Cheese”). Remarquons que dans les deux exemples, la diète optimale ne comporte qu’un seul aliment. On pourrait qualifier cette solution d’extrême. Le premier à s’intéresser à un tel modèle de diète fut Stigler [5].
Sa liste d’aliments comportait 77 items et il avait minimisé le coût d’alimentation annuelle d’un homme de corpulence moyenne en assurant de combler ses besoins nutritionnels décrits par les neuf nutriments calories, protéines, calcium, fer, vitamine A, thiamine, riboflavine, niacine et acide ascorbique. Stigler a effectué son étude avant l’invention de l’algorithme du simplexe, aussi avait-il utilisé des calculs intuitifs pour estimer le coût minimal de 39.93$.
Vous avez le modèle AMPL, la solution optimale est la suivante :
Diète annuelle à coût minimum
Aliment Unité Quantité/an coût unitaire ($) Coût total ($)
Farine de blé enrichie 10 lb. 29.95 0.36 10.78
Foie de boeuf 1 lb. 2.58 0.268 0.69
Chou 1 lb. 110.70 0.037 4.10
Épinards 1 lb. 22.58 0.081 1.83
Haricots blancs, séchés 1 lb. 377.81 0.059 22.29
Total : 39.69 Comme on peut l’observer, le menu annuel est “extrême”, ne comportant que cinq aliments à consommer toute l’année ! Nous verrons que c’est une caractéristique des problèmes d’optimi- sation linéaire, il existe toujours une solution optimalepoint extrêmede l’ensemble réalisable et l’algorithme du simplexe détermine un tel point extrême optimal.
1.2.2 Modèle de production
Situation à modéliser
Une entreprise fabrique trois produits : P1,P2 etP3. Chaque unité des produitsP1,P2 et P3 doit être réalisée à l’aide de trois machines, M1,M2 etM3. Les disponibilités annuelles de chaque machine et les temps opératoires, en minutes, pour la réalisation de chaque produit sont résumés dans le tableau suivant.
Machine Disponibilité Temps requis (en minutes) P1 P2 P3
M1 90 000 2 4 3
M2 84 000 3 6 —
M3 52 000 1 3 2
Les coûts de fabrication d’une unité de chacun des produits P1, P2 et P3 comportent les coûts de main d’œuvre de 0.25 $, 0.50 $ et 0.25$ et les coûts de matière première 2.00 $, 2.50 $ et 2.25$.
Le gérant de l’entreprise a approuvé un budget d’une valeur maximale de $10 000 pour la main d’oeuvre et $80 000 pour les matières premières. Pour répondre à la demande d’un client l’entreprise doit fabriquer au moins 4 000 unités du produit P3. Les prix de vente par unité sont de $10.75 pour P1, $15.00 pour P2 et $10.00 pour P3. On demande de formuler le modèle linéaire qui permettrait d’obtenir le programme optimal de fabrication.
Modèle générique
Ce modèle est très semblable à notre premier modèle que nous avions détaillé. Profitons en pour introduire un peu de terminologie.
Objectif Tout d’abord, il nous faut établir quelle est la fonction objectif. Ce n’est pas mentionné explicitement, on dit simplement “obtenir le programme optimal de fabrication”.
Doit-on réduire les coûts ? Non, car une valeur budgétaire sur les coûts a été pré-approuvée.
On doit donc maximiser les recettes de vente. Ceci dit, même si les coûts (main d’œuvre et matière première) ont été pré-approuvés, il n’est pas certain que la meilleure solution utilise la totalité du budget pré-approuvé. S’il reste du budget, ce sera encore mieux. On arrive donc à une fonction objectif qui calcule les recettes et qui en déduit les coûts effectifs.
On pourrait imaginer que le décideur souhaite épuiser le budget pré-approuvé. On pour- rait également imaginer que peu importe ce qui n’est pas dépensé du budget pré-approuvé, seuls les revenus de vente doivent être maximisés. Nous avons opté pour l’interprétation qui maximise les revenus de vente desquels on déduit les dépenses sans dépasser les montants pré-approuvés.
Variables de décision Maintenant, sur quoi avons-nous le contrôle pour atteindre notre objectif ? Ces quantités, dans notre exemple les quantités produites de chacun des produits, sont nommées variable de décision. Les variables de décision sont au nombre de n“3 dans notre exemple comportant la production de trois produits. Il est à noter que ces variables de décision ne doivent pas être négatives, impliquant une borne de non-négativité. De plus, on apprend qu’il faut produire au moins 4 000 items de P3, donc les bornes inférieures sont soit zéro, soit la quantité spécifiée.
Contraintes En plus des bornes notre situation fait état de limites sur l’utilisation de res- sources. Quelles sont donc les ressources dont nous avons besoin pour réaliser la production ? Il s’agit de temps sur m1 “3 machines, de limite dem2 “2 types de coûts :
1. de main d’œuvre 2. de matières premières.
Ceci totalise m“m1`m2 “5 contraintes dans l’exemple.
AMPL
Examinons directement une formulation AMPL du modèle générique.
1 set m a c h i n e ; # 3 m a c h i n e s d a n s n o t r e e x e m p l e s p é c i f i q u e
2 set p r o d u i t ; # 3 p r o d u i t s d a n s n o t r e e x e m p l e s p é c i f i q u e
3
4 set f r a i s ; # d e u x t y p e s de f r a i s
5
6 p a r a m p r i x { p r o d u i t } >0; # p r i x de v e n t e des p r o d u i t s
7 p a r a m q m i n { p r o d u i t } >= 0; # q u a n t i t é m i n i m a l e à p r o d u i r e
8
9 p a r a m t e m p s { machine , p r o d u i t }; # t e m p s m a c h i n e / p r o d u i t
10 p a r a m t d i s p o n i b l e { m a c h i n e }; # d i s p o n i b i l i t é des m a c h i n e s
11 p a r a m b u d g e t { f r a i s }; # b u d g e t pré - a p p r o u v é
12
13 p a r a m fp { frais , p r o d u i t }; # f r a i s par p r o d u i t
14
15 # v a r i a b l e s de d é c i s i o n s , q u a n t i t é s p r o d u i t e s
16 var qte { j in p r o d u i t } >= q m i n [ j ];
17
18 m a x i m i z e p r o f i t _ t o t a l :
19 sum { j in p r o d u i t }( p r i x [ j ] - sum { i in f r a i s } fp [ i , j ])* qte [ j ];
20
21 s u b j e c t to
22 t e m p s T o t { i in m a c h i n e }:
23 sum { j in p r o d u i t } t e m p s [ i , j ] * qte [ j ] <= t d i s p o n i b l e [ i ];
24 d e p e n s e { i in f r a i s }:
25 sum { j in p r o d u i t } fp [ i , j ] * qte [ j ] <= b u d g e t [ i ];
Listing 1.7 – Modèle de production générique; fichier: AMPL/ex1.2b.mod
Il suffit maintenant de préciser les valeurs du modèle spécifique dans le fichier approprié.
1 set m a c h i n e := M1 M2 M3 ;
2 set p r o d u i t := P1 P2 P3 ;
3
4 set f r a i s := M O e u v r e M p r e m i e r e ;
5
6 p a r a m t e m p s : P1 P2 P3 :=
7 M1 2 4 3
8 M2 3 6 0
9 M3 1 3 2;
10
11 p a r a m fp : P1 P2 P3 :=
12 M O e u v r e 0 . 2 5 0 . 5 0 0 . 2 5
13 M p r e m i e r e 2 . 0 0 2 . 5 0 2 . 2 5 ;
14
15 p a r a m p r i x :=
16 P1 1 0 . 7 5
17 P2 1 5 . 0 0
18 P3 1 0 . 0 0 ;
19
20 p a r a m q m i n :=
21 P1 0.0
22 P2 0.0
23 P3 4 0 0 0 . 0 ;
24
25 p a r a m b u d g e t :=
26 M O e u v r e 1 0 0 0 0
27 M p r e m i e r e 8 0 0 0 0 ;
28
29 p a r a m t d i s p o n i b l e :=
30 M1 9 0 0 0 0
31 M2 8 4 0 0 0
32 M3 5 2 0 0 0 ;
Listing 1.8 – Données du modèle de production spéfifique; fichier: AMPL/ex1.2b.dat On spécifie dans un fichier les commandes pour résoudre le modèle, ici le fichierex1.2.cmd.
1 m o d e l ex1 .2 b . mod ;
2 d a t a ex1 .2 b . dat ;
3 s o l v e;
4 d i s p l a y qte ;
Listing 1.9 – Instructions pour résoudre le modèle; fichier: AMPL/ex1.2.cmd La solution optimale telle que calculée est la suivante.
1 PROMPT > a m p l ex1 .2. cmd
2 M I N O S 5 . 5 1 : o p t i m a l s o l u t i o n f o u n d .
3 2 i t e r a t i o n s , o b j e c t i v e 3 1 8 0 0 0
4 qte [*] :=
5 P1 2 8 0 0 0
6 P2 0
7 P3 1 0 6 6 6 . 7
Listing 1.10 – Session AMPL
Solution entière
Cette solution n’est pas complètement satisfaisante ; en effet, la quantité optimale de P3 n’est pas entière. Pour un tel modèle jouet, on peut imaginer “arrondir” la solution, par exemple produire 10 667 de P3. Cependant, ce n’est pas mathématiquement rigoureux. Les techniques pour aborder cette restriction supplémentaire que la solution doit être entière seront survolées à la section 7.3.
On peut spécifier dans le modèle AMPL que la solution doit être entière. Remarquez que l’unique différence est l’ajout du mot clef integerà la ligne de définition de la variableqte, ligne 16 dans le listing suivant.
1 set m a c h i n e ; # 3 m a c h i n e s d a n s n o t r e e x e m p l e s p é c i f i q u e
2 set p r o d u i t ; # 3 p r o d u i t s d a n s n o t r e e x e m p l e s p é c i f i q u e
3
4 set f r a i s ; # d e u x t y p e s de f r a i s
5
6 p a r a m p r i x { p r o d u i t } >0; # p r i x de v e n t e des p r o d u i t s
7 p a r a m q m i n { p r o d u i t } >= 0; # q u a n t i t é m i n i m a l e à p r o d u i r e
8
9 p a r a m t e m p s { machine , p r o d u i t }; # t e m p s m a c h i n e / p r o d u i t
10 p a r a m t d i s p o n i b l e { m a c h i n e }; # d i s p o n i b i l i t é des m a c h i n e s
11 p a r a m b u d g e t { f r a i s }; # b u d g e t pré - a p p r o u v é
12
13 p a r a m fp { frais , p r o d u i t }; # f r a i s par p r o d u i t
14
15 # v a r i a b l e s de d é c i s i o n s , q u a n t i t é s p r o d u i t e s
16 var qte { j in p r o d u i t } i n t e g e r >= q m i n [ j ];
17
18 m a x i m i z e p r o f i t _ t o t a l :
19 sum { j in p r o d u i t }( p r i x [ j ] - sum { i in f r a i s } fp [ i , j ])* qte [ j ];
20
21 s u b j e c t to
22 t e m p s T o t { i in m a c h i n e }:
23 sum { j in p r o d u i t } t e m p s [ i , j ] * qte [ j ] <= t d i s p o n i b l e [ i ];
24 d e p e n s e { i in f r a i s }:
25 sum { j in p r o d u i t } fp [ i , j ] * qte [ j ] <= b u d g e t [ i ];
Listing 1.11 – Modèle de production générique — solution entière; fichier: AM- PL/ex1.2bInt.mod
On doit alors utiliser un logiciel de résolution capable de traiter ces nouveaux problèmes.
MINOS, le logiciel que AMPL utilise par défaut n’en est pas capable. Nous allons utiliser
“gurobi”.
1 m o d e l ex1 .2 b I n t . mod ;
2 d a t a ex1 .2 b . dat ;
3 o p t i o n s o l v e r ’ / h o m e / d u s s a u l t / i m p o r t / a m p l i d e . l i n u x 6 4 / g u r o b i ’ ;
4 s o l v e;
5 d i s p l a y qte ;
Listing 1.12 – Instructions pour résoudre le modèle avec solution entière; fichier: AM- PL/ex1.2Int.cmd
La solution optimale telle que calculée est la suivante.
1 PROMPT > a m p l ex1 .2 Int . cmd
2 G u r o b i 8 . 0 . 0 : o p t i m a l s o l u t i o n; o b j e c t i v e 3 1 7 9 9 5
3 3 s i m p l e x i t e r a t i o n s
4 1 branch -and- cut n o d e s
5 qte [*] :=
6 P1 2 8 0 0 0
7 P2 0
8 P3 1 0 6 6 6
Listing 1.13 – Session AMPL
L’idée naïve d’arrondir à P3 = 10 667 ne fonctionnait pas, cette solution impose alors que P1 = 27 999 et le profit en est 317 994$, un de moins que la solution optimale. Dans d’autres situations moins simplistes, arrondir peut produire une solution qui ne satisfait pas les contraintes.
Exercice 1.2.2 [Variantes de modèle de production] Adaptez les fichiers ex1.2b.mod et ex1.2b.datpour y implémenter deux variantes de fonction objectif selon les choix évoqués au début de la présentation.
a) choix de négliger les surplus budgétaires pré-alloués ;
b) choix de contraindre les budgets à être exactement égaux aux montants pré-approuvés.
Exécutez AMPL sur les modèles ainsi modifiés et interprétez les résultats.
Inspecter le modèle AMPL
Il est parfois bien commode de pouvoir avoir une vue complète de la matrice A qui re- groupe toutes les contraintes. Ici, nous avons des contraintes de temps et des contraintes budgétaires qui ont été énumerées séparément. Quel est le portrait global ? Voici une marche à suivre pour examiner tout modèle AMPL. Notre modèle est spécifié dans les fichiers ex1.2b.mod et ex1.2b.dat.
1. Produire un fichier ex1.2b.nl.
1 a m p l : m o d e l ex1 .2 b . mod ;
2 a m p l : d a t a ex1 .2 b . dat ;
3 a m p l : w r i t e g e x 1 .2 b ;
Listing 1.14 – Session AMPL
2. Utiliser Scilab pour charger le modèle à l’aide du fichier ex1.2b.nl.
1 - - >[ asl , x , bl , bu , v , cl , cu ] = a m p l _ i n i t ( " ex1 .2 b . nl " );
Listing 1.15 – Session Scilab
Ceci charge le modèle dans aslet retourne
‚ x une valeur initiale pour x; inutilisé dans notre cas ;
‚ bl etbu les bornes inférieures et supérieures des contraintes ;
‚ v une valeur initiale pour les variables duales ; nous apprendrons plus tard ce que ça signifie, inutilisé dans notre cas ;
‚ cl etcu les bornes inférieures et supérieures des variables.
3. Utiliser Scilab pour interroger le modèle asl.
1 - - >[ c , At ] = a m p l _ e v a l _ s p _ g ( asl , x );
2 - - > A = full ( At );
3 - - > A ’
4 ␣ A ’ =
5 2. 4. 3.
6 3. 6. 0.
7 1. 3. 2.
8 0.25 0.5 0.25
9 2. 2.5 2.25
Remarquons que tel que décrit dans la documentation, la matrice produite est la transpo- sée de la matrice des contraintes dans une représentation de matrices creuses.full(At) la converti dans le format usuel pour lecture par un humain.
On peut aussi voir le vecteur de coûts résultant de l’escompte des budgets pré-approuvés.
Ce vecteur est un vecteur colonne, sa transposée est la ligne.
10 - - > c ’
11 c ’ =
12 8.5 12. 7.5
1.2.3 Problème de transport
Une entreprise dispose de deux entrepôts A1 etA2 pour un produit destiné à satisfaire la demande de trois clientsB1, B2 etB3. La quantité du produit, disponible à chaque entrepôt et les demandes des clients sont spécifiés dans le tableau suivant, qui contient également le coût de transporter une unité du produit d’un entrepôt à chaque client.
B1 B2 B3 disponibilité
A1 1 4 9 200
A2 6 8 4 500
demande 200 400 100 700
On désire déterminer quelle quantité chaque client reçoit de chaque entrepôt pour minimiser le coût total de transport tout en satisfaisant les demandes. Remarquons que ce modèle simpliste équilibre la quantité totale entreposée avec la demande totale des clients.
Modèle générique
Cette situation est tellement répandue que l’on peut trouver une solution AMPL parmis les exemples de la documentation de AMPL.
On nomme habituellement origine les points de départ du transport, les entrepôts dans notre exemple et destination les points d’arrivées, les clients de notre exemple. Il est avan- tageux d’utiliser deux indices pour les variables de décision, xi,j qui représente la quantité transportée de l’origine i vers la destination j. De même les coûts ci,j comportent deux in- dices. On considèren1 origines et n2 destinations. On ajoute un vecteur de demandedPRn1 et un vecteur de disponibilité bPRn2 et le modèle complet s’écrit comme suit.
min
xPRn1ˆn2 cx “
n1
ÿ
i“1 n2
ÿ
j“1
ci,jxi,j (1.15)
sujet à
n1
ÿ
i“1
xi,j “ dj, @j P t1 :n2u (1.16)
n2
ÿ
j“1
xi,j “ bi, @iP t1 :n1u (1.17)
x ě 0. (1.18)
AMPL
Ce modèle classique est un des exemple de AMPL.
1 set O R I G ; # o r i g i n s
2 set D E S T ; # d e s t i n a t i o n s
3
4 p a r a m s u p p l y { O R I G } >= 0; # a m o u n t s a v a i l a b l e at o r i g i n s
5 p a r a m d e m a n d { D E S T } >= 0; # a m o u n t s r e q u i r e d at d e s t i n a t i o n s
6
7 c h e c k: sum { i in O R I G } s u p p l y [ i ] = sum { j in D E S T } d e m a n d [ j ];
8
9 p a r a m c o s t { ORIG , D E S T } >= 0; # s h i p m e n t c o s t s per u n i t
10 var T r a n s { ORIG , D E S T } >= 0; # u n i t s to be s h i p p e d
11
12 m i n i m i z e t o t a l _ c o s t :
13 sum { i in ORIG , j in D E S T } c o s t [ i , j ] * T r a n s [ i , j ];
14
15 s u b j e c t to S u p p l y { i in O R I G }:
16 sum { j in D E S T } T r a n s [ i , j ] = s u p p l y [ i ];
17
18 s u b j e c t to D e m a n d { j in D E S T }:
19 sum { i in O R I G } T r a n s [ i , j ] = d e m a n d [ j ];
Listing 1.16 – Modèle de transport générique; fichier: AMPL/transp.mod
Pour notre situation, il suffit de spécifier les données. Remarquons que les variables du modèle sont nommées Trans plutôt que x, xØTrans.
1
2 p a r a m: O R I G : s u p p l y := # d e f i n e s set " O R I G " and p a r a m " s u p p l y "
3 A1 200
4 A2 5 0 0 ;
5
6 p a r a m: D E S T : d e m a n d := # d e f i n e s " D E S T " and " d e m a n d "
7 B1 200
8 B2 400
9 B3 100 ;
10
11 p a r a m c o s t :
12 B1 B2 B3 :=
13 A1 1 4 9
14 A2 6 8 4 ;
Listing 1.17 – Données du modèle de trsansport générique; fichier: AMPL/transpH.dat On obtient la solution de la manière habituelle.
1 a m p l : m o d e l t r a n s p . mod ;
2 a m p l : d a t a t r a n s p H . dat ;
3 a m p l : s o l v e;
4 M I N O S 5 . 5 1 : o p t i m a l s o l u t i o n f o u n d .
5 3 i t e r a t i o n s , o b j e c t i v e 3 8 0 0
6 a m p l : d i s p l a y T r a n s ;
7 T r a n s :=
8 A1 B1 200
9 A1 B2 0
10 A1 B3 0
11 A2 B1 - 2 . 7 7 5 5 6 e -14
12 A2 B2 400
13 A2 B3 100
Listing 1.18 – Session AMPL
1.2.4 Problème d’entreposage
On considère entreposer un produit pour vente future. Notre situation s’échelonne sur trois périodes successives. À chaque période, on peut acheter et/ou vendre et le prix unitaire de vente est égal au prix d’achat tel que spécifié dans le tableau suivant. De plus, l’entreposage coûte 1.00$ par période et la capacité de l’entrepôt est de 60 unités. L’idée est donc d’acheter aux périodes de faible prix pour revendre à celles où les prix sont élevés.
Période (t) Prix unitaire ($)
1 4
2 9
3 6
On a 30 unités au départ. On veut déterminer une stratégie d’achat/vente pour maximiser les profits totaux sur les trois périodes.
Modèle générique
On peut formuler directement le modèle pour un nombre de périodes arbitraire, disons n. Quelles sont nos variables de décision ? Pour chaque période i P t1 : nu, les quantités à entreposer ei, à acheter ai et à vendre vi. On a également une quantité initiale imposée, nommons lae0. Nous sommes en présence d’un modèle dynamique qui décritei “ei´1`ai´vi, en mots, la quantité entreposée à la période i est celle entreposée à la période précédente à laquelle on ajoute la quantité achetée à la période courante et de laquelle on retranche la quantité vendue à la période courante. Par exemple, à la première période, la quantité entreposée e1 est cette quantité imposée e0 “30 moins ce qu’on a vendu v1 plus ce qu’on a acheté a1.
Qu’est-ce que ces quantités changent à notre profit ? À la périodei, on vendvi avec profit ci mais on achète ai au coût ci, pour un bénéfice net cipvi ´aiq. Également, on doit payer ei d’entreposage. Généralisons et nommons les frais d’entreposagefi, dans notre cas,fi “1.
Nous pouvons donc formuler le modèle complet. Les coût d’entreposage à la période “0” ne font pas partie du modèle car nous n’avons aucune décision à prendre à leur sujet.
a,v,ePmaxRn
cpv´aq ´f e “
n
ÿ
i“1
pcipvi´aiq ´fieiq (1.19) sujet à ei “ ei´1`ai´vi, @iP t1 :nu (1.20)
e ď 60, (1.21)
e, a, v ě 0. (1.22)
Une simplification Remarquons que les variables a (achats) et v (ventes) sont toujours utilisées ensemble selon la formule a´v. On pourrait définir une variable t (transaction)
telle queti représente la quantité transigée à la périodei, si positive, il s’agit d’une vente et autrement, d’un achat. Donc, dans les faits, ti “vi´ai et on peut reformuler notre modèle comme suit, la variable t est libre, c’est-à-dire d’est pas contrainte à être positive.
t,ePmaxRn
ct´f e “
n
ÿ
i“1
pciti´fieiq (1.23)
sujet à ei “ ei´1`ti, @iP t1 :nu (1.24)
e ď 60, (1.25)
e ě 0. (1.26)
AMPL
1 p a r a m N >0;
2
3 set p e r i o d e s := 0.. N ;
4
5 p a r a m Cap > 0;
6
7 p a r a m c { i in p e r i o d e s : i > 0 } ;
8 p a r a m f { i in p e r i o d e s : i > 0 } ;
9
10 var e { p e r i o d e s } >= 0 , <= Cap ;
11
12 var t { i in p e r i o d e s : i >0} ;
13
14 m a x i m i z e p r o f i t : sum { i in p e r i o d e s : i >0} ( c [ i ]* t [ i ] - f [ i ]* e [ i ]);
15
16 s u b j e c t to e q u i l i b r e { i in p e r i o d e s : i > 0 } : e [ i ] = e [ i -1] - t [ i ];
17 i n i t i a l e : e [0] = 30;
Listing 1.19 – Modèle d’entreposage générique; fichier: AMPL/ex1.4.mod
Pour notre situation, il suffit de spécifier les données. Remarquons que la capacité de l’en- trepôt est représentée par le paramètre Cap.
1 p a r a m N := 3;
2
3 p a r a m Cap := 60;
4
5 p a r a m c := 1 4
6 2 9
7 3 6;
8
9 p a r a m f := 1 1
10 2 1
11 3 1;
Listing 1.20 – Données du modèle d’entrepôt générique; fichier: AMPL/ex1.4.dat On obtient la solution de la manière habituelle.
1.2.5 Problème du barman
Situation à modéliser
Adapté plutôt librement de2. Le contexte est la préparation d’un 5 à 7 spécial pour la faculté. En plus des boissons santé et du choix habituel de bières artisanales, un des organisateurs voudrait offrir des cocktails. Comme il est hors de question de les préparer sur place selon la demande, il voudrait préparer à l’avance une certaine quantité de mélanges pour maximiser le montant de ses ventes de la soirée. Il se dit que tout devrait se vendre, quand il n’y aura plus d’un mélange donné, les participants en choisiront un autre. Pour cette première expérience avec de tels mélanges, il dispose de
‚ 1 litre de whisky écossais (42$/l)
‚ 1 litre de whisky américain (37$/l)
‚ 1 litre de vermouth (23$)
‚ 2 litres de Gin (33$/l)
Pour cette première expérience, on se limite aux mélanges suivants. On ne mentionne que les alcools dans les ingrédients, mais d’autres ingrédients secrets entrent dans le mélange mais coûtent presque rien.
Mélange ingrédients prix
Whiskey sour 30 ml whisky 7$
Manhattan 30 ml whisky 10$
15 ml vermouth
Martini 30 ml gin 10$
15 ml vermouth Spécial maison 30 ml gin 14$
30 ml whisky
Quelle quantité de ces mélanges maximisera le montant des ventes de la soirée ?
2. http ://web.mit.edu/15.053/www/AMP.htm, exercice 5 du chapitre 2
Modèle générique en AMPL
Exprimons le modèle générique directement en utilisant AMPL. Nous avons à notre disposition un certain nombre d’alcools et un certain nombre de recettes. On considère qu’une recette vaut une unité, donc le profit total sera le prix d’une recette multiplié par le nombre de recettes vendues. Puisqu’on suppose que toutes les recettes préparées à l’avance seront vendues, le profit sera la somme des prix multiplié par la quantité des recettes préparées.
Les contraintes limitent la quantité utilisable de chacun des alcools, notre réserve. La somme des quantités d’un alcool donné utilisé pour toutes les recettes ne doit pas dépasser notre réserve de cet alcool.
Puisqu’on présume que tout sera vendu, le coût d’un litre d’alcool n’est pas utile pour notre modèle.
Donc, notre modèle générique est le suivant.
1 set a l c o o l ; # Nos c h o i x d ’ a l c o o l s
2 set r e c e t t e ; # Nos r e c e t t e s à p r o d u i r e
3
4 p a r a m q d i s p o n i b l e { a l c o o l } >0 ;# N o t r e r é s e r v e d ’ a l c o o l s
5 p a r a m p r i x { r e c e t t e } >0; # p r i x de v e n t e des p r o d u i t s
6
7 p a r a m i n g r e d i e n t { recette , a l c o o l } ;
8
9 # v a r i a b l e s de d é c i s i o n s , q u a n t i t é s p r o d u i t e s
10 var qte { j in r e c e t t e } ;
11
12 m a x i m i z e p r o f i t _ t o t a l :
13 sum { j in r e c e t t e } p r i x [ j ]* qte [ j ];
14
15 s u b j e c t to
16 R é s e r v e { i in a l c o o l }:
17 sum { j in r e c e t t e } i n g r e d i e n t [ j , i ] * qte [ j ] <= q d i s p o n i b l e [ i ];
Listing 1.21 – Modèle de barman générique; fichier: AMPL/barman1.mod
Maintenant, observons que les recettes ne spécifient pas la sorte de whisky, donc on peut considérer un seul alcool de type whiskyW dont on a deux litres, un litre de Ve et deux litres de Gi. Les unités du modèle sont des millilitres et notre instance donne les données suivantes.
1 set a l c o o l := W Ve Gi ;
2 set r e c e t t e := WS Man Mar Sp ;
3
4 p a r a m i n g r e d i e n t : W Ve Gi :=
5 WS 30 0 0
6 Man 30 15 0