Introduction à la Programmation par Contraintes TP 1. Présentation d’OPL Lionel Eyraud-Dubois

publicité
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
Téléchargement