PPC2011_2012 - informatique decisionnelle

Transcription

PPC2011_2012 - informatique decisionnelle
Programmation par
contraintes
Virginie gabrel
Master ID
2011-2012
PPC - V. Gabrel
1
Plan
Exemple introductif : Sudoku
Partie 1 : Définition d’un CSP
Partie 2 : Résolution d’un CSP
Partie 3 : La PPC avec OPL
PPC - V. Gabrel
2
Exemple introductif : sudoku
7
5
2
5
6
1
3
7
9
9
4
3
2
7
4
6
4
2
6
7
4
2
5
1
PPC - V. Gabrel
3
Exemple introductif : sudoku
7
5
2
5
6
1
3
7
9
9
4
3
2
7
4
6
4
2
6
7
4
2
5
1
PPC - V. Gabrel
?
123456789?
4
Exemple introductif : suduko
7
5
2
5
6
1
3
7
9
9
4
3
2
7
4
6
4
2
6
7
4
2
5
1
PPC - V. Gabrel
?
Réduction de
domaine par
propagation des
contraintes
Case : 1 2
Ligne : 5 7
Colonne : 2 7
=>1 2 3 4 5 6 7 8 9
5
Exemple introductif : sudoku
7
5
2
5
6
1
3
7
9
9
4
3
2
7
4
6
4
2
6
7
4
2
5
1
PPC - V. Gabrel
4
Réduction du
domaine
34689
Seule position
possible pour le
4
=> Réduire les
domaines des
autres cellules
6
Sudoku et PPC
• Cellule = variable qui doit prendre une valeur
dans le domaine : 1..9
• Existence de contraintes restreignant les
domaines des variables
• Raisonnement par élimination de valeurs et
réduction du domaine
• Raisonnement local propagé sur les
domaines admissibles des autres variables
 PRINCIPES AU CŒUR DE LA PPC
