TP : modélisation avec le langage AMPL 1 AMPL et la
Transcription
TP : modélisation avec le langage AMPL 1 AMPL et la
TP : modélisation avec le langage AMPL 1 AMPL et la programmation linéaire L’objectif de ce TP est une initiation à l’utilisation du langage de modélisation AMPL (A Mathematical Programming Language) https://en.wikipedia.org/wiki/AMPL ou https://www.artelys.com/fr/composants-numeriques/ampl. 2 What’s AMPL From AMPL website (http://www.ampl.com/) : AMPL is a comprehensive and powerful algebraic modeling language for linear and nonlinear optimization problems, in discrete or continuous variables. Developed at Bell Laboratories, AMPL lets you use common notation and familiar concepts to formulate optimization models and examine solutions, while the computer manages communication with an appropriate solver. AMPL’s flexibility and convenience render it ideal for rapid prototyping and model development, while its speed and control options make it an especially efficient choice for repeated production runs. It can also used as a programming language. 3 AMPL basics One simple way to use AMPL is to create some text files, containing the details of the optimization problem we want to solve, and pass them to AMPL for obtaining the solution. Usually, 3 text files are needed : 1. the model file (it usually has the .mod extension) : it contains the definition of the parameters, the variables, the objective function, the constraints. Parameters and variables can have different types (binary, integer, etc) ; vectors and matrices of variables or parameters can be defined. 2. the data file (it usually has the .dat extension) : it contains all information for the definition of an instance of the problem (same model but with different data). In this file, numerical values can be associated to the parameters defined in the model file. 3. the run file (it usually has the .run extension) : it contains additional information, such as the files AMPL needs to collect to solve the problem (the name of the model file and the name of the data file) and the name of the solver it needs to use. 1 4 A simple example Let us consider a simple optimization problem. We will write the 3 text files described in the previous section, and we will use them in order to solve this problem with AMPL and CPLEX. We consider a diet problem : we want to minimize the cost of the food we eat while some nutritional constraints (calories, sugar and fat levels, etc) are satisfied. This is the list of food : 1. chocolate candies, 2. chocolate ice cream, 3. coca cola, 4. cheesecake. Suppose we have a vector x, where xi represents the quantity of food i. x represents the set of decision variables of the following optimization problem : min 50x1 + 20x2 + 30x3 + 80x4 x (each xi ≥ 0 is weighted with the cost) subject to 400x1 3x1 2x1 2x1 + + + + 200x2 + 150x3 + 500x4 2x2 2x2 + 4x3 + 4x4 4x2 + x3 + 5x4 ≥ ≥ ≥ ≥ 500 calories 6 chocolate 10 sugar 8 fat The file diet.mod # parameters and variables param N, integer, >0; # quantity of food param c {1..N}, >0; # vector, the cost of each food param a {1..N,1..N+1}; # matrix associated to nutritional constraints var x {1..N}, >= 0; # the decision variables # the optimization problem objective minimize totalcost : sum{i in 1..N} c[i]*x[i]; # the constraints subject to nutrition {i in 1..N} : sum{j in 1..N} a[i,j]*x[j] >= a[i,N+1]; The file diet.dat param N := 4; param : c := 1 50 2 2 20 3 30 4 80 ; param : a := 1 1 400 1 2 200 1 3 150 1 4 500 1 5 500 2 1 3 2 2 2 2 3 0 2 4 0 2 5 6 3 1 2 3 2 2 3 3 4 3 4 4 3 5 10 4 1 2 4 2 4 4 3 1 4 4 5 4 5 8 ; The file diet.run model diet.mod; data diet.dat; option solver cplexamp; solve; display totalcost; display x; Execution with AMPL $ ampl diet.run CPLEX 11.0.0: optimal solution; objective 90 2 dual simplex iterations (0 in phase I) totalcost = 90 3 x [*] := 1 0 2 3 3 1 4 0 ; 5 FAQ La chose la plus importante lorsque vous souhaitez résoudre un problème avec ampl et de bien séparer votre modèle et vos donnees. 1. Un paramètre c’est quelque chose que vous vous engagez a fournir de façon explicite dans votre fichier .dat. Une variable c’est un element de solution qui doit etre affecte par le solveur. 2. Lisez bien l’enonce de votre probleme : tous les entiers presents vont se retrouver sous la forme de paramètres dans votre fichier data. Ils ne devront JAMAIS apparaitre dans votre fichier mod : cela rendrait votre modélisation dépendante de l’instance de votre problème. 3. Identifiez les paramètres muets : si vous avez par exemple le choix entre 10 repas, prévoyez un paramètre pour le généraliser (ce serait dommage de devoir modifier le modèle a chaque fois que votre client va ajouter d’autres repas...). 4. Une fois le modèle fixe, vous pouvez vous attaquer a votre fichier .dat en respectant le type des paramètres que vous avez déclarez dans votre modèle. Regardez bien comment écrire des matrices et des sets. Est ce qu’on peut avoir des matrices de variables ? Oui. var y{1..L, 1..C}, >= 0; Les matrices c’est bien sympa mais est ce qu’on peut manipuler des sets ? Dans votre .mod : set Mon_Set; Dans votre .dat : set Mon_Set := Element1 Element2 Element3; 4 5.1 Le problème des cases admissibles Soit le tableau T de taille m × n, dont certaines cases sont dites “admissibles” (les autres sont “non admissibles”). On se donne également m + n entiers positifs ou nuls l1 , . . . , lm , c1 . . . , cn . Le problème consiste à affecter des nombres entiers aux cases admissibles (et à celles-ci seulement) de telle sorte que : – la somme des nombres affectés aux cases d’une ligne i soit inférieure ou égale à li (i = 1, 2, . . . , m), – la somme des nombres affectés aux cases d’une colonne j soit inférieure ou égale à cj (j = 1, 2, . . . , n), – la somme des nombres affectés aux cases du tableau soit maximum. Instance L’instance que nous allons considerer est la suivante, où les cases interdites sont en noir : Liste – – – – de données concernant cette instance : Taille du tableau : m = 4 et n = 5. Valeurs des lignes : l1 = 9, l2 = 10, l3 = 15, l4 = 2. Valeurs des colonnes : c1 = 7, c2 = 5, c3 = 9, c4 = 4, c5 = 8. Cases interdites : t13 , t14 , t15 , t22 , t25 , t31 , t33 , t34 , t41 , t42 , t44 . Exercice 1. Écrire un modèle mathematique pour ce problème d’optimisation linéaire 2. Écrire le modèle avec AMPL (fichier .mod) 3. Écrire le fichier d’instance (compléter le fichier .dat avec les données dans la liste précédente) 4. Ajouter la contrainte : la somme des nombres affectés aux cases d’une diagonale sudouest nord-est k soit inférieure ou égale à dj (k = 2, 3, . . . , n + m − 1), 5. Trouver une solution du problème avec AMPL. 5 Exercice 2 : Modélisation des programmes linéaires : parking optimal M. Edmons habite au 1, rue "Dantzig" sur laquelle les voitures peuvent se garer de deux cotés. Pour son anniversaire, il a invité ses amis qui viendront avec k voitures. La longueur de la ie voiture est notée λi . Pour ne pas déranger ses voisins, M. Edmons souhaite organiser le parking des voitures de ses amis des deux cotés de la rue de manière à minimiser la longueur du coté le plus long. 1. Donner le programme linéaire associé à ce problème (sans le résoudre) 2. Quelles contraintes faut-il ajouter au programme précédent pour modéliser les situations suivantes : (a) La longueur du coté pair ne doit pas dépasser 20 mètres. (b) Les voitures d’une longueur supérieure à 4 mètres doivent être garées du coté impair. (c) Si la longueur du coté pair dépasse 10 mètres, la longueur du coté impair ne doit pas dépasser 13 mètres. 6 Installation de systèmes contre l’incendie La compagnie COSMAR a comme activité principale le chargement et le déchargement de porte-containers dans le porte du Havre. A cause de récents problèmes, COSMAR désire renforcer son dispositif du lutte contre l’incendie en installant des systèmes SLIC dans l’entrepôt où sont placés les containers avant ou après toute manutention. La compagnie a identifié 8 zones à protéger plus spécialement. Ces zones sont marquées par une croix dans la diagramme ci-dessous : A 1 B 2 Côté ouest 3 C D E F G X x X X X 4 5 X 6 X Figure 1 – Les zones à protéger par la compagnie COSMAR COSMAR souhaite placer les systèmes SLIC sur les cotés nord et ouest de l’entrepôt. Un système ne peut protéger que les zones situées dans la même rangée (ligne ou colonne) : par exemple, un SLIC installé sur le côté nord en 4 protégerait les zones (1,4) et (6,4). Les ingénieurs de service de l’incendie du Havre ont par ailleurs imposé que les systèmes SLIC ne doivent pas être placés sur des colonnes consécutives. 6 Exercice 1. Écrire un modèle linéaire permettant de minimiser le nombre de SLIC que COSMAR doit acheter et installer. Les ingénieurs de service de l’incendie du Havre ont par ailleurs imposé les conditions suivantes : 2. les systèmes SLIC ne doivent pas être placés sur des colonnes consécutives ; 3. Si aucun SLIC n’est installé sur les lignes paires, au moins deux SLICS doivent être installés sur les lignes impaires ; 4. Si le nombre de SLICS installés sur les colonnes A,B,C,D est ≤ 2, alors le nombre de SLICS installés sur les colonnes E,F,G doit être ≥ 2. 5. Le prix d’un SLIC étant de 8070 euros, COSMAR souhaite en acquérir au plus 3. Pour les zones qui ne seront pas protégées par un SLIC, COSMAR souscrira une assurance complémentaire s’élevant à 2000 euros par zone pour les lignes 1, 2, 3 et à 3000 euros pour les autres lignes. Comment modifier le modèle précédent afin que COSMAR minimise le coût total ? 7 Tuto Rendez vous sur la page : http://ampl.com/try-ampl/start/ 1. Uploadez vos fichiers .mod et .dat et cliquez sur submit. 2. Choisissez un solveur dans la liste des solveurs. (par defaut : Minos est bien) 3. Cliquez sur Send pour lancer le solveur. Observez la solution. 7 8 9