1. Débuter avec CPLEX
OUDANI Mustapha,
Faculté des Sciences et Techniques, Fès,
oudani.mustapha@gmail.com,
26 mars 2013
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 1 / 49
2. Plan
1 Introduction
2 Optimiseur intéractif
3 CPLEX Callable Library
4 API Java
5 OPL Studio
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 2 / 49
3. Plan
1 Introduction
2 Optimiseur intéractif
3 CPLEX Callable Library
4 API Java
5 OPL Studio
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 2 / 49
4. Plan
1 Introduction
2 Optimiseur intéractif
3 CPLEX Callable Library
4 API Java
5 OPL Studio
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 2 / 49
5. Plan
1 Introduction
2 Optimiseur intéractif
3 CPLEX Callable Library
4 API Java
5 OPL Studio
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 2 / 49
6. Plan
1 Introduction
2 Optimiseur intéractif
3 CPLEX Callable Library
4 API Java
5 OPL Studio
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 2 / 49
7. Introduction
Historique et Applications
Crée par Robert E. Bixby en utilisant le langage C en 1987,
Racheté par ILOG en 1997,
95 % des papiers qui mentionnent un solveur citent CPLEX,
Solveur Standard dans les applications de la chaîne logistique,
Utilisé par plusieurs compagnies aériènnes (Delta, Continental,...),
2004 INFORMS Impact Award.
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 3 / 49
8. Introduction
Problèmes couverts
Programmation linéaire,
Programmation linéaire mixte,
Programmation quadratique,
Programmation mixte quadratique ,
Programmation à contraintes quadratiques,
Programmation mixte à contraintes quadratiques,
Programmes avec des millions de contraines et de variables (version
intégrale).
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 4 / 49
9. Introduction
Algorithmes
Programmation Linéaire :
Simplex Primal
Simplex Dual
Simplex pour les problèmes de ot
Point intérieur (barrier)
Programmation Quadratique :
Simplex Primal
Simplex Dual
Point intérieur (barrier)
Programmation à Contraintes Quadratiques :
Point intérieur (barrier)
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 5 / 49
10. Introduction
Composantes de CPLEX
On peut utiliser CPLEX sous diérentes manières :
Mode intéractif,
Cplex Callable Library (bibliothèque en langage C) : utilise les matrices
pour représenter un problème,
Ilog Concert Technology : utilise les objects et les méthodes pour
représenter un problème avec les langages de programmation C++,
Java, C#...,
Avec un langage de modélisation comme OPL, MPL, AMPL...
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 6 / 49
11. Optimiseur intéractif
Section I : CPLEX en mode intéractif
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 7 / 49
12. Optimiseur intéractif
Utiliser le menu d'aide
→ menu démarrer → Exécuter → taper : cplex
CPLEX accepte les commandes en diérents formats : on peut taper
le nom complet ou sa forme réduite, en majiscule ou en miniscule.
Pour obtenir de l'aide
CPLEX help
ou
CPLEX h
Pour obtenir de l'aide à propos d'une commande spécique on a la
syntaxe générale : help nom_commande ,exemple :
CPLEX help add
CPLEX help problem
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 8 / 49
13. Optimiseur intéractif
Enter un problème
Souvent, on fait entrer les petits problèmes d'une façon intéractive,
pour entrer des problèmes de grande taille, on fait la lecture du
problème à partir d'un chier.
exemple :
Maximiser x1 + 2x2 + 3x3
S.C :
−x1 + x2 + x3 ≤ 20
x1 − 3x2 + x3 ≤ 30
0 ≤ x1 ≤ 40
0 ≤ x2 ≤ ∞
0 ≤ x3 ≤ ∞
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 9 / 49
14. Optimiseur intéractif
Entrer un problème
Pour entrer un nouveau problème
CPLEX enter
On choisit un nom pour notre problème exemple : programme1
On fait entrer le problème dans l'ordre suivant :
1 Fonction objectif
2 Contraintes
3 Bornes
Pour entrer la fonction objectif
maximize (ou max) x1 + 2x2 + 3x3 // ou minimize (min)
On peut nommer nos variables en : voiture, machine, conteneur
On peut utiliser tous les caractères alphanumériques
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 10 / 49
15. Optimiseur intéractif
Entrer un problème
Pour entrer les contraintes on utilise, subject to ou st
st −x1 + x2 + x3 = 20
x1 − 3x2 + x3 = 30
On peut nommer les contraintes :
st temps : −x1 + x2 + x3 = 20
coût : x1 − 3x2 + x3 = 30
On peut entrer des contraintes longues en utilisant return, CPLEX
interprète les lignes multiples comme une seule contrainte :
st −x1 + x2 + return
x3 = 20 return
coût : x1 − 3x2 + x3 = 30
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 11 / 49
16. Optimiseur intéractif
Entrer un problème
Pour entrer les bornes, on utilise bounds :
bounds x1 = 40
Si aucune borne n'est pas entrée, CPLEX donne la valeur 0 pour la
borne inférieure et +∞ pour la borne supérieure, donc pour notre
problème on va pas entrer les autres contraintes sur les bornes.
Pour une variable qui prend des valeurs quelconques,
bounds
x3 free
Pour entrer des variables particulières :
Pour les variables entières, on entre generals,exemple :
generals
x1
Pour les variables binaires, on entre binaries,exemple :
binaries
x2
Pour nir l'entrée d'un problème on tape end
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 12 / 49
17. Optimiseur intéractif
Achage d'un problème
Après la saisie du problème, on peut vérier que ce dernier a été bien
entré, pour cela :
CPLEX display
Une liste d'options apparait. Certaines options concernent la partie de
description du problème, l'aure concerne la solution. Celle-ci ne peut
être achée qu'après la résolution du problème.
problem all
Si le problème est d'une grande taille, son achage sur écran est
moins pratique. On peut utiliser l'option stats pour acher
1 Le nombre et le type de contraintes
2 Variables
3 Coecients non nuls des contraintes
display problem stats
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 13 / 49
18. Optimiseur intéractif
Achage d'un problème
Pour acher les noms de variables :
display problem nom_variable numéro_colonne
Pour numéro_colonne on entre un nombre qui indique le numéro de la
colonne de la variable
On peut acher tous les noms des variables en tapant - ou * après le
mot variables
Pour acher les contraintes
diplay problem nom_contrainte
La fonction objectif est considérée comme la contrainte numéro 0, elle
peut être achée également par son nom par défaut obj
Pour acher les bornes :
display problem bounds 1
display problem bounds -
display problem bounds *
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 14 / 49
19. Optimiseur intéractif
Résolution d'un problème
Pour résoudre un programme linéaire, on peut lancer l'une des cinq
commandes suivantes :
primopt algorithme primal du simplexe
tranopt algorithme dual du simplexe
baropt algorithme de points intérieurs
netopt algorithme primal du simplexe pour les problèmes de ot
optimize Cplex choisit l'algorithme de résolution
Pour résoudre un programme mixte (linéaire ou quadratique ou à
contraintes quadratiques), on peut utiliser la commande :
mipopt nom_problème
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 15 / 49
20. Optimiseur intéractif
Résolution d'un problème
Pour résoudre un probème déja saisi :
CPELX optimize nom_probème
Pour acher les informations post-résolution :
CPLEX display solution variables -
Pour acher la valeur dual pour chaque contrainte :
CPLEX display solution dual -
On peut aussi acher l'analyse de sensibilité de la fonction objectif
(Changement de la solution optimale comme réponse aux petites
perturbations des données du problèmes)
CPLEX display sensitivity obj -
ou
CPLEX display sensitivity obj *
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 16 / 49
21. Optimiseur intéractif
Ecriture d'un problème et chier de solution
Le problème ou sa solution peuvent être enregitrés en utilisant la
commande write
Lorsque vous taper la commande write un message vous demande
d'entrer un nom du problème à écrire
Après sélectionner un format du chier parm une liste de choix,
choisissez le format LP
On peut entrer le nom et le type du chier de problème directement
CPLEX write exemple lp
ou
CPLEX write exemple.lp
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 17 / 49
22. Optimiseur intéractif
Ecriture d'un problème et chier de solution
La syntaxe générale pour la commande write est :
CPLEX write nom_chier format_chier
ou
CPLEX write nom_chier.extension
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 18 / 49
23. Optimiseur intéractif
Lecture d'un problème à partir d'un chier
On peut faire entrer souvent un problème par sa lecture à partir d'un
chier au lieu de sa saisie par clavier
Pour lire un lire un exemple d'un chier LP
CPLEX read
Spécier le nom de chier (exemple)
Entrer le format du chier : lp
Maintenant le problème est pris en considération en mémoire, et on
peut le manipuler avaec les commandes de CPLEX
La syntaxe générale pour la commande read est :
CPLEX read nom_chier format_chier
ou
CPLEX read nom_chier.extension
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 19 / 49
24. Optimiseur intéractif
Congurer les paramètres de CPLEX
L'utilisateur peut changer les paramètres de CPLEX en modiant leurs
valeurs initiales, pour voir les paramètres congurables :
CPLEX set
Une liste de ces paramètres s'ache, on peut congurer l'un d'eux en
tapant son nom
La syntaxe générale pour la commande set est :
CPLEX set nom_paramètre nouvelle_valeur
Il est possible de recongurer tous les paramètres à leurs valeurs
initiales par :
CPLEX set defaults
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 20 / 49
25. Cplex Callable Library
Section II :Cplex Callable Library
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 21 / 49
26. Cplex Callable Library
Introduction
La Cplex Callable Library est un ensemble de fonctions prédénies de
cplex,
Cplex Callable Library utilise les matrices creuses pour représenter un
problème,
Ces fonctions prédénies de Cplex commencent par le préxe CPX
Nous allons se baser sur l'exemple mipex1.c pour l'explication des
diérentes instructions de la Callabe Library
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 22 / 49
27. Cplex Callable Library
Paramètres de gestion de Cplex
#dene NUMROWS 3 (nombre de contraintes)
#dene NUMCOLS 4 (nombre de de variables)
#dene NUMNZ 9 (nombre de coecients = 0 de la matrice des
contraintes)
char *probname = NULL ; (nom du problème)
int numcols ;(nombre colonnes)
int numrow ; (nombre de lignes)
int objsen ; ( le sens de l'objectif)
double *obj = NULL ; (tableau des coecients de l'objectif)
double *rhs = NULL ; (tableau des second membres)
char *sense = NULL ; (le sens des contraintes)
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 23 / 49
28. Cplex Callable Library
Paramètres de gestion de Cplex
int *matbeg = NULL ; (marque le début de chaque colonne des matrices de
contraintes)
int *matcnt = NULL ; (nombre des éléments non nuls par colonne)
int *matind = NULL ; (indice de lignes des éléments non nuls)
double *matval = NULL ; (les éléments non nuls)
double *lb = NULL ; (bornes inférieurs)
double *ub = NULL ; (bornes supérieures)
char *ctype = NULL ; (types des variables)
int solstat ;(statut de la solution)
double objval ; (valeur de l'objectif)
double x[NUMCOLS] ; (variables)
double slack[NUMROWS] ;(variables d'ecart)
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 24 / 49
29. Cplex Callable Library
Ouverture de Cplex
CPXENVptr env=0 ; Pointeur sur l'environnement Cplex
CPXLPptr lp=0 ; Pointeur sur la structure contenant PL
int status ; Récupère le code d'une éventuelle erreur Cplex, status=0 si il
n'y a pas d'erreur 1 sinon.
env = CPXopenCPLEX (status) ;
Cette fonction permet l'ouverture de l'environement Cplex, elle stocke la
raison d'une éventuelle erreur dans status
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 25 / 49
30. Cplex Callable Library
Fonctions Cplex
status = CPXsetintparam (env, CPX_PARAM_SCRIND, CPX_ON) ;
Cette fonction permet la modication des paramètres de cplex
status = setproblemdata (probname, numcols, numrows,
objsen, obj, rhs, sense, matbeg, matcnt, matind,
matval, lb, ub, ctype) ;
Cette fonction permet de saisir les données du problème, elle sera
détaillée plus loin.
lp = CPXcreateprob (env, status, probname) ;
Cette fonction permet la création du problème.
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 26 / 49
31. Cplex Callable Library
Fonctions Cplex
status = CPXcopylp (env, lp, numcols, numrows, objsen, obj,
rhs,sense, matbeg, matcnt, matind, matval, lb, ub, NULL) ;
Cette fonction permet de copier le problème.
status = CPXcopyctype (env, lp, ctype) ;
Elle permet de copier le tableau ctype.
status = CPXmipopt (env, lp) ;
Fonction d'optimisation.
solstat = CPXgetstat (env, lp) ;
Fonction statut de la solution.
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 27 / 49
32. Cplex Callable Library
Fonctions Cplex
status = CPXgetobjval (env, lp, objval) ;
Obtenir la valeur de l'objectif.
status = CPXgetx (env, lp, x, 0, cur_numcols-1) ;
Obtenir les valeurs des variables.
status = CPXgetslack (env, lp, slack, 0, cur_numrows-1) ;
Obtenir les valeurs des variables d'écarts.
status = CPXwriteprob (env, lp, mipex1.lp, NULL) ;
Ecrire une copie de problème sous format lp.
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 28 / 49
33. Cplex Callable Library
Saisie de données
Le problème à résoudre est :
Maximize
obj : x1 + 2 x2 + 3 x3 + x4
Subject To
c1 : - x1 + x2 + x3 + 10x4 = 20
c2 : x1 - 3 x2 + x3 = 30
c3 : x2 - 3.5x4 = 0
Bounds
0 = x1 = 40
2 = x4 = 3
Integers
x4
End
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 29 / 49
34. Cplex Callable Library
Saisie de données
Les coecients de la fonction objectif :
zobj[0] = 1.0 ; zobj[1] = 2.0 ; zobj[2] = 3.0 ; zobj[3] = 1.0 ;
Les débuts de colonnes de la matrice des contraintes :
zmatbeg[0] = 0 ; zmatbeg[1] = 2 ; zmatbeg[2] = 5 ; zmatbeg[3] = 7 ;
Le nombre des éléments non nuls par chaque colonne :
zmatcnt[0] = 2 ; zmatcnt[1] = 3 ; zmatcnt[2] = 2 ; zmatcnt[3] = 2 ;
L'indice ligne de chaque éléments non nul :
zmatind[0] = 0 ; zmatind[2] = 0 ; zmatind[5] = 0 ; zmatind[7] = 0 ;
zmatind[1] = 1 ; zmatind[3] = 1 ; zmatind[6] = 1 ;zmatind[4] = 2 ;
zmatind[8] = 2 ;
La valeur des éléments non nuls :
zmatval[0] = -1.0 ; zmatval[2] = 1.0 ; zmatval[5] = 1.0 ; zmatval[7] = 10.0 ;
zmatval[1] = 1.0 ; zmatval[3] = -3.0 ; zmatval[6] = 1.0 ;zmatval[4] = 1.0 ;
zmatval[8] = -3.5 ;
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 30 / 49
36. API Java
Section III : API Java
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 32 / 49
37. API Java
introduction
L'API Java utilise les objets et les méthodes pour représenter un
problème,
Commencer par la création d'un nouveau Java Project
Ajouter cplex.jar lors de la création du votre projet (Libraries → Add
External JARs)
Pour utiliser les interfaces Java ILOG CPLEX, vous devez importer les
deux packages :
import ilog.concert *. ;
import ilog.cplex *. ;
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 33 / 49
38. API Java
Création d'objets Ilocplex
On crée un objet (une instance) de type IloCplex (qui implémente
l'interface IloMPModeler, et donc l'interface IloModeler). Exemple :
IloCplex modele = new IloCplex() ;
Tous les appels au solveur (dénition de la fonction économique et des
contraintes du modèle à résoudre, résolution, achage de la solution)
vont se faire via cet objet.
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 34 / 49
39. API Java
Variables
Les variables sont des objets de type soit :
IloNumVar (variables quelconques)
IloIntVar (variables entières)
Chacun de ces objets, pour être intégré au modèle courant (modele),
doit ensuite être déni ainsi :
var1 = modele.numVar(borne_inf, borne_sup, type) ; écriture
generique pour une variable var1
var2 = modele.intVar(borne_inf, borne_sup) ;écriture pour une
variable var2 entière
var3 = modele.boolVar() ; écriture pour une variable 0-1 var3
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 35 / 49
40. API Java
Variables
Si une variable réelle n'a pas :
De borne inf.borne_inf = -Double.MAX_VALUE
De borne sup.borne_sup = Double.MAX_VALUE
Possibilité de dénir des tableaux de variables via model.numVarArray
(ou model.intVarArray ou model.boolVarArray)
Paramètre type vaut IloNumVarType.Int (variable entière) ou
IloNumVarType.Float (variable réelle)
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 36 / 49
41. API Java
Les expressions
Une expression est une combinaison de variables : Somme, diérence,
multiplication par des coecients...
Une expression est un objet de type IloNumExpr
Exemple : Pour écrire : x1 + 2x2
expr = modele.sum(x1, modele.prod(2.0, x2)) ;
Pour chaque opération (+, -, *, /, etc.), on utilise une instruction
dédiée :
Opération somme : modele.sum(...)
Opération produit : modele.prod(...)
Opération diérence : modele.di(...)
Opération négation : modele.negative(...)
Opération élever au carré : modele.square(...)
Pour exprimer une expression linéaire, on peut utiliser le produit
scalaire :
IloLinearNumExpr lin = modele.scalProd(vectcoef, var) ; ou vectcoef
est le vecteur des coecients, et var est le vecteur des variables.
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 37 / 49
42. API Java
Contraintes
Les contraintes sont des objets de type IloRange
Une contrainte ctr se dénit à partir d'une expression expr. Exemple :
IloRange ctr = modele.range(borne_inf, expr, borne_sup) ;
On peut aussi utiliser :
IloRange le = modele.Le(expr, borne_sup) ;//contrainte en ≤
IloRange ge = modele.Ge(expr, borne_inf) ;//contrainte en ≥
IloRange eq = modele.Eq(expr, borne_sup) ; //contrainte en =
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 38 / 49
43. API Java
Contraintes
Pour ajouter une contrainte on utilise :
modele.addLe(linExpr, borne_sup) ; //contrainte en ≤
modele.addGe(linExpr, borne_inf) ; //contrainte en ≥
modele.addEq(linExpr, 2nd_membre) ; //contrainte en =
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 39 / 49
44. API Java
Fonction objectif
Pour ajouter la fonction économique :modele.addMaximize(lin) ; ou
modele.addMinimize(lin) ;
Pour la récupération de la valeur optimale modele.getObjValue() ;
Pour la récupération de la solution optimale modele.getValue(var1) ;
ou modele.getValues(tab_vars) ;
Pour obtenir le status modele.getStatus() ; et enn pour fermer l'accès
au solveur : modele.end() ;
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 40 / 49
45. OPL, une brève description
Section IV : OPL, une brève description
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 41 / 49
46. OPL, une brève description
Introduction
OPL=Optimization Programming Language,
OPL est un langage de haut niveau pour la description des
programmes mathématiques,
OPL est un langage d'ILOG, OPL Studio est un EDI (Environnement
de Développement Intégré)
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 42 / 49
47. OPL, une brève description
Manipulation de CPLEX Studio IDE
On peut lancer CPLEX Studio IDE d'après le menu démarrer,
Commencer par créer un nouveau projet, en cliquant sur Fichier →
Nouveau→ Projet OPL
Pour insérer un nouveau modèle au projet (d'extension .mod ), cliquer
avec le bouton droit, sur le projet puis choisir Nouveau→ Modèle
Pour insérer un chier de données au projet (d'extension .dat ), cliquer
avec le bouton droit, sur le projet puis choisir Nouveau→ Données
Pour exécuter un modèle (.mod) associé à un chier de données
(.dat), il faut créer une conguration d'exécution
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 43 / 49
48. OPL, une brève description
Manipulation de CPLEX Studio IDE
Pour créer une nouvelle conguration, cliquer avec le bouton droit, sur
le projet puis choisir Nouveau→ Conguration d'exécution
Glisser les deux chiers modèle (.mod) et données (.dat) vers la
nouvelle conguration créee,
Pour exécuter une conguration , cliquer avec le bouton droit sur la
conguration d'exécution, puis choisir Exécuter cette conguration
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 44 / 49
49. OPL, une brève description
Structure de modèles OPL
Un modèle OPL se présente sous la forme suivante :
Type de la constante Nom de la constante =... ;
dvar Type de la variable de décision Nom de la variable de décision ;
minimize (ou maximize)
Fonction objectif
subject to {
Contrainte 1 ;
Contrainte 2 ;
...
Contrainte n ;
};
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 45 / 49
50. OPL, une brève description
Exemples de modèles OPL : problème de transport
Le problème de transport se modélise en OPL comme suit (chier .mod) :
{string} usines=... ;
{string} clients=... ;
int nbr_usines=... ;
int nbr_clients=... ;
oat cout[usines][clients]=... ;
oat demande[clients]=... ;
oat ore[usines]=... ;
dvar oat+ x[usines][clients] ;
minimize sum (i in usines, j in clients) cout[i][j]*x[i][j] ;
subject to {
forall (i in usines) contProduction :
sum (j in clients) x[i][j]=ore[i] ;
forall (j in clients) contdemande :
sum (i in usines) x[i][j]=demande[j] ;
};
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 46 / 49
51. OPL, une brève description
Exemples de modèles OPL : problème de transport
Le chier de données (.dat) initialise les constantes déclarées dans le chier
modèle (.mod) :
nbr_usines=3 ;
nbr_clients=4 ;
usines={1,2,3} ;
clients={1,2,3,4} ;
ore=[35,50,40] ;
demande=[45,20,30,30] ;
cout=[[8,6,10,9],[9,12,13,7],[14,9,16,5]] ;
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 47 / 49
52. OPL, une brève description
Exemples de modèles OPL : problème de sac à dos
Le problème de sac à dos se modélise en OPL comme suit (chier .mod) :
int n=... ;
int prot[1..n] =... ;
int poids[1..n] =... ;
int poidmax=... ;
dvar int x[1..n] ;
maximize
sum(i in 1..n) prot[i] * x[i] ;
subject to {
sum(i in 1..n) poids[i] * x[i] = poidmax ;
};
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 48 / 49
53. OPL, une brève description
Exemples de modèles OPL : problème de sac à dos
Le chier de données (.dat) initialise les constantes déclarées dans le chier
modèle (.mod) :
n=3 ; poidmax=59 ;
prot = [10, 11, 13] ;
poids= [10, 12, 13] ;
Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 49 / 49