Vous êtes sur la page 1sur 9

Utilisation du solveur IBM-Cplex via le format LP et le langage de modlisation OPL

ECMA Semaine du 10 dcembre 2012


Dans ce TP, nous prsentons l'utilisation du solveur de programmes mathmatiques appel IBM-Cplex. Ce solveur est un logiciel propritaire, qui permet de rsoudre des programmes dont la fonction optimiser est soit linaire, soit quadratique et convexe (dans le cas d'une minimisation), et o les variables peuvent prendre soit des valeurs entires, soit des valeurs continues.

Avant de commencer :
2. Installez le solveur.

1. Tlchargez le solveur IBM-Cplex l'adresse suivante :

wyGigweGsouresGsourespFexe.

httpXGGedriFnmFfrG~lmertG

3. La documentation du langage de modlisation OPL se trouve l'adresse suivante :

GGedriFnmFfrG~lmertGwyGigweGdoGoplutorilFpdf.

httpX

4. Les exemples en OPL se trouvent dans le rpertoire

gXrogrm piles @xVTAsfwsvyqgvitudioIPSoplexmples gXrogrm piles @xVTAsfwsvyqgvitudioIPSplexexmplesdt gXrogrm piles @xVTAsfwsvyqgvitudioIPSplexinxVTwinQPplexFexe

5. Les exemples en format LP se trouvent dans le rpertoire

6. Le chemin de l'excutable Cplex est le suivant

1 Utilisation du solveur linaire de IBM-Cplex pour excuter des chiers au format LP

Le format de chier LP :
CP LEX > red totoFlp CP LEX > opt

Le format de chier LP permet d'crire une instance d'un problme mathmatique. Ce chier peut tre excut via le terminal. Plus prcisment, aprs avoir lanc l'excutable saisir les commandes suivantes pour excuter le chier nomm par exemple

plexFexe, totoFlp :

il faut

La syntaxe du format de chier LP


  

En gnral :
4win4 HEWA
ou

Les commentaires sont prcds d'un backslash, et peuvent tre placs n'imLe chier doit commencer par le mot cl

porte o dans le chier. Les mots cls doivent tre en dbut de ligne.

Dbut de chier : Les variables :


4wx4,

4winimize4, 4wximize4, @EzD eED


