Dbuter avec CPLEX
OUDANI Mustapha, Facult des Sciences et Techniques, Fs, [email protected],
26 mars 2013
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
1 / 49
Plan
Introduction Optimiseur intractif CPLEX Callable Library API Java OPL Studio
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
2 / 49
Plan
Introduction Optimiseur intractif CPLEX Callable Library API Java OPL Studio
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
2 / 49
Plan
Introduction Optimiseur intractif CPLEX Callable Library API Java OPL Studio
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
2 / 49
Plan
Introduction Optimiseur intractif CPLEX Callable Library API Java OPL Studio
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
2 / 49
Plan
Introduction Optimiseur intractif CPLEX Callable Library API Java OPL Studio
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
2 / 49
Introduction
Historique et Applications
Cre 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 chane logistique, Utilis par plusieurs compagnies arinnes (Delta, Continental,...), 2004 INFORMS Impact Award.
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
3 / 49
Introduction
Problmes couverts
Programmation linaire, Programmation linaire mixte, Programmation quadratique, Programmation mixte quadratique , Programmation contraintes quadratiques, Programmation mixte contraintes quadratiques, Programmes avec des millions de contraines et de variables (version intgrale).
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
4 / 49
Introduction
Algorithmes
Programmation Linaire : Simplex Primal Simplex Dual Simplex pour les problmes de ot Point intrieur (barrier) Programmation Quadratique : Simplex Primal Simplex Dual Point intrieur (barrier) Programmation Contraintes Quadratiques : Point intrieur (barrier)
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
5 / 49
Introduction
Composantes de CPLEX
On peut utiliser CPLEX sous direntes manires : Mode intractif, Cplex Callable Library (bibliothque en langage C) : utilise les matrices pour reprsenter un problme, Ilog Concert Technology : utilise les objects et les mthodes pour reprsenter un problme avec les langages de programmation C++, Java, C#..., Avec un langage de modlisation comme OPL, MPL, AMPL...
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
6 / 49
Optimiseur intractif
Section I : CPLEX en mode intractif
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
7 / 49
Optimiseur intractif
Utiliser le menu d'aide
menu dmarrer Excuter taper : cplex
CPLEX accepte les commandes en dirents formats : on peut taper le nom complet ou sa forme rduite, en majiscule ou en miniscule. Pour obtenir de l'aide CPLEX> help ou CPLEX> h Pour obtenir de l'aide propos d'une commande spcique on a la syntaxe gnrale : help nom_commande ,exemple : CPLEX> help add CPLEX> help problem
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
8 / 49
Optimiseur intractif
Enter un problme
Souvent, on fait entrer les petits problmes d'une faon intractive, pour entrer des problmes de grande taille, on fait la lecture du problme 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
Dbuter avec CPLEX
Prsent par OUDANI Mustapha
26 mars 2013
9 / 49
Optimiseur intractif
Entrer un problme
Pour entrer un nouveau problme CPLEX> enter On choisit un nom pour notre problme exemple : programme1 On fait entrer le problme dans l'ordre suivant :
1 2 3
Fonction objectif Contraintes 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 caractres alphanumriques
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
10 / 49
Optimiseur intractif
Entrer un problme
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 cot : x1 3x2 + x3 <= 30 On peut entrer des contraintes longues en utilisant <return>, CPLEX interprte les lignes multiples comme une seule contrainte : st x1 + x2 + < return > x3 <= 20 < return > cot : x1 3x2 + x3 <= 30
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
11 / 49
Optimiseur intractif
Entrer un problme
Pour entrer les bornes, on utilise bounds : bounds x1 <= 40 Si aucune borne n'est pas entre, CPLEX donne la valeur 0 pour la borne infrieure et + pour la borne suprieure, donc pour notre problme 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 particulires :
generals x1
Pour les variables entires, on entre generals,exemple : Pour les variables binaires, on entre binaries,exemple :
binaries x2
Pour nir l'entre d'un problme on tape end
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
12 / 49
Optimiseur intractif
Achage d'un problme
Aprs la saisie du problme, on peut vrier que ce dernier a t bien entr, pour cela : CPLEX> display Une liste d'options apparait. Certaines options concernent la partie de description du problme, l'aure concerne la solution. Celle-ci ne peut tre ache qu'aprs la rsolution du problme.
problem all
Si le problme est d'une grande taille, son achage sur cran est moins pratique. On peut utiliser l'option stats pour acher
Le nombre et le type de contraintes Variables Coecients non nuls des contraintes display problem stats
1 2 3 Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
13 / 49
Optimiseur intractif
Achage d'un problme
Pour acher les noms de variables :
display problem nom_variable numro_colonne Pour numro_colonne on entre un nombre qui indique le numro de la
colonne de la variable On peut acher tous les noms des variables en tapant - ou * aprs le mot variables Pour acher les contraintes diplay problem nom_contrainte La fonction objectif est considre comme la contrainte numro 0, elle peut tre ache galement par son nom par dfaut obj Pour acher les bornes :
display problem bounds 1 display problem bounds display problem bounds *
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
14 / 49
Optimiseur intractif
Rsolution d'un problme
Pour rsoudre un programme linaire, on peut lancer l'une des cinq commandes suivantes : primopt algorithme primal du simplexe tranopt algorithme dual du simplexe baropt algorithme de points intrieurs netopt algorithme primal du simplexe pour les problmes de ot optimize Cplex choisit l'algorithme de rsolution Pour rsoudre un programme mixte (linaire ou quadratique ou contraintes quadratiques), on peut utiliser la commande : mipopt nom_problme
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
15 / 49
Optimiseur intractif
Rsolution d'un problme
Pour rsoudre un probme dja saisi : CPELX> optimize nom_probme Pour acher les informations post-rsolution : 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 rponse aux petites perturbations des donnes du problmes) CPLEX> display sensitivity obj ou CPLEX> display sensitivity obj *
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
16 / 49
Optimiseur intractif
Ecriture d'un problme et chier de solution
Le problme ou sa solution peuvent tre enregitrs en utilisant la commande write Lorsque vous taper la commande write un message vous demande d'entrer un nom du problme crire Aprs slectionner un format du chier parm une liste de choix, choisissez le format LP On peut entrer le nom et le type du chier de problme directement CPLEX> write exemple lp ou CPLEX> write exemple.lp
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
17 / 49
Optimiseur intractif
Ecriture d'un problme et chier de solution
La syntaxe gnrale pour la commande write est : CPLEX> write nom_chier format_chier ou CPLEX> write nom_chier.extension
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
18 / 49
Optimiseur intractif
Lecture d'un problme partir d'un chier
On peut faire entrer souvent un problme 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 Spcier le nom de chier (exemple) Entrer le format du chier : lp Maintenant le problme est pris en considration en mmoire, et on peut le manipuler avaec les commandes de CPLEX La syntaxe gnrale pour la commande read est : CPLEX> read nom_chier format_chier ou CPLEX> read nom_chier.extension
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
19 / 49
Optimiseur intractif
Congurer les paramtres de CPLEX
L'utilisateur peut changer les paramtres de CPLEX en modiant leurs valeurs initiales, pour voir les paramtres congurables : CPLEX> set Une liste de ces paramtres s'ache, on peut congurer l'un d'eux en tapant son nom La syntaxe gnrale pour la commande set est : CPLEX> set nom_paramtre nouvelle_valeur Il est possible de recongurer tous les paramtres leurs valeurs initiales par : CPLEX> set defaults
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
20 / 49
Cplex Callable Library
Section II :Cplex Callable Library
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
21 / 49
Cplex Callable Library
Introduction
La Cplex Callable Library est un ensemble de fonctions prdnies de cplex, Cplex Callable Library utilise les matrices creuses pour reprsenter un problme, Ces fonctions prdnies de Cplex commencent par le prxe CPX Nous allons se baser sur l'exemple mipex1.c pour l'explication des direntes instructions de la Callabe Library
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
22 / 49
Cplex Callable Library
Paramtres 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 problme) 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)
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
23 / 49
Cplex Callable Library
Paramtres de gestion de Cplex
int *matbeg = NULL ; (marque le dbut de chaque colonne des matrices de contraintes) int *matcnt = NULL ; (nombre des lments non nuls par colonne) int *matind = NULL ; (indice de lignes des lments non nuls) double *matval = NULL ; (les lments non nuls) double *lb = NULL ; (bornes infrieurs) double *ub = NULL ; (bornes suprieures) 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)
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
24 / 49
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 ; Rcupre 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
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
25 / 49
Cplex Callable Library
Fonctions Cplex
status = CPXsetintparam (env, CPX_PARAM_SCRIND, CPX_ON) ; Cette fonction permet la modication des paramtres de cplex status = setproblemdata (&probname, &numcols, &numrows, &objsen, &obj, &rhs, &sense, &matbeg, &matcnt, &matind, &matval, &lb, &ub, &ctype) ; Cette fonction permet de saisir les donnes du problme, elle sera dtaille plus loin. lp = CPXcreateprob (env, &status, probname) ; Cette fonction permet la cration du problme.
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
26 / 49
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 problme. 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.
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
27 / 49
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 problme sous format lp.
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
28 / 49
Cplex Callable Library
Saisie de donnes
Le problme rsoudre 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
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
29 / 49
Cplex Callable Library
Saisie de donnes
Les coecients de la fonction objectif : zobj[0] = 1.0 ; zobj[1] = 2.0 ; zobj[2] = 3.0 ; zobj[3] = 1.0 ; Les dbuts de colonnes de la matrice des contraintes : zmatbeg[0] = 0 ; zmatbeg[1] = 2 ; zmatbeg[2] = 5 ; zmatbeg[3] = 7 ; Le nombre des lments non nuls par chaque colonne : zmatcnt[0] = 2 ; zmatcnt[1] = 3 ; zmatcnt[2] = 2 ; zmatcnt[3] = 2 ; L'indice ligne de chaque lments 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 lments 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 ;
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
30 / 49
Cplex Callable Library
Saisie de donnes
Bornes suprieures et bornes infrieures : zlb[0] = 0.0 ; zlb[1] = 0.0 ; zlb[2] = 0.0 ; zlb[3] = 2.0 ; zub[0] = 40.0 ; zub[1] = CPX_INFBOUND ; zub[2] = CPX_INFBOUND ; zub[3] = 3.0 ; Types de variables : zctype[0] = 'C' ; zctype[1] = 'C' ; zctype[2] = 'C' ; zctype[3] = 'I' ; C=Continu,I=Integer, B=Binary Sens des contraintes : zsense[0] = 'L' ;zsense[0] = 'L' ;zsense[0] = 'E' ; L=Low,E=Equal,G=Great, Seconds menmbres : zrhs[0] = 20.0 ;zrhs[1] = 30.0 ;zrhs[2] = 0.0 ;
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
31 / 49
API Java
Section III : API Java
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
32 / 49
API Java
introduction
L'API Java utilise les objets et les mthodes pour reprsenter un problme, Commencer par la cration d'un nouveau Java Project Ajouter cplex.jar lors de la cration 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 *. ;
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
33 / 49
API Java
Cration d'objets Ilocplex
On cre un objet (une instance) de type IloCplex (qui implmente l'interface IloMPModeler, et donc l'interface IloModeler). Exemple : IloCplex modele = new IloCplex() ; Tous les appels au solveur (dnition de la fonction conomique et des contraintes du modle rsoudre, rsolution, achage de la solution) vont se faire via cet objet.
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
34 / 49
API Java
Variables
Les variables sont des objets de type soit :
IloNumVar IloIntVar
Chacun de ces objets, pour tre intgr au modle courant (modele), doit ensuite tre dni 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 entire var3 = modele.boolVar() ; criture pour une variable 0-1 var3
(variables quelconques) (variables entires)
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
35 / 49
API Java
Variables
Si une variable relle n'a pas : De borne inf.borne_inf = -Double.MAX_VALUE De borne sup.borne_sup = Double.MAX_VALUE Possibilit de dnir des tableaux de variables via model.numVarArray (ou model.intVarArray ou model.boolVarArray) Paramtre type vaut IloNumVarType.Int (variable entire) ou IloNumVarType.Float (variable relle)
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
36 / 49
API Java
Les expressions
Une expression est une combinaison de variables : Somme, dirence, 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 opration (+, -, *, /, etc.), on utilise une instruction ddie :
Opration " somme " : modele.sum(...) Opration " produit " : modele.prod(...) Opration " dirence " : modele.di(...) Opration " ngation " : modele.negative(...) Opration " lever au carr " : modele.square(...)
Pour exprimer une expression linaire, 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.
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
37 / 49
API Java
Contraintes
Les contraintes sont des objets de type IloRange Une contrainte ctr se dnit partir d'une expression expr. Exemple : On peut aussi utiliser :
IloRange ctr = modele.range(borne_inf, expr, borne_sup) ;
IloRange le = modele.Le(expr, borne_sup) ;
//contrainte en //contrainte en IloRange eq = modele.Eq(expr, borne_sup) ; //contrainte en =
IloRange ge = modele.Ge(expr, borne_inf) ;
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
38 / 49
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 =
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
39 / 49
API Java
Fonction objectif
modele.addMinimize(lin) ;
Pour ajouter la fonction conomique :modele.addMaximize(lin) ; ou
Pour la rcupration de la valeur optimale modele.getObjValue() ; Pour la rcupration de la solution optimale modele.getValue(var1) ; ou modele.getValues(tab_vars) ; Pour obtenir le status modele.getStatus() ; et enn pour fermer l'accs au solveur : modele.end() ;
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
40 / 49
OPL, une brve description
Section IV : OPL, une brve description
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
41 / 49
OPL, une brve description
Introduction
OPL=Optimization Programming Language, OPL est un langage de haut niveau pour la description des programmes mathmatiques, OPL est un langage d'ILOG, OPL Studio est un EDI (Environnement de Dveloppement Intgr)
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
42 / 49
OPL, une brve description
Manipulation de CPLEX Studio IDE
On peut lancer CPLEX Studio IDE d'aprs le menu dmarrer, Commencer par crer un nouveau projet, en cliquant sur Fichier Nouveau Projet OPL Pour insrer un nouveau modle au projet (d'extension .mod ), cliquer avec le bouton droit, sur le projet puis choisir Nouveau Modle Pour insrer un chier de donnes au projet (d'extension .dat ), cliquer avec le bouton droit, sur le projet puis choisir Nouveau Donnes Pour excuter un modle (.mod) associ un chier de donnes (.dat), il faut crer une conguration d'excution
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
43 / 49
OPL, une brve description
Manipulation de CPLEX Studio IDE
Pour crer une nouvelle conguration, cliquer avec le bouton droit, sur le projet puis choisir Nouveau Conguration d'excution Glisser les deux chiers modle (.mod) et donnes (.dat) vers la nouvelle conguration cree, Pour excuter une conguration , cliquer avec le bouton droit sur la conguration d'excution, puis choisir Excuter cette conguration
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
44 / 49
OPL, une brve description
Structure de modles OPL
Un modle OPL se prsente sous la forme suivante : <Type de la constante> <Nom de la constante> =... ; dvar <Type de la variable de dcision> <Nom de la variable de dcision> ; minimize (ou maximize) <Fonction objectif> subject to { <Contrainte 1> ; <Contrainte 2> ; ... <Contrainte n> ; };
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
45 / 49
OPL, une brve description
Exemples de modles OPL : problme de transport
Le problme de transport se modlise 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] ; };
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
46 / 49
OPL, une brve description
Exemples de modles OPL : problme de transport
Le chier de donnes (.dat) initialise les constantes dclares dans le chier modle (.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]] ;
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
47 / 49
OPL, une brve description
Exemples de modles OPL : problme de sac dos
Le problme de sac dos se modlise 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 ; };
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
48 / 49
OPL, une brve description
Exemples de modles OPL : problme de sac dos
Le chier de donnes (.dat) initialise les constantes dclares dans le chier modle (.mod) : n=3 ; poidmax=59 ; prot = [10, 11, 13] ; poids= [10, 12, 13] ;
Prsent par OUDANI Mustapha
Dbuter avec CPLEX
26 mars 2013
49 / 49