Vous êtes sur la page 1sur 7

L’utilisation de IBM Ilog Cplex

Optimization Studio

Virginie Gabrel -
Modélisation et
résolution de pbs en RO

1 2013-2014 Master ID

Solveurs et Modeleurs

Solveurs : Logiciels de résolution de


Programme Mathématique (excel, CPLEX,
GLPK, lindo, Xpress, gurobi, coin-OR…)
– PL : méthode révisée du simplexe
– PLNE : méthode par séparation et évaluation
Modeleurs : Langage pour écrire, intégrer,
résoudre et afficher un PM : GAMS, AMPL,
OPL…

2 2013-2014 Master ID
Cplex Optimization Studio

Offre un environnement de développement


intégré : de la modélisation -> résolution

– OPL : Optimization Programming language


(inclus IBM ILOG Script for OPL)
– CPLEX Optimizer (solveur de programmes
mathématiques)
– CP Optimizer (programmation par contraintes)

3 2013-2014 Master ID

Objectifs de IBM Ilog OPL

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 (possibilité d’utiliser
des données stockées dans des bases de données
et/ou des tableurs)
Fournir un langage de commande permettant de
résoudre une séquence de programmes
4 2013-2014 Master ID
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)
5 2013-2014 Master ID

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;
};
6 2013-2014 Master ID
Exemple raffinerie : solution

solution (optimal) with objective


7166.66666666667
x = [[366.67 1466.7 1833.3]
[2633.3 533.33 2166.7]];

7 2013-2014 Master ID

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];
};
8 2013-2014 Master ID
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];

9 2013-2014 Master ID

10 2013-2014 Master ID
Traduction en .mod du format
général

int n,m;
float c[1..n]=...;
float b[1..m]=...;
float a[1..m][1..n]=...;

dvar float x[1..n]=...;

maximize sum (j in 1..n) c[j]*[j];


subject to {
forall (i in 1..m)
sum (j in 1..n) a[i][j]*x[j]==b[i];
}

11 2013-2014 Master ID

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];
12 2013-2014 Master ID
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;
13 } 2013-2014 Master ID

Le problème d’affectation sous OPL


Le fichier .dat

machine = {"M1","M2","M3"};
tache = {"T1","T2","T3","T4","T5"};
tacheMachine=[
{"M1","M2","M3"},
{"M2","M3"},
{"M1","M2","M3"},
{"M2","M3"},
{"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>];

14 2013-2014 Master ID

Vous aimerez peut-être aussi