, [
et n'excdant pas

o la casse n'a pas d'importance. Les variables sont nommes par une chane alphanumrique

ou un de ces symboles 3

4 5 6 7 8 @ A G D FYc d { } 9 | i,
ou

16 caractres, et ne peut commencer par une priode ou un chire. Les caractres , sont interdits dans les noms de variables. La lettre valides, ou par une autre lettre

e,

i,

ou

e,

seule ou suivie par des symboles

est interdite car cette notation est rserve pour

l'exponentielle. Ainsi, les noms de variables suivants sont interdits :

eW, iEPR, iVts,

etc.

La fonction objectif :
winimizeGwximize IxI C PxP C QxQ IxI C Px P C QxQ
fonction objectif

La dnition de la fonction objectif doit suivre les mots cls

et peut tre saisie sur plusieurs lignes tant que ni une variable, ni une peut tre saisie de la faon suivante :

constante, ni une indication de sens n'est coupe par un retour la ligne. Par exemple, la

x1 + 2 x2 + 3 x3

mais non comme a

La fonction objectif doit tre nomme en la faisant prcder d'un nom suivi de deux points ( : ), et le nom et les deux points ( : ) doivent apparatre sur la mme ligne. Le nom de la

Attention :
s'crira :

fonction objectif doit tre dni en suivant les mmes rgles que pour les noms de variables. si la fonction objectif est quadratique, les termes quadratiques doivent tre multiplis par deux, placs entre crochets [ et ], puis diviss par deux (aprs le crochet refermant). Par exemple, la fonction objectif quadratique suivante

max x1 + 2x2 + x2 1 + 3 x1 x2

wximize ojX xI C PxP C PxIBxICTxIBxPGP




Les contraintes :

ujet to, FF, ou F o la casse n'a pas d'importance. Chaque dnition de contrainte

La section dnissant les contraintes doit commencer par le mot cl

doit commencer sur une nouvelle ligne. Une contrainte doit tre nomme en entrant un nom et deux points ( : ) avant la contrainte, et le nom et les deux points ( : ) doivent apparatre sur la mme ligne. Le nom de chaque contrainte doit tre dni en suivant les mmes rgles que pour les noms de variables. Si aucun nom n'est assign aux contraintes, le solveur les nommera

I, P, Q,

etc. Une contrainte doit tre suivie par une indication sur

son sens et un coecient, qui est son membre de droite. Ces deux lments doivent tre saisis sur la mme ligne. Les sens possibles sont

timeX xI C xP `a IH

<, <=, =<, >, >=, =>,

et

=.

Par exemple :

Les bornes :
fyxh,

La section dnissant les bornes des variables est optionnelle (par dfaut,

chaque variable sera un rel positif ou nul), et doit commencer par le mot cl

fyxh

ou

o la casse n'a pas d'importance. Chaque dnition de borne doit commencer sur

une nouvelle ligne. Les bornes sont reprsentes par de simples ingalits. Par exemple, si

5.6 x +4.2, on crit : ESFT `a x `a RFP Les bornes + et sont reconnues par les mots cls CinfinityD EinfinityD CinfD Einf. Dans le cas o x +, il est possible d'crire : x free
qui est quivalent :

E infinity `a x `a C infinityF
Pour spcier qu'une variable est de type entier, il faut ajouter une section qui commence par le mot cl

qixiev (ou par le mot cl fsxe pour des variables binaires), o la casse n'a pas

d'importance, et o le mot cl doit tre seul sur une ligne. Cette section doit apparatre aprs la section dnissant les bornes. Par contre il n'y a pas d'ordre entre les sections

qixiev et fsxe. Pour ces deux sections, la ligne suivant la ligne contenant le mot cl est une liste des
variables qui sont restreintes tre entires ou binaires, spares par au plus un espace. Par dfaut, une variable dclare dans la section

Fin de chier : Le chier doit se terminer par le mot cl ixh, o la casse n'a pas d'importance. Ce mot cl doit tre seul sur une ligne.

qixiev

sera un entier positif ou nul.

Un exemple :

(P )

M ax s.c.

obj = f (x1 , x2 , x3 , x4 ) = x1 + 2x2 + 3x3 + x4 x1 + x2 + x3 + 10x4 20 x1 3x2 + x3 30 x2 3.5x4 = 0 x1 40 x1 0, x2 0, x3 0, x4 N

Le problme

(P )

peut tre saisi au format LP de la faon suivante :

wximize ojX xI C P xP C Q xQ C xR ujet o IX E xI C xP C xQ C IH xR `a PH PX xI E Q xP C xQ `a QH QX xP E QFS xR a H founds H `a xI `a RH qenerl xR ind

Exercice 1

On veut modliser et rsoudre le programme linaire en variables mixtes suivant :

(P L)

M ax s.c.

f (x1 , x2 , x3 , x4 , x5 ) = 3x1 + 5x2 6x3 + 2x4 x5 x1 + 5x2 + 7x3 + 2x4 + 3x5 96 4x1 + 2x2 + 6x3 + 1x4 + 4x5 68 0 x1 18 2 x3 11 4 x5 16 x2 {0, 1} x4 {0, 1} x5 N

1. crivez

(P L)

au format LP dans votre diteur de texte favori.

2. Rsolvez ce problme l'aide de IBM-Cplex. Observez ce qui se passe et ce qu'ache le

Exercice 2
(QP )

solveur. On veut modliser et rsoudre le programme quadratique suivant :

M in s.c.

2 2 f (x1 , x2 , x3 ) = 3x2 1 + 5x2 + 6x3 + 2x1 x2 + 6x1 x3 + 7x2 x3 + 2x1 + 6x2 10x3 3x1 + x2 + 5x3 25 0 x1 10 4 x2 6 2 x3 12 x N3
au format LP dans votre diteur de texte favori.

1. crivez

(QP )

2. Rsolvez ce problme l'aide de IBM-Cplex. Observez ce qui se passe et ce qu'ache le solveur. Que se passe-t-il si on cherche maximiser la fonction objectif ?

2 Utilisation du solveur IBM-Cplex avec modlisation en OPL


OPL est un langage de modlisation, qui permet d'crire une instance d'un programme mathmatique, mais aussi un modle gnral, dans lequel les donnes peuvent varier. Le chier contenant le modle est sux par sux par

Fdt.

Fmod,

et le chier contenant les donnes d'une instance particulire est

2.1

Exercice 3  Une premire instance en OPL


blme

Programmation linaire

On veut modliser et rsoudre le pro-

(P L)

dni dans l'exercice 1.

1. Lancez Cplex et crez un nouveau projet (pile merez ce nouveau projet

premierprojet.

Eb new Eb opl projet).

Vous nom-

2. Crez un nouveau modle. (Clic droit sur le projet Vous nommerez ce nouveau modle

premierprojet, puis new Eb model). premiermodeleFoplFmod

3. ditez le chier suivant qui est en langage de modlisation OPL :

GG rolemX premiermodeleFmod dvr flotC xIY dvr oolen xPY dvr flot xQY dvr oolen xRY dvr int xSY dexpr flot z a QBxI C SBxPETBxQ C PBxR ExSY mximize z Y sujet to { IX xIC SBxP C UBxQ C PBxR C QBxS `a WTY PX RBxIC PBxP C TBxQ C IBxR C RBxS `a TVY QX xI `a IVY RX xQ ba PY SX xQ `a IIY TX xS ba RY UX xS `a IT } Compilez et rsolvez (P L). Observez les informations

