L`utilisation du langage de modélisation OPL

Transcription

L`utilisation du langage de modélisation OPL
L’utilisation du langage de
modélisation OPL
Virginie Gabrel
Master ID
OPL =

OPL est intégré dans un outil de
développement OPL Studio qui permet
d’accéder à 3 solveurs
–
–
–

Optimization Programming
Language
CPLEX
ILOG Solveur (programmation par contraintes)
ILOG Scheduler (ordonnancement)
OPL script : langage de commandes qui
permet résoudre une séquence de plusieurs
modèles en les faisant collaborer
Objectifs



Fournir à l’utilisateur un moyen simple pour
décrire/modifier un modèle
Manipuler des types de données standard :
string, {string}, float, float+, int, boolean,
tuple, range…
Manipuler des notations algébrique
–

Sum (j in 1..n) c[j]*x[j]
Séparer le modèle des données.
La notion de Projet OPL

Projet OPL = Dossier contenant des fichiers :
–
–
–
–
un ou plusieurs fichiers modèles .mod,
une ou plusieurs configurations d’exécution (chaque
config contient exactement un et un seul .mod, une
config permet de référencer un .mod et associe un
.mod à un ou plusieurs .dat),
un ou plusieurs fichiers de données .dat (il peut
n’exister aucun fichier .dat),
un ou plusieurs fichiers de paramétrages d’OPL .ops
(il peut n’exister aucun fichier .ops)
Exemple raffinerie : modèle 1
Défini
{string} Essence={"EA","EB"};
{string} Constituant={"C1","C2","C3"};
dvar float+ x[Essence,Constituant];
maximize 2.5*x["EA"]["C1"] - 0.5*x["EA"]["C2"] + 1.5*x["EA"]["C3"] +
1.5*x["EB"]["C1"] - 1.5*x["EB"]["C2"] + 0.5*x["EB"]["C3"];
subject to {
0.7*x["EA"]["C1"] - 0.3*x["EA"]["C2"] - 0.3*x["EA"]["C3"] <= 0;
0.4*x["EA"]["C1"] - 0.6*x["EA"]["C2"] + 0.4*x["EA"]["C3"] <= 0;
-0.5*x["EA"]["C1"] - 0.5*x["EA"]["C2"] + 0.5*x["EA"]["C3"] <= 0;
0.5*x["EB"]["C1"] - 0.5*x["EB"]["C2"] - 0.5*x["EB"]["C3"] <= 0;
0.1*x["EB"]["C1"] - 0.9*x["EB"]["C2"] + 0.5*x["EB"]["C3"] <=0;
x["EA"]["C1"] + x["EB"]["C1"] <= 3000;
x["EA"]["C2"] + x["EB"]["C2"] <= 2000;
x["EA"]["C3"] + x["EB"]["C3"] <= 4000;
};
Exemple raffinerie : solution
solution (optimal) with objective
7166.66666666667
x = [[366.67 1466.7 1833.3]
[2633.3 533.33 2166.7]];
Exemple raffinerie : modèle 2
{string} Essence=...;
{string} Constituant=...;
int nbCont=...;
range Cont=1..nbCont;
float coefObj[Essence][Constituant]=...;
float coefCont[Cont][Essence][Constituant]=...;
float Dispo[Constituant]=...;
dvar float+ x[Essence][Constituant];
maximize sum (i in Essence, j in Constituant) coefObj[i][j]*x[i][j];
subject to {
forall (i in Cont) contProportion:
sum (j in Essence, k in Constituant) coefCont[i][j][k]*x[j][k]<=0;
forall (j in Constituant) contDispo:
sum (i in Essence) x[i][j] <= Dispo[j];
};
Exemple raffinerie : données associées
au modèle 2
Essence={"EA","EB"};
Constituant={"C1","C2","C3"};
nbCont=5;
coefObj=[[2.5,-0.5,1.5],[1.5,-1.5,0.5]];
coefCont=[
[[0.7,-0.3,-0.3],[0,0,0]],
[[0.4,-0.6,0.4],[0,0,0]],
[[-0.5,-0.5,0.5],[0,0,0]],
[[0,0,0],[0.5,-0.5,-0.5]],
[[0,0,0],[0.1,-0.9,0.1]]];
Dispo=[3000,2000,4000];
Obtenir l’analyse de sensibilité
execute {
var i,j;
for(i in Essence)
for(j in Constituant)
writeln("x[",i,",",j,"].reducedCost=", x[i][j].reducedCost);
for(i in Cont)
writeln("ContProportion[",i,"].dual=",contProportion[i].dual);
for(i in Constituant) {
writeln("Constituant[",i,"].dual = ", contDispo[i].dual);
writeln("Constituant[",i,"].LB = ", contDispo[i].LB);
writeln("Constituant[",i,"].UB = ", contDispo[i].UB);
}
}
Obtenir l’analyse de sensibilité
Constituant[C1].dual
Constituant[C1].LB =
Constituant[C1].UB =
Constituant[C2].dual
Constituant[C2].LB =
Constituant[C2].UB =
Constituant[C3].dual
Constituant[C3].LB =
Constituant[C3].UB =
= 1.166666666666667
-Infinity
3000
= 1.5
-Infinity
2000
= 0.1666666666666667
-Infinity
4000
Le problème d’affectation sous OPL
Le fichier .mod
//Paramètres
{string} machine = ...;
{string} tache = ...;
{string} tacheMachine[tache]= ...;
int nbConflit=...;
range rgConflit=1..nbConflit;
tuple Conflit{
string tache1;
string tache2;
string machine;
}
Conflit conf[rgConflit]=...;
//Variables
dvar boolean tacheToMachine[tache][machine];
Le problème d’affectation sous OPL
Le fichier .mod
//Fonction Objectif
dexpr int NbreTache=sum(t in tache, m in tacheMachine[t])
tacheToMachine[t][m];
maximize NbreTache;
//Constraints
subject to {
forall(t in tache) //Une machine par tache
ctTache:
sum( m in tacheMachine[t])
tacheToMachine[t][m] == 1;
forall(t in rgConflit) //Conflit
ctConlit:
tacheToMachine[conf[t].tache1][conf[t].machine] +
tacheToMachine[conf[t].tache2][conf[t].machine] <= 1;
}
Le problème d’affectation sous OPL
Le fichier .dat
machine = {"M1","M2","M3"};
tache = {"T1","T2","T3","T4","T5"};
tacheMachine=[
{"M1","M2","M3"},
{"M1","M2"},
{"M1","M2","M3"},
{"M1","M2"},
{"M2"}];
nbConflit=9;
conf=[<T2,T3,M2>,<T2,T3,M3>,<T2,T4,M2>,<T2,T4,M3>,
<T2,T5,M2>,<T3,T4,M2>,<T3,T4,M3>,<T3,T5,M2>,
<T4,T5,M2>];

Documents pareils