PPC - V. Gabrel
7
Sudoku : Modèle
• Variables et domaines :
x[i,j]  1..9 pour i et j allant de 1 à 9
• Contraintes :
Pour i allant de 1 à 9
// valeurs différentes en ligne
allDifferent(x[i,j] : j de 1 à 9 )
// valeurs différentes en colonne
allDifferent(x[j,i] : j de 1 à 9);
Pour i allant de 0 à 2
Pour j allant de 0 à 2
// valeurs différentes dans les cases 3x3
allDifferent(x[3*i+k,3*j+q] : k et q de 1 à 3);
PPC - V. Gabrel
8
Sudoku avec OPL
/*********************************************
* OPL 6.3 Model
* Author: utilisateur
* Creation Date: 11 mai 2010 at 20:49:52
*********************************************/
using CP;
int taille=9;
dvar int x[1..taille,1..taille] in 1..taille;
subject to {
forall(i in 1..taille) {
allDifferent(all(j in 1..taille) x[i,j]);
allDifferent(all(j in 1..taille) x[j,i]);
}
forall(i in 0..2)
forall(j in 0..2)
allDifferent(all(k in 1..3, q in 1..3) x[3*i+k,3*j+q]);
x[1,1]==7;x[2,2]==2;x[2,3]==5;x[3,2]==6;x[3,3]==1;x[3,4]==9;x[1,6]==5;x[1,8]==3;x[2,9]==7;
x[5,1]==4;x[6,2]==7;x[5,4]==3;x[5,5]==2;x[6,6]==6;x[4,7]==9;x[6,8]==4;x[6,9]==2;
x[7,2]==4;x[7,3]==6;x[9,3]==7;x[8,5]==4;x[9,5]==5;x[8,7]==2;x[9,7]==1;
}
PPC - V. Gabrel
9
Solution
// solution
x = [[7 9 4 2 6 5 8 3 1]
[3 2 5 4 1 8 6 9 7]
[8 6 1 9 3 7 4 2 5]
[6 8 2 5 7 4 9 1 3]
[4 5 9 3 2 1 7 6 8]
[1 7 3 8 9 6 5 4 2]
[5 4 6 1 8 2 3 7 9]
[9 1 8 7 4 3 2 5 6]
[2 3 7 6 5 9 1 8 4]];
PPC - V. Gabrel
10
Spécificités de la programmation
par contraintes
• Combine des techniques de
raisonnement/déduction avec du calcul.
• Méthodologie utilisée :
– Modéliser le problème en termes de variables, de
domaines et de contraintes (spécifiant les
combinaisons admissibles de valeurs aux
variables)
– Choisir un langage pour exprimer les contraintes
– Appliquer une méthode de résolution :
énumération et réduction de l’espace de recherche
PPC - V. Gabrel
11
Partie 1 : Définition d’un CSP
1 – Le problème des reines
2 – Qu'est-ce qu'une contrainte ?
3 – Qu'est ce qu'un CSP: Constraint
Satisfaction Problem ?
4 –Un deuxième exemple : Intégration de
nouveaux employés dans une entreprise
PPC - V. Gabrel
12
Exemple : le problème des n reines
Problème : placer n reines sur un échiquier
nxn de façon à ce qu’elles ne puissent pas
s’attaquer.
1
2
3
4
1
1
1
2
2
3
3
4
4
Solution partielle
PPC - V. Gabrel
2
3
4
Solution complète
13
Modélisation sous la forme d’un
CSP
Variables : X = (x1,…,xn, y1, …, yn)
Associer à chaque reine i deux variables xi et yi correspondant respectivement à
la ligne et la colonne sur laquelle placer la reine.
Domaines : D=(Dx1, …, Dxn, Dy1,…, Dyn) avec Dxi = Dyi = 1..n pour tout i
Contraintes : C=(clig,ccol,cdm,cdd)
• Les reines doivent être sur des lignes différentes.
clig = {xi≠xj pour tout i=1..n et j=1..n avec i≠j}  clig = allDifferent({xi})
• Les reines doivent être sur des colonnes différentes.
ccol = {yi≠yj pour tout i=1..n et j=1..n avec i≠j}  ccol = allDifferent({yi})
• Les reines doivent être sur des diagonales montantes différentes.
cdm = {xi+yi≠xj+yj pour tout i allant de 1 à n, pour tout j allant de 1 à n}
• Les reines doivent être sur des diagonales descendantes différentes.
Cdd = {xi-yi≠xj-yj pour tout i allant de 1 à n, pour tout j allant de 1 à n}
Une solution du problème des 4 reines, pour cette première modélisation, est
A = {(x1,1), (y1,2), (x2,2), (y2,4), (x3,3), (y3,1), (x4,4), (y4,3)}
PPC - V. Gabrel
14
Qu'est-ce qu'une contrainte ?
• Une contrainte est une relation logique (une
propriété qui doit être vérifiée) entre
différentes inconnues, appelées variables,
chacune prenant ses valeurs dans un ensemble
donné, appelé domaine.
• Une contrainte restreint les valeurs que
peuvent prendre simultanément les variables.
Par exemple, la contrainte "x + 3*y = 12"
restreint les valeurs que l'on peut affecter
simultanément aux variables x et y.
PPC - V. Gabrel
15
Qu'est-ce qu'une contrainte ?
Une contrainte peut être définie en extension
On énumére les tuples de valeurs satisfaisant la contrainte .
Exemple : si les domaines des variables x1 et x2 sont {0,1,2}
alors on peut définir la contrainte x1 < x2 en extension par
"(x1,x2) élément-de {(0,1),(0,2),(1,2)}"
Variable : xj et son domaine de définition Dj
Contrainte : c(i) est définie par un couple (v(i),r(i)) où :
• v(i)=(x1,…,xk) : liste de k variables
• r(i) : une liste de k-uplets admissibles, sous-ensemble du
produit cartésien D1X…XDk
↔ ensemble des combinaisons de valeurs admissibles
PPC - V. Gabrel
16
Qu'est-ce qu'une contrainte ?
Une contrainte peut être définie en intension
• n variables : X=(x1,…,xn)
• n domaines (finis) : i=1,..,n, xiDi
• m contraintes : C=(c(1),…,c(m))
• c(i) = (v(i), r(i)) où v(i) une liste de k variables
et r(i) une relation.
PPC - V. Gabrel
17
Arité d’une contrainte
C’est le nombre de variables sur lesquelles elle
porte =|v(i)|.
Si k=1 : contrainte unaire
Si k=2 : contrainte binaire : x1 ≠ x2
Si k=3 : contrainte ternaire : x1x2x3
Si k=n : contrainte n-aire :
allDifferent(v(i)) = contraint toutes les
variables appartenant à v(i) à prendre des
valeurs différentes.
PPC - V. Gabrel
18
Différents types de contraintes
Fonction des domaines de valeurs des variables :
• numériques portent sur des variables à valeurs
numériques = une égalité (=) , une différence (≠) ou
une inégalité (<, ≤, >, ≥) entre 2 expressions
arithmétiques. On distingue : les contraintes
numériques sur les réels, les contraintes numériques
sur les entiers, les contraintes numériques linéaires, les
contraintes numériques non linéaires , …
• booléennes portent sur des variables à valeur
booléenne (vrai ou faux) : une contrainte booléenne est
une implication (=>), une équivalence (<=>) ou une non
équivalence (<≠>) entre 2 expressions logiques.
PPC - V. Gabrel
19
Qu'est ce qu'un CSP ?
Un pb de Satisfaction de Contraintes (CSP) est un problème P
modélisé sous la forme d'un ensemble de contraintes posées
sur des variables, chacune de ces variables prenant ses valeurs
dans un domaine.
CSP est définie par un triplet (X,D,C) où
X=(x1,…,xn)
D=(D1,…,Dn) avec i=1,..,n, xiDi
C=(c(1),…,c(m))
avec c(i) = (v(i), r(i)) où c(i) est une relation entre les variables
de v(i), restreignant les valeurs que peuvent prendre
simultanément ces variables.
CSP binaire : Ne contient que des contraintes binaires
Exemple : soit le CSP (X,D,C) suivant :
X = (a,b,c,d) D(a) = D(b) = D(c) = D(d) = {0,1} C = { a ≠ b, c ≠ d,
a+c < b }
PPC - V. Gabrel
20
Qu'est ce qu'un CSP ?
Une solution du CSP (X,D,C) : affectation des valeurs aux variables de telle
sorte que toutes les contraintes soient satisfaites.
A = { (x1,v1), (x2,v2), ..., (xn,vn) } = l'affectation qui instancie la variable xk par
la valeur vk, k=1..n.
Affectation totale : toutes les variables du problème sont instanciées
Affectation partielle : seule une partie des variables est instanciées. Xk (inclus
dans X) est le domaine de l’affectation
Une affectation A viole une contrainte c(k) si toutes les variables de v(k) sont
instanciées dans A, et si la relation définie par r(k) n'est pas vérifiée pour
les valeurs des variables de v(k) définies dans A.
Une affectation (totale ou partielle) est consistante si elle ne viole aucune
contrainte, et inconsistante si elle viole une ou plusieurs contraintes.
Une solution est une affectation totale consistante, c'est-à-dire une
instanciation de toutes les variables du problème qui ne viole aucune
contrainte
PPC - V. Gabrel
21
Différents problèmes de CSP
SP = ensemble de solutions du CSP P
P est consistant ssi SP ≠ .
 Prouver qu’un CSP est consistant
 Exhiber une solution qui maximise un ou