4.

que renvoie IBM-Cplex.

Comment rsoudre un problme l'aide d'OPL?


.dat associ (voir l'exercice suivant), vous devez crer une

Aprs avoir cr le chier .mod correspondant votre problme, et ventuellement un chier

conguration d'excution. Pour cela :

1. Aller dans la fentre de gauche Projets OPL, et cliquer (clic droit) sur Congurations d'excution. Slectionner Nouveau puis Conguration d'excution. Donner un nom cette conguration (par exemple Conguration_test_1). 2. Dans la fentre Projets OPL, cliquer (clic droit) sur le nom du chier .mod ajouter la conguration, et slectionner Ajouter la conguration d'excution, puis Conguration_test_1 (i.e. la conguration d'excution que vous venez juste de crer). Fates de mme pour l'ventuel chier .dat associ. 3. Enn, toujours dans la fentre Projets OPL, cliquer (clic droit) sur le nom de votre con-

Exercice 4  Gnralisation

guration (ici, Conguration_test_1), et slectionner Excuter cette conguration. On veut modliser et rsoudre le problme gnral qui consiste

maximiser une fonction linaire sous une contrainte linaire d'galit, une contrainte linaire

d'ingalit, et sous les contraintes que les variables doivent tre binaires :

M ax s.c. (P LN E ) s.c.
1. Crez le projet

z=
n i=1

ci x i

ai xi = b
i=1 n

di xi
i=1

xi {0, 1} i = 1, . . . , n

vxi. Fmod
(par exemple

2. Crez un nouveau modle OPL et crivez le chier qui reprsente chier sera sux par

plneFmod).

(P LN E ).

Le nom de

GG wodele vxi GG honnes int n a FFFY int IFFn a FFF Y int IFFn a FFFY int a FFFY int dIFFn a FFFY int e a FFFY GG riles dvr oolen xIFFnY

GG xomre de vriles GG goeffiients de l fontion ojetif GG goeffiients de l ontrinte d9glit GG eond memre de l9glit GG goeffiients de l ontrinte d9inglit GG eond memre de l9inglit

GG yjetif dexpr int f a sum@i in IFFnA iBxiY mximize fY GG gontrintes sujet to { egliteX sum@i in IFFnA iBxi aa Y inegliteX sum@i in IFFnA diBxi `a eY } GG effihge de l solution exeute eppsgreqiyvsyx { writeln@44AY for @vr iaIY i`anY iCCA { write@4x4 C i C 4a4 C xi C 4 4AY } writeln@44AY }
3. crivez le chier qui contient des donnes pour ce modle. Le nom de chier sera sux par

n d e

Fdt (par exemple plneFdt). a SY a IP IS S IT IU Y a P T I U V Y a IRY a P T I U V Y a PHY

Rsolvez l'instance associe.

4. Tlchargez les cinq chiers de donnes disponibles l'adresse suivante :

nmFfrG~lmertGwyGigweGdtG,

et rsolvez les instances associes de

httpXGGedriF (P LN E ).

Exercice 5  Ensemble stable de poids maximal


dterminer, dans

Soit un graphe G = (V, E ) o V = {v1 , . . . , vn } dsigne l'ensemble des sommets et E l'ensemble des artes. Un sous-ensemble de sommets S de V est un ensemble stable si aucune paire de sommets de cet ensemble n'est relie par une arte. A chaque sommet est associ un poids positif ou nul. Le poids d'un ensemble stable est gal la somme des poids de ses sommets. Dans ce problme, nous cherchons

G,

un ensemble stable de poids maximal.

1. Crez le projet

tleoidswx.

2. Aprs avoir modlis le problme du stable de poids maximal sous forme d'un programme linaire en variables binaires, crez un nouveau modle OPL et crivez le chier qui reprsente ce problme. 3. Tlchargez les cinq chiers de donnes disponibles l'adresse suivante :

Exercice 6  Carrs magiques n nn une et une seule fois


Pour tout matrice et contenant

nmFfrG~lmertGwyGigweGdtG,

httpXGGedriF
n
est une

et rsolvez les instances associes.

3,

un carr magique de taille

chacun des nombres entiers compris entre

n2 ,

et dont la somme des lments sur chaque ligne, chaque colonne et chacune des deux

diagonales est la mme (on peut noter qu'une telle matrice n'existe pas pour 1. Crez le projet

n = 2).

grrewgique.
n
quelconque, crez un nouveau modle OPL et

2. Aprs avoir modlis par un programme linaire en variables binaires la recherche de l'existence d'un carr magique de taille crivez le chier qui reprsente ce problme. Comme le problme est hautement symtrique, on cherchera attnuer cette symtrie (pour faciliter la rsolution) en minimisant la valeur de l'lment en haut gauche (c'est--dire, sur la premire ligne et la premire colonne) de la matrice. (On vous conseille de dnir les variables binaires suivantes :

xijk = 1
de

si et seulement si l'lment sur la

ime n

ligne et la

j me

colonne vaut

k .)

3. Rsolvez ce problme pour direntes valeurs de

par exemple

n = 3,

et en augmentant

progessivement, sans dpasser

n (en commenant par de petites valeurs n = 8).

2.2

Exercice 7  Bipartition optimale d'un graphe


1. Crez le projet

Programmation quadratique

On considre un graphe non orient de

n sommets dont toutes les artes ont une valeur positive ou nulle, et l'on cherche une partition de l'ensemble des sommets en deux sous-ensembles, l'un de taille k , l'autre de taille n k .

Parmi toutes les bipartitions possibles, on veut dterminer celle qui minimise la somme des poids des artes ayant une extrmit dans chacune des parties.

fiprtition.

2. Aprs avoir modlis le problme de la bipartition optimale d'un graphe sous forme d'un programme quadratique en variables binaires, crez un nouveau modle OPL et crivez le chier qui reprsente ce problme. 3. Quelle proprit doit en thorie avoir la matrice des cots des artes pour que le problme puisse tre rsolu ecacement ? 4. Tlchargez les cinq chiers de donnes disponibles l'adresse suivante :

nmFfrG~lmertGwyGigweGdtG,

httpXGGedriF

et rsolvez les instances associes.

Exercice 8  Un programme quadratique


suivant :

On veut modliser et rsoudre le problme

(QP )

M ax s.c.

z=
i=1 j =1 n

qij xi xj b i = 1, . . . , n

ai xi
i=1

xi {0, 1}
6

1. Crez le projet

xi.

2. Crez un nouveau modle OPL et crivez le chier qui reprsente ce problme. 3. Quelle proprit doit en thorie avoir la matrice des cots de la fonction objectif pour que le problme puisse tre rsolu ecacement ? 4. Tlchargez les cinq chiers de donnes disponibles l'adresse suivante :

nmFfrG~lmertGwyGigweGdtG,

httpXGGedriF

et rsolvez les instances associes.

3 Utilisation du solveur IBM-Cplex via une API


Il est galement possible d'interfacer IBM-Cplex avec du L'ensemble de ce TP prend des exemples en langage de votre choix. L'interfaage de IBM-Cplex avec un langage de programmation a pour intrt majeur de pouvoir intervenir pendant le parcours de l'arbre de rsolution, lors du traitement d'un problme ayant des variables entires.

gCC,

g,

du

gCC,

du

tee

ou du

ython.

mais pour le projet vous serez libre d'utiliser le

Avant de commencer :
ython se trouve vIPrPGindexFjsp.
l'adresse suivante : trouve l'adresse suivante :

1. La documentation en ligne sur l'interface d'IBM-Cplex avec du

g, du gCC, du tee ou du httpXGGpiFdheFimFomGinfoenterGosinfoG

2. Un guide d'utilisation sur l'interface d'IBM-Cplex avec du

pdf.

g, du gCC, du tee ou du ython se httpXGGedriFnmFfrG~lmertGwyGigweGdoGsnterfeF

3. Les exemples dans les dirents langages de programmation se trouvent dans le rpertoire

4.

gXrogrm piles @xVTAsfwsvyqgvitudioIPSplexexmplessr L'interface IBM-Cplex avec le langage gCC ne fonctionne qu'avec Microsoft Visual Studio 2010, vous tlchargerez l'installeur l'adresse suivante httpXGGedriFnmFfrG~lmertG wyGigweGsouresGsouresmvsFexe
disponibles l'adresse suivante

