Lignes directrices Introduction à la Programmation par Contraintes TP 1. Présentation de l OPL Ruslan Sadykov INRIA Bordeaux Sud-Ouest 17 Novembre 2014 1 / 18 2 / 18 Logiciels disponibles pour résoudre des CSPs Payants IBM ILOG CP Optimizer, interfaces : C++, Java, IBM ILOG CPLEX Optimization Studio (OPL). Artelys Kalis, interfaces : C++, Java, Xpress-Mosel. Microsoft Solver Foundation, interfaces : CLS-compliant languages (C++, IronPython,...) Add-in Designer for Excel 2007. Comet (gratuit pour un usage académique), interface : un langage spécial (type C) Gratuits Choco Solver, interface : Java. MINION, interfaces : un fichier texte spécial, ESSENSE. Gecode, interface : C++. D autres sont mentionnés sur Wikipédia (article «Programmation par contraintes»). Exemple : affectation des fréquences Variables : F i fréquence affectée à l émetteur i. Variables additionnelles : S i = 0 si basse et 1 si haute. Contraintes : F i F j d ij, (i, j) ; all-different(f1,..., F 5 ). Contraintes additionnelles : element(s i, {0, 0, 0, 1, 1, 1, 1, F i ), i. gcc({s i i, {0, 1, 2, 3, 2, 3). T 1 3 T 5 T 2 T 4 T 3 3 3 / 18 4 / 18
Lignes directrices IBM ILOG CPLEX Optimization Studio Trial version : http ://www-01.ibm.com/software/integration/ optimization/cplex-cp-optimizer/ (Windows, Linux, Mac OS,...) 5 / 18 6 / 18 Déclaration des données et variables Le fichier avec les données /********************************************* * OPL 6.0.1 Model * File : frequencies.mod *********************************************/ using CP ; //!!!!! int nbfreqs =... ; int nbtrans =... ; range Freqs = 1..nbFreqs ; range Trans = 1..nbTrans ; int Diffs[Trans,Trans] =... ; int BasseHaute[Freqs] =... ; dvar int F[Trans] in Freqs ; dvar int S[Trans] in 0..1 ; /********************************************* * OPL 6.0.1 Data * File : frequencies.dat *********************************************/ nbfreqs = 7 ; nbtrans = 5 ; Diffs = [[0 3 0 0 2] [3 0 2 1 2] [0 2 0 3 1] [0 1 3 0 1] [2 2 1 1 0]] ; BasseHaute = [0 0 0 1 1 1 1] ; 7 / 18 8 / 18
Déclaration de la objective et des contraintes Trouver toutes les solutions minimize max(t in Trans) F[t] ; subject to { forall (ordered t1, t2 in Trans : Diffs[t1,t2] > 0) abs( F[t1] - F[t2] ) >= Diffs[t1,t2] ; alldifferent(f) ; forall (t in Trans) S[t] == element(bassehaute,f[t]) ; count(s,0) == 2 ; count(s,1) == 3 ; for (var t=1 ; t<=nbtrans ; t++) writeln("f["+t+"]="+f[t]) ; main { thisoplmodel.generate() ; cp.startnewsearch() ; var n=0 ; while (cp.next()) { n = n+1 ; write("solution -> ") ; writeln(n) ; for (var t=1 ; t<=thisoplmodel.nbtrans ; t++) writeln("\t F["+t+"]="+thisOplModel.F[t]) ; cp.endsearch() ; 9 / 18 10 / 18 Les contraintes existantes dans OPL Déclaration des heuristiques Arithmétiques (on peut utilisez min, max, count, abs, element). Logiques (&&,,!, =>,!=, ==). Explicites (allowedassignments, forbiddenassignments). Pour l ordonnancement (endbeforestart, endatstart, nooverlap,...) Specialisées (alldifferent, allmindistance, inverse, lex, pack) var fc = cp.factory ; var phase1 = fc.searchphase(f, fc.selectsmallest(fc.varindex(f)), fc.selectlargest(fc.value())) ; cp.setsearchphases(phase1) ; Évaluateurs des variables : varindex(dvar int[]) domainsize() domainmin() regretonmin() successrate() impact()... Évaluateurs des valeurs : value() valueimpact() valuesuccessrate() explicitvalueeval(int[],int[]) valueindex(int[]) 11 / 18 12 / 18
Paramétrage du solveur Utilisation de l OPL au CREMI var p = cp.param ; p.logperiod = 10000 ; p.searchtype = "DepthFirst" ; p.timelimit = 600 ; Les options : AllDiffInterenceLevel CountInferenceLevel ElementInferenceLevel BranchLimit TimeLimit LogVerbosity PropagationLog SearchType <number> <number>(in seconds) Quiet, Terse, Normal, Verbose Quiet, Terse, Normal, Verbose depthfirst, Restart, MultiPoint 1. Télécharger et desarchiver le modèle pour affectation des fréquences : www.math.u-bordeaux1.fr/~rsadykov/ teaching/mse3315c/tp/frequencies.zip 2. Ouvrir Terminal et connecter à un des serveur de calcul : ssh mcgonagall ou ssh trelawney 3. Executer la commande ou la mettre dans ~/.bashrc export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/ opt/local/cplex_studio/opl/bin/ x86-64_sles10_4.1 4. Aller dans le repertoire avec le modèle pour affectation des fréquences et exécuter oplrun frequencies.mod frequencies.dat 13 / 18 14 / 18 Utilisation d OPL au CREMI (2) Documentation se trouve à /opt/local/cplex_studio/doc/html/ en-us/documentation.html Lignes directrices ou pic.dhe.ibm.com/infocenter/ cosinfoc/v12r4/index.jsp Acces à l OPL de l extérieur du CREMI 1. Acceder à la machine d accueil du CREMI par ssh : ssh <login>@jaguar.emi.u-bordeaux1.fr 2. Connecter à un des serveurs de calcul : ssh mcgonagall ou ssh trelawney 15 / 18 16 / 18
Description du problème Une aciérie (steel mill) a un stock des plaques d acier (steel slabs) des tailles différentes. A partir de ces plaques, il faut produire les bandes d acier (steel coils) commandées de type différent. Chaque type des bandes d acier exige le processus de production différent encodé par une «couleur». Chaque commande (order) est caractérisé par le poids et le couleur de la bande d acier commandée. Chaque plaque d acier peut être utilisé pour la production des bandes d acier de deux couleurs différentes au plus. Le poids total des bandes d acier produites à partir d une même plaque d acier ne peut pas dépasser la capacité (ou la taille) de cette plaque. L objective est de minimiser la perte totale (la capacité inutilisée des plaques d acier). Informations pratiques Fichiers nécessaires se trouvent à Aide www.math.u-bordeaux1.fr/~rsadykov/ teaching/mse3315c/tp/stillmill.zip or : IDE and OPL > OPL > OPL keywords > or dexpr : IDE and OPL > OPL > OPL keywords > dexpr pack : IDE and OPL > OPL > OPL functions > pack 17 / 18 18 / 18