plusieurs critères
 Calculer ou estimer le nombre de solutions d’un
CSP
• Si SP = .
=>Trouver l'affectation totale qui viole le moins de
contraintes possibles = max-CSP ou min-VCSP
lorsque chaque contrainte a un poids (= une valeur
proportionnelle à l'importance de la contrainte, et
on cherche l'affectation totale qui minimise la
somme des poids desPPCcontraintes
violées).
- V. Gabrel
22
Autre modélisation du pb des n reines
n variables X = {x1,…,xn} : xi = position de la reine i sur la colonne i.
Domaines : D(xi) = {1,…,n} pour tout i allant de 1 à n
Contraintes :
• les reines doivent être sur des lignes différentes
Clig = {xi ≠ xj / pour i allant de 1 à n, pour j allant de 1 à n et i ≠ j}
• les reines doivent être sur des diagonales montantes différentes
Cdm = {xi+i ≠ xj+j / pour tout i allant de 1 à n, pour tout j allant de 1
à n et i ≠ j}
• les reines doivent être sur des diagonales descendantes différentes
Cdd = {xi-i ≠ xj-j / pour tout i allant de 1 à n, pour tout j allant de 1 à
n et i ≠ j}
Solution du problème des 4 reines :
A = {(x1,2), (x2,4), (x3,1), (x4,3)}.
PPC - V. Gabrel
23
Deuxième exemple
Pour l’accueil de 30 nouveaux employés, on souhaite constituer 10 équipes
de 6 personnes avec 30 employés. Chaque équipe doit être constituée de 6
personnes : 3 nouveaux + 3 employés. Chacun des employés est affecté à un
service indicé de A à F et chaque équipe doit être contenir au plus 4 employés
du même service. Les employés des services A et B ne peuvent être dans la
même équipe ; même contrainte pour les employés des services E et F.
Données :
• Les employés sont indicés de 0 à 59 : les nouveaux employés ont un
numéro pair alors que les autres ont un numéro impair.
• Les affectations aux services sont :
•
•
•
service
A
B
C
intervalle
0-19
20-39 40-44
D
E
F
45-49
50-54
55-59
L’employé 5 doit être dans la même équipe que l’employé 41.
L’employé 15 doit être soit avec l’employé 40 soit avec l’employé 51.
Soit l’employé 20 est avec 24, soit l’employé 22 est avec 50.
PPC - V. Gabrel
24
Modèlisation sous la forme d’un
CSP
Variables : xi = numéro d’équipe affecté à l’employé i, i=0..59
Domaines : Di = {1,..,6} pour tout I
Contraintes :
• Pour tout j allant de 1 à 6
– count(pour i allant de 0 à 59 avec i%2=0 : xi= j)=3
– count(pour i allant de 0 à 59 avec i%2=1 : xi= j)=3
– count(pour i allant de 0 à 19, xi=j)<=4
– count(pour i allant de 20 à 39, xi=j)<=4
– count(pour i allant de 40 à 44, xi=j)<=4
– count(pour i allant de 45 à 49, xi=j)<=4
– count(pour i allant de 50 à 54, xi=j)<=4
– count(pour i allant de 55 à 59, xi=j)<=4
•Pour tout j allant de A à F
…
•x5=x41
•(x15=x40)(x15=x51)
PPC - V. Gabrel
25
Exemple d’applications
industrielles
• Allocation de ressources (tournées de
véhicules)
• Emploi du temps
• Planification de production
• Ordonnancement
• Vérification et diagnostic
• …
PPC - V. Gabrel
26
Partie 2 : Résolution d’un CSP
1.
2.
3.
4.
5.
6.
Procédure d’exploration Engendrer et tester
Procédure Retour Arrière Simple
La consistance locale
Filtrage a priori
Filtrage en cours de résolution
Heuristiques
On ne limite à des CSP à variables entières !!
PPC - Virginie Gabrel
27
1. Procédure Engendrer et tester
Obj : Enumérer l’ensemble des affectations
complètes jusqu’à en trouver une qui soit
consistante
PPC - Virginie Gabrel
28
Procédure Engendrer et tester
Procédure EngTest(A,X,D,C)
Si A est totale alors
si A est consistante alors retourner vrai sinon faux fsi
Sinon
choisir xj non instanciée
pour tout v dans Dj faire
si EngTest(A(xj,v),X,D,C) alors retourner vrai
fin pour
retourner faux
Fsi
Appel : EngTest(,X,D,C)
PPC - Virginie Gabrel
29
Procédure Engendrer et tester
• On ne teste que la consistance des
affectations totales
• Pas de détection d’inconsistance sur les
affectations partielles
• Le nb de solutions explorées peut être très
grand = |D1|x…x|Dn|
Si |Dj|=2 => 2n solutions. Dès que n>15 =>
impossible à résoudre
=> TRES MAUVAISE PROCEDURE
PPC - Virginie Gabrel
30
Pistes d’amélioration
• Ne développer que les affectations
partielles consistantes => Procédure
RetourArrièreSimple
• Réduire les tailles des domaines des
variables en enlevant les valeurs
inconsistantes
PPC - Virginie Gabrel
31
2. Procédure Retour Arrière Simple
Procédure RAS(A,X,D,C)
Si A est totale alors retourner A fsi
Sinon
choisir xj non instanciée
pour tout v dans Dj faire
si A(xj,v) est consistante alors RAS(A (xj,v),X,D,C)
fin pour
Fsi
Appel : RAS(,X,D,C)
PPC - Virginie Gabrel
32
Procédure Retour Arrière Simple
• Permet d’éliminer des solutions partielles
par paquet !
• Pistes d’amélioration : s’apercevoir plus tôt
qu’un sous-arbre ne contient pas de
solutions.
PPC - Virginie Gabrel
33
3. La consistance locale
Obj : Supprimer des valeurs des variables qui
ne mènent à aucune solution  valeurs
inconsistantes avec une ou plusieurs
contraintes
Exemple:
Dx={1,2,3}, Dy={2,3,4}, x>=Y
Si x=1, pas de valeur dans Dy pour vérifier la
contrainte
Suppression de 1 dans Dx
PPC - V. Gabrel
34
Nœud-consistance
• S’applique aux contraintes unaires
Définition : Un CSP est nœud-consistant si
xX, c(i)C telle que |v(i)|=1, vDx,
(x,v) vérifie r(i).
PPC - V. Gabrel
35
Arc-consistance
• S’applique sur les contraintes binaires
Définition : Un CSP est arc-consistant ssi
c(i)C telle que |v(i)|=2 avec v(i)={x,y}
– vDx, v’Dy: {(x,v),(y,v’)} vérifie r(i)
– vDy, v’Dx: {(x,v’),(y,v)} vérifie r(i)
Remarque :  algo polynomiaux pour rendre
arc-consistant un CSP.
PPC - Virginie Gabrel
36
Hyper-arc-consistance
• S’applique sur des contraintes d’arité
qqconque
Définition : Soit une contrainte c(i) d’arité k, c(i) est
hyper-arc-consistant si xv(i) et vDx,  une
affectation A des variables de v(i)\{x} telle que
A(x,v) vérifie r(i)
Un CSP est hyper-arc-consistant ssi toute ses
contraintes sont hyper-arc-consistantes.
PPC - V. Gabrel
37
Hyper-arc-consistance
Un CSP est hyper-arc-consistante si
chaque valeur v de n’importe quel
domaine de variable peut participer à une
affectation totale consistante.
Pour une contrainte binaire : hyper-arcconsistance = arc-consistance
PPC - V. Gabrel
38
4-Filtrage a priori
Comment rendre un CSP arc-consistant ?
Par le Filtrage.
PPC - Virginie Gabrel
39
Procédure Filtrage a priori
Procédure FAP1(X,D,C)
L<- {(xi,xj), (xj,xi) avec ij liées par une contrainte binaire}
Répéter
modification <- faux
pour tout (xi,xj) dans L
modification <- REVISE (xi,xj)modification
fin pour
Tant que modification= vrai
Procédure REVISE(xi,xj)
modification <- faux
pour tout v dans Di faire
S’il n’existe pas v’Dj tel que {(xi,v), (xj,v’)} est consistance alors
Di <- Di\{v}
modification <- vrai
fin si
Fin pour
Retourner modification
PPC - Virginie Gabrel
40
Procédure Filtrage a priori
Limite de FAP1 : A chaque réduction de domaine on parcours
de nouveau L = > TRES LONG
Procédure FAP2(X,D,C)
L<- {(xi,xj), (xj,xi) avec ij liées par une contrainte}
Tant que L  
choisir et supprimer de L un couple (xi,xj)
si REVISE(xi,xj) alors
L <- L{(xk,xi):  contrainte liant xk et xi}
fin si
Fin tant que
Si à l’issue de FAP1 ou FAP2, il existe un domaine vide
 CSP inconsistant