5. Des projets Microsoft Visual Studio 2010 paramtrs pour l'interfaage avec IBM-Cplex sont

Exercice 9  Une premire instance en C++


l'exercice 1. 1. Ouvrez le projet

projetmvsG

httpXGGedriFnmFfrG~lmertGwyGigweGsouresG
Nous allons rsoudre le problme

(P L)

de

pl qui contient dans 5inlude `ilplexGiloplexFhb svyvfiqsx

le chier

plFpp

le code

gCC

suivant :

stti void populteyrow @slowodel modelD sloxumrerry xD slongeerry A { sloinv env a modelFgetinv@AY xFdd@sloxumr@envD HFHD IVFHAAY xFdd@sloxumr@envD HFHD IFHD svysxAAY xFdd@sloxumr@envD PFHD IIFHAAY xFdd@sloxumr@envD HFHD IFHD svysxAAY xFdd@sloxumr@envD RFHD ITFHD svysxAAY modelFdd@slowximize@envD QBxH C S B xIETBxP C PBxQ ExR AAY Fdd@ xHC SBxI C UBxP C PBxQ C QBxR `a WTAY Fdd@ RBxHC PBxI C TBxP C IBxQ C RBxR `a TVAY modelFdd@AY
7

} int min @voidA { sloinv envY try { slowodel model@envAY sloxumrerry vr@envAY slongeerry on@envAY populteyrow @modelD vrD onAY slogplex plex@modelAY plexFsolve@AY envFout@A `` 4olution sttus a 4 `` plexFgetttus@A `` endlY envFout@A `` 4olution vlue a 4 `` plexFgetyjlue@A `` endlY sloxumerry vls@envAY plexFgetlues@vlsD vrAY envFout@A `` 4lues a 4 `` vls `` endlY plexFgetlks@vlsD onAY envFout@A `` 4lks a 4 `` vls `` endlY plexFexportwodel@4plFlp4AY } th @sloixeption8 eA { err `` 4gonert exeption ughtX 4 `` e `` endlY } th @FFFA { err `` 4nknown exeption ught4 `` endlY } envFend@AY return HY }
2. Compilez votre chier gnrer l'excutable 3. Rsolvez

Exercice 10  Interfaage en C++

(P L)

en

plFpp. Gnrez ensuite la solution associe au projet pl, qui doit plFexe lanant l'excutable plFexe depuis l'invite de commande Ms-Dos.
Reprenez les exercices 4, 5, 7 et 8 et rsolvez les pro-

Exercice 11  Les callbacks en C++

gCC. Vous rsolverez les instances disponibles l'adresse httpXGGedriFnmFfrG~lmertGwyGigweGdtG en lisant les donnes dans les chiers Fdt disponibles.
blmes poss l'aide de l'interface en Le but de cet exercice est d'intervenir pendant le parcours de l'arbre de rsolution d'un programme en nombres entiers an de pouvoir ajouter des ingalits valides, si elles sont violes. Reprenez le problme du stable de poids maximal de l'exercice 5, que vous avez interfac avec Cplex en suivantes sont valides pour ce problme : i) Nous pouvons d'abord remarquer que dant tout cycle de taille peut y avoir plus de valides suivantes :

gCC

dans l'exercice 9. Les ingalits

p impaire du graphe, il ne p 1 2 sommets slectionns dans le stable. Nous obtenons les ingalits xi
iC

|C| 1 2

cycle impair du graphe

ii) Nous rappelons qu'une clique est un sous-graphe complet d'un graphe. Il est vident que, pour toute clique d'un graphe, au plus un seul sommet de cette clique peut appartenir au stable. Nous obtenons les ingalits valides suivantes :

xi
iQ

clique du graphe

1. En remarquant que ces deux familles d'ingalits sont identiques pour

k = 3,

dterminez

un algorithme pour dtecter les cycles de taille 3 (et donc les cliques de taille triangles, dans un graphe partir de la matrice d'adjacence du graphe.

3),

ou

2. Intervenez au cours du parcours de l'arbre, en ajoutant, si elles sont violes, les ingalits valides de triangle. Plusieurs exemples sont disponibles dans le dossier

gXrogrm piles @xVTAsfwsvyqgvitudioIPPplexexmplepp. En particulier, vous y trouverez les chiers ilodmipexRFpp et ilodmipexSFpp. Vous ajouterez obligatoirement
dans votre programme la ligne de code suivante :

plexFsetrm@slogplexXXgliquesD EIAY