Introduction à la Programmation par Contraintes TP 1. Présentation d’OPL Lionel Eyraud-Dubois INRIA Bordeaux—Sud-Ouest 2015-2016 Lignes directrices Vue d’ensemble de logiciels OPL Development Studio Lab : problème de production des bandes d’acier Logiciels disponibles pour résoudre des CSPs I Payants I I I I I 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 I I I Choco Solver, interface : Java. MINION, interfaces : un fichier texte spécial, E SSENSE ’. Gecode, interface : C++. D’autres sont mentionnés sur Wikipédia (article « Programmation par contraintes »). Logiciels disponibles pour résoudre des CSPs I Payants I I I I I 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 I I I Choco Solver, interface : Java. MINION, interfaces : un fichier texte spécial, E SSENSE ’. Gecode, interface : C++. D’autres sont mentionnés sur Wikipédia (article « Programmation par contraintes »). Logiciels disponibles pour résoudre des CSPs I Payants I I I I I 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 I I I Choco Solver, interface : Java. MINION, interfaces : un fichier texte spécial, E SSENSE ’. Gecode, interface : C++. D’autres sont mentionnés sur Wikipédia (article « Programmation par contraintes »). Logiciels disponibles pour résoudre des CSPs I Payants I I I I I 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 I I I Choco Solver, interface : Java. MINION, interfaces : un fichier texte spécial, E SSENSE ’. Gecode, interface : C++. D’autres sont mentionnés sur Wikipédia (article « Programmation par contraintes »). Exemple : affectation des fréquences I I I I Variables : Fi — fréquence affectée à l’émetteur i. Variables additionnelles : Si = 0 si basse et 1 si haute. Contraintes : I | Fi − Fj |≥ dij , ∀(i, j) ; I all-different(F1 , . . . , F5 ). Contraintes additionnelles : I element(Si , {0, 0, 0, 1, 1, 1, 1}, Fi ), ∀i. I gcc({Si }∀i , {0, 1}, 2, 3, 2, 3). T2 ≥ 3 ≥2 ≥1 T1 ≥2 ≥ ≥3 1 T4 ≥ 2 T5 T3 ≥1 Lignes directrices Vue d’ensemble de logiciels OPL Development Studio Lab : problème de production des bandes d’acier IBM ILOG CPLEX Optimization Studio Trial version : http ://www-01.ibm.com/software/integration/ optimization/cplex-cp-optimizer/ (Windows, Linux, Mac OS, ...) Déclaration des données et variables /********************************************* * 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 ; Le fichier avec les données /********************************************* * OPL 6.0.1 Data * File : frequencies.dat *********************************************/ nbFreqs = 7 ; nbTrans = 5 ; Diffs = [[0 3 0 [3 0 2 [0 2 0 [0 1 3 [2 2 1 BasseHaute = [0 0 1 3 0 1 0 2] 2] 1] 1] 0]] ; 0 1 1 1 1] ; Déclaration de la objective et des contraintes 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 ; } execute { for (var t=1 ; t<=nbTrans ; t++) writeln("F["+t+"]="+F[t]) ; } Trouver toutes les solutions 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() ; } Les contraintes existantes dans OPL I Arithmétiques (on peut utilisez min, max, count, abs, element). I Logiques (&&, ||, !, =>, !=, ==). I Explicites (allowedAssignments, forbiddenAssignments). I Pour l’ordonnancement (endBeforeStart, endAtStart, noOverlap, ...) I Specialisées (allDifferent, allMinDistance, inverse, lex, pack) Déclaration des heuristiques execute { var fc = cp.factory ; var phase1 = fc.searchPhase(F, fc.selectSmallest(fc.varIndex(F)), fc.selectLargest(fc.value())) ; cp.setSearchPhases(phase1) ; } Évaluateurs des variables : Évaluateurs des valeurs : varIndex(dvar int[]) domainSize() domainMin() regretOnMin() successRate() impact() ... value() valueImpact() valueSuccessRate() explicitValueEval(int[],int[]) valueIndex(int[]) Déclaration des heuristiques execute { var fc = cp.factory ; var phase1 = fc.searchPhase(F, fc.selectSmallest(fc.varIndex(F)), fc.selectLargest(fc.value())) ; cp.setSearchPhases(phase1) ; } Évaluateurs des variables : Évaluateurs des valeurs : varIndex(dvar int[]) domainSize() domainMin() regretOnMin() successRate() impact() ... value() valueImpact() valueSuccessRate() explicitValueEval(int[],int[]) valueIndex(int[]) Paramétrage du solveur execute { var p = cp.param ; p.logPeriod = 10000 ; p.searchType = "DepthFirst" ; p.timeLimit = 600 ; } Les options : AllDiffInterenceLevel CountInferenceLevel ElementInferenceLevel BranchLimit TimeLimit LogVerbosity PropagationLog SearchType Low, Basic, Medium, Extended Low, Basic, Medium, Extended Low, Basic, Medium, Extended <number> <number>(in seconds) Quiet, Terse, Normal, Verbose Quiet, Terse, Normal, Verbose depthFirst, Restart, MultiPoint Paramétrage du solveur execute { var p = cp.param ; p.logPeriod = 10000 ; p.searchType = "DepthFirst" ; p.timeLimit = 600 ; } Les options : AllDiffInterenceLevel CountInferenceLevel ElementInferenceLevel BranchLimit TimeLimit LogVerbosity PropagationLog SearchType Low, Basic, Medium, Extended Low, Basic, Medium, Extended Low, Basic, Medium, Extended <number> <number>(in seconds) Quiet, Terse, Normal, Verbose Quiet, Terse, Normal, Verbose depthFirst, Restart, MultiPoint Utilisation de l’OPL au CREMI 1. Télécharger et desarchiver le modèle pour affectation des fréquences : www.labri.fr/perso/eyraud/ index.php/Main/PPC-TP1 =⇒ 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 Utilisation d’OPL au CREMI (2) Documentation se trouve à /opt/local/CPLEX_Studio/doc/html/ en-US/documentation.html 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 Utilisation d’OPL au CREMI (2) Documentation se trouve à /opt/local/CPLEX_Studio/doc/html/ en-US/documentation.html 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 Lignes directrices Vue d’ensemble de logiciels OPL Development Studio Lab : problème de production des bandes d’acier Description du problème I Une aciérie (steel mill) a un stock des plaques d’acier (steel slabs) des tailles différentes. I A partir de ces plaques, il faut produire les bandes d’acier (steel coils) commandées de type différent. I Chaque type des bandes d’acier exige le processus de production différent encodé par une « couleur ». I Chaque commande (order) est caractérisé par le poids et le couleur de la bande d’acier commandée. I Chaque plaque d’acier peut être utilisé pour la production des bandes d’acier de deux couleurs différentes au plus. I 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. I L’objective est de minimiser la perte totale (la capacité inutilisée des plaques d’acier). Informations pratiques Fichiers nécessaires se trouvent à www.labri.fr/perso/eyraud/ index.php/Main/PPC-TP1 =⇒ stillmill.zip Aide I or : IDE and OPL > OPL > OPL keywords > or I dexpr : IDE and OPL > OPL > OPL keywords > dexpr I pack : IDE and OPL > OPL > OPL functions > pack Informations pratiques Fichiers nécessaires se trouvent à www.labri.fr/perso/eyraud/ index.php/Main/PPC-TP1 =⇒ stillmill.zip Aide I or : IDE and OPL > OPL > OPL keywords > or I dexpr : IDE and OPL > OPL > OPL keywords > dexpr I pack : IDE and OPL > OPL > OPL functions > pack