PPC - Virginie Gabrel
41
Exercice 1
Peut-on rendre le CSP suivant arc-consistant ?
Appliquer FAP1 puis FAP2
Variables : x,y,z
Domaines :
Dx={0,1,2}
Dy={0,1,2}
Dz={0,1,2,3,4}
Contraintes
(x,y){(0,1),(1,0),(2,2)}
(x,z){(0,2),(0,3),(1,1),(2,1)}
(y,z){(0,2),(1,4)}
PPC - V. Gabrel
42
Exercice 2 : Planification de tâches
On doit planifier 6 tâches dans un délai de 6 heures
1
T1
T2
T3
1
T4
T6
1
T5
2
2
Graphe potentiel-tâche
Chaque tâche ne peut commencer qu’en début
d’heure. La tâche T1 ne peut pas être planifiée à la
même heure que la tâches T4.
1. Modéliser ce problème comme un CSP
2. Rendre ce CSP arc-consistant.
PPC - V. Gabrel
43
Limites du filtrage a priori
• Procédure longue et pas nécessairement efficace
Exemple:
• X=(x1,…,xn)
• Di={1,…,n} pour tout i allant de 1 à n
• C=(X, all-diff(x1,…,xn))
le filtrage a priori n’enlève aucune valeur.
Amélioration : utiliser le filtrage en cours
d’énumération
PPC - V. Gabrel
44
5-Filtrage en cours de résolution
A chaque instanciation : anticiper les
conséquences de l’affectation partielle sur
les domaines des variables restant à
instancier
Filtrer les domaines des variables non
affectées en enlevant les valeurs
inconsistantes
 Différents filtrages possibles
PPC - V. Gabrel
45
Différents filtrages étant donné une
affectation partielle A
• Pour chaque variable xi non affectée,
enlever de Di toute valeur v telle que
l’affectation A{(xi,v)} ne soit pas
consistante ( on anticipe d’une étape
dans l’énumération)
 FILTRAGE PAR CONSISTANCE DE
NŒUD
PPC - V. Gabrel
46
Procédure Forward Checking
Procédure FC(A,V,D,C)
Si V= alors A est une affectation totale consistante
Sinon
choisir xk dans V
pour tout v dans Dk
si check-forward(xk,v,V\{xk},D,C) alors
FC(A(xk,v),V\{xk},D,C)
fin si
fin pour
Fin si
Procédure check-forward(xk,v,V,D,C)
pour tout xj  V
pour chaque v’  Dj
si {(xk,v),(xj,v’)} inconsistant alors Dj <- Dj\{v’}
fin pour
Si Dj= alors retourner faux
fin pour
Retourner vrai
Appel : FC(,X,D,C)
PPC - Virginie Gabrel
47
Différents filtrages étant donné une
affectation partielle A
• Pour chaque variable xi non affectée,
enlever de Di toute valeur v telle qu’il
existe une variable xj non affectée pour
laquelle, pour toute valeur w de Dj,
l’affectation A{(xi,v),(xj,w)} ne soit pas
consistante ( on anticipe de deux étapes)
FILTRAGE PAR CONSISTANCE D’ARC
PPC - V. Gabrel
48
Procédure full Look-Ahead
Après chaque instanciation, réaliser une arcconsistance complète sur les variables non
instanciées
+ réduit les domaines encore mieux que le FC
- beaucoup plus gourmand en tps de calcul
A faire :
• Simuler sur le pb des 4 reines
• Comparer FC et FLA sur le CSP suivant :
X={x,y,z}, Dx=Dy=Dz={1,2}, C={xy,yz,xz}
PPC - V. Gabrel
49
Différents filtrages étant donné une
affectation partielle A
• Anticipe de 3 étapes dans l’énumération
FILTRAGE PAR CONSISTANCE DE
CHEMIN ou 3-CONSISTANCE
• …
• Plus un filtrage est fort, plus il sera long à
exécuter !
PPC - V. Gabrel
50
Traitement de contraintes
spécifiques
• La contrainte allDifferent
1
?
2
4
3
2
x[1,1] == 1
=> x[1,2]{2,3,4}
x[1,4] == 2
=> x[1,2]{3,4}
x[3,2] == 3
=> x[1,2]{4}
PPC - V. Gabrel
51
La contrainte allDifferent
allDifferent(x1,…,xn)
• Calculer nv : nbre de variables non
instanciées
• R : ensemble des valeurs restantes dans les
domaines des variables non instanciées
Si nv > |R| alors CSP inconsistant
PPC - V. Gabrel
52
Traitement de allDifferent
c est une contrainte allDifferent(X)
nv=|X|
Procedure filtrageAllDifferent(c)
V<- X
Tant que xV telle que Dx ={v}
V<- V\{x}
pour tout x’V, Dx’ <- Dx’\{v}
Fin tq
U<-
Pour tout xX faire U<-UDx
Si nv >|U| alors retourner Inconsistance
PPC - V. Gabrel
53
Traitement de allDifferent
Limite de la procédure filtrageAllDifferent(c)
Après réduction de domaine :
{1,2}
4
{1,2}
3
3
{1,2}
{1,2}
4
4
3
{1,2}
{1,2}
{1,2}
{1,2}
{1,2,
3,4}
{1,2}
PPC - V. Gabrel
allDifferent(x33,x34,x43,x44)
nv=4
|X|=4
=> CSP consistant ?
Réponse : non
54
Traitement de allDifferent
Pour aller plus loin :
1. Calculer un couplage
maximal dans un
graphe biparti (cmax
est la valeur du
couplage) avec par ex
un algorithme de flot
2. Si nv>cmax => CSP
inconsistant
PPC - V. Gabrel
x33
1
x34
2
x43
3
x44
4
cmax=3
55
5. Heuristiques
Obj : faire apparaître les échecs le plus tot possible
Ordre des variables à instancier :
• Priorité aux variables liées (par des contraintes) au
plus grand nombre de variables déjà instanciées
• Priorité aux variables ayant le domaine de + petite
cardinalité
• Priorité aux variables intervenant dans le plus
grand nombre de contraintes
Ordre de vérification des contraintes : priorité aux
contraintes les moins satisfiables
PPC - V. Gabrel
56
CSP qqconque -> CSP binaire
Soit un CSP=(X,D,C) avec C=C2Ck , C2 contient les
contraintes binaires et Ck les m contraintes d’arité > 2
Obj : Le transformer en CSP binaire équivalent (même
ensemble de solutions)
A toute contrainte c(i) d’arité k (k>2), associer une var yi
dont le domaine est l’ensemble des k-uplets
consistants de c(i)
Définir CSP’=(X’,D’,C’) = CSP de la façon suivante :
X’=XY
C’=C2{i=1..m, xj : jeme var de v(i), xj=j-eme-arg(yi)}
avec j-eme-arg(yi) la fonction unaire qui renvoie la jeme
variable du k-uplet
PPC - V. Gabrel
57
Exemple
CSP=(X,D,C) avec X={x1,x2,x3,x4}, Di={0,1},
C={c2(1),ck(1),ck(2)}, c2(1): x1x2=1 et ck(1): x1x2=x3,
ck(2): x1x2=x4
y={y1,y2}
Dy1={(x1,x2,x3) : ck(1) est vérifiée}
= (0,0,0)(0,1,0)(1,0,0)(1,1,1)}
Dy2 ={(x1,x2,x4) : ck(1) est vérifiée}
={(0,0,0)(0,1,1)(1,0,1)(1,1,1)}
C’={c2(1)}{x1=1er-arg(y1), x2=2eme-arg(y1),
x3=3eme-arg(y1), x1=1er-arg(y2), x2=2eme-arg(y2),
x4=3eme-arg(y2)}
PPC - V. Gabrel
58
La PPC avec OPL
Plusieurs solveurs disponibles proposant des
librairies
• IBM ILOG CP Optimizer (C++, java, OPL
development studio)
• Microsoft Solver Foundation (C++, Python,
inclus dans EXCEL 2007)
• Choco Solver (java) www.chococonstraints.net gratuit
PPC - V. Gabrel
59
Exemple Accueil des nouveaux
sous OPL
using CP;
range persons=0..59;
range teams=1..10;
{string} serviceNames={"A","B","C","D","E","F"};
{int} service[serviceNames]=[asSet(0..19),asSet(20..39),asSet(40..44),
asSet(45..49),asSet(50..54),asSet(55..59)];
dvar int team[persons] in teams;
subject to {
forall(t in teams) {
count(all(i in persons: i%2==1) team[i],t)==3;
count(all(i in persons: i%2==0) team[i],t)==3;
forall(f in serviceNames)
count(all(i in service[f]) team[i],t)<=4;
}
forall(pA in service["A"],pB in service["B"]) team[pA]!=team[pB];
forall(pE in service["E"],pF in service["F"]) team[pE]!=team[pF];
team[5]==team[41];
(team[15]==team[40]) || (team[15]==team[51]);
(team[20]==team[24]) || (team[22]==team[50]);
}
PPC - V. Gabrel
60
Les contraintes sous OPL
• Arithmétiques : min, max, count, abs,
element
• Logiques : &&, ||,!, =>,!=,==
• Explicites : allowedAssignments,
forbiddenAssignments
• Spécialisées : allDifferent, allMinDistance,
inverse, lex, pack
PPC - V. Gabrel
61
allowedAssignments
Purpose : OPL function to define the allowed combinations of
values.
Type : boolean (1 if the constraint is true, 0 otherwise)
Syntax : allowedAssignments({tuple-type},int, ...)
Description : This constraint allows you to easily define the
allowed combinations of values for several integer decision
variables. This constraint can apply to any number of
variables (and therefore each has a variable number of
arguments). The set of allowed combinations is given by a
tuple with an arity (number of fields) equal to the number of
considered variables. Each tuple defines an allowed
combination.
PPC - V. Gabrel
62
Exemple
using CP;
tuple C { int a; int b; };
{C} possibles = {<1,1>, <2,4>};
{C} forbidden = {<3,5>};
dvar int+ x;
dvar int+ y;
subject to {
allowedAssignments(possibles, x, y);
forbiddenAssignments(forbidden, x, y);
}
PPC - V. Gabrel
63
Contraintes spécialisées
• allDifferent : constrains variables within a dvar array
to all take different values
• allMinDistance : constrains variables within a dvar
array to all take values that are one-to-one different by
at least a given gap
• inverse : takes two arrays of integer variables that
must be indexed by an integer and be onedimensional
• lex : states that the first array of variables is less than
or equal to the second array of variables in the
alphabetical order
• pack : represents some simple but powerful onedimensional packing constraint
PPC - V. Gabrel
64
Contrainte pack
Purpose : a constraint to
maintain the load of a set of
containers.
Type : boolean (1 if the
constraint is true, 0
otherwise)
Syntax
pack([dvar] int[], [dvar] int[],
int[])
pack([dvar] int[], [dvar]
int[],int[], [dvar] int)
j=1..n ((p[j]==i)*(w[j]))==l[i] i

using CP;
int m = 2; //nb containers
int n = 3; //nb objets
dvar int l[j in 1..m] in 0..10000;
dvar int p[i in 1..n] in 1..m;
dvar int nb;
int w[1..n] = [i : 1 | i in 1..n];
subject to {
pack(l, p, w, nb);
} assert nb==m-count(l,0);
PPC - V. Gabrel
65
Références
• http://www710.univlyon1.fr/~csolnon/Site-PPC
• Principles of constraint programming K.
R. Apt
PPC - V. Gabrel
66