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