Satisfaction de contraintes
Pierre De Loor – enib – cerv
deloor@enib.fr www.enib.fr/~deloor
Qu’est ce qu’une contrainte
Contraintes :
U = R * I
F=1/2 ρ*S*v
2
X=pluie -> Y= eau
Distinctions liées à
Domaine (symboles, intervalles, entiers, réels …)
Langage (linéaire, quadratique, extension …)
Contraintes sur les réels
Problèmes de type « sciences physiques »
Les contraintes linéaires expriment des rapports de grandeurs entre variables continues
Algorithme du simplexe / réels ou rationnel
Complexité polynomiale (en moyenne)
Complexité exponentielle (au pire)
D’autres algorithmes s’attachent à résoudre des contraintes non linéaires (quadratiques,
géométriques).
Quad
Décomposions sémantiques
Contraintes discrètes
Peuvent potentiellement exprimer tout type de contraintes (peuvent être définies en extension)
Configuration d’équipements
Conception, raisonnement temporel
Ordonnancement de tâches
Emploi du temps, puzzles
Complexité exponentielle (NP complet)
Un mécanisme de retour arrière basique est
irréaliste
Contraintes discrètes avec optimisation : le problème des entrepôts
Client j : demande dj Localisation
possible i : coût fixe fi capacité Mi
Localisation possible
Localisat ion possible
Localisation possible
Localisation possible
n
coût cij
Origines de la programmation par contrainte
Mathématiques
Recherche Opérationnelle
Programmation par Contraintes
Informatique
Intelligence
Artificielle
Quelques outils associés
SICStus Prolog
Domaines Finis (FD), Booleens, Réel
www.sics.se/sicstus
CHIP
Solveur en C/C++ hébergé sous prolog
Concept de ‘contraintes globales’ (alldifferent, circuit, element …)
www.cosytec.com
ECLIPSe
Prolog avec librairies FD, Réels, ensembles
Intégrations de RO (CPLEX, XPRESS-MP)
www.icparc.ic.ac.uk/eclipse
ILOG solver
Solveur en C++ et/ou Java
Ensemble, Réels, FD
ILOG Scheduler est une sur-couche spécialisée dans la planification
SWI-Prolog :
CHR = support pour différents systèmes de contraintes, exploité pour de nombreux domaines;
www.swi-prolog.org
GNU-Prolog :
FD;
http://pauillac.inria.fr/~diaz/gnu-prolog/
Contraintes arithmétiques et prolog
fact(0,1).
fact(X,Y):- X2 is X-1, fact(X2,Z), Y is Z*X.
?- fact(3,X).
X = 6
?- fact(Y,6).
[WARNING: Arguments are not sufficiently instanciated]
Exception: ( 9) _L168 is _G123-1 ?
fact(0,1).
fact(X,Y):- X2 = X-1, fact(X2,Z), Y = Z*X.
?- fact(3,X).
: :
Call: (11)fact(3-1-1-1, _L195) ? creep
Call: (12) 3-1-1-1==0 ? creep Fail: (12) 3-1-1-1==0 ? creep
Contraintes sur les réels et CHIP
fact(0,1).
fact(X,Y):- X ^> 0, X2 ^= X-1, fact(X2,Z), Y ^=Z*X.
?-fact(5,X).
X=120 ?
?-fact(Y,120).
Y=5 ?
Contraintes sur les domaines finis en CHIP
crypt :-
[S,E,N,D,M,O,R,Y]::0..9,
alldifferent([S,E,N,D,M,O,R,Y]), S#\=0, M#\=0,
1000*S + 100*E + 10*N + D + 1000*M + 100*O + 10*R + E #=
10000*M + 1000*O + 100*N +10*E + Y,
labeling([S,E,N,D,M,O,R,Y],0,first_fail,indomain), % vu après
writeln([S,E,N,D,M,O,R,Y]).
allSolutions :-findall(_,crypt,_).
Résolution de CSP discrets
Algorithmes de base
Exemple de CSP discret
Variables et domaine
Contraintes et relations
En extension
{a,b,c}
{a,b,c}
{a,b}
{a,b}
{a,b}
X1 X2 X3 X4 x5
Domaines Variables
r1={(a,b),(a,c),(b,c)}
r2={(a,b),(a,c),(b,c)}
r3={(a,b)}
r4={(a,b)}
r5={(a,b)}
v1=(x3,x1) v2=(x3,x2) v3=(x3,x4) v4=(x3,x5) v5=(x4,x5) C1=(v1,r1)
C2=(v2,r2) C3=(v3,r3) C4=(v4,r4) C5=(v5,r5)
Relation Variables
Contraintes
C1 : (x3=a et x1=b) ou (x3=a et x1=c) ou (x3=b et x1=c) Contraintes
binaires
Exemple de CSP discret
Graphe de contraintes
Instanciation partielle
A={x1→b,x2 →a,x3 → a}
Satisfait C1
Viole C2
Ne satisfait pas C3
Ne viole pas C3
{a,b}
X3
{a,b,c}
X1
(a,b) (a,c) (b,c)
C1 :
(a,b) (a,c) (b,c)
{a,b,c}
X2
{a,b}
X4
{a,b}
X5 C2 :
C4:(a,b) C3:(a,b)
C5:(a,b)
Instanciation consistante
Une instanciation est consistante si elle ne viole aucune contrainte (elle peut être partielle)
Vérifier qu’une instanciation est consistante est un problème facile (polynomiale)
Une solution est une instanciation complète consistante
Vérifier qu’une instanciation est une solution est un problème facile
Un CSP est consistant s’il existe une solution
Vérifier qu’un CSP est consistant est NP-complet
Instanciation globalement consistante
Une instanciation est globalement consistante si elle peut être étendue en une solution.
Propriété très utile pour savoir s’il est intéressant de prolonger une instanciation
Mais très difficile à établir
(La consistance globale d’une instanciation vide est équivalente à la consistance du CSP)
Une instanciation globalement consistante
Une solution Une instanciation globalement inconsistante
Exemple
Fabrication d’une voiture
Les portières et le capot sont faits à Lille, mais le constructeur ne dispose que de peinture rose, rouge et noire
La carrosserie est à Hambourg, où l’on a de la peinture blanche, rose, rouge et noire
Les pare-chocs, faits à Palerme, sont toujours blancs
La bâche du toit ouvrant, qui est faite à Madrid, ne peut être que rouge
Les enjoliveurs sont faits à Athènes, où l’on a de la peinture rose et de la peinture rouge
La carrosserie doit être de la même couleur que les portières, les portières de la même couleur que le capot, le capot de la même couleur que la carrosserie
Les enjoliveurs, les parc chocs et le toit ouvrant doivent être plus clairs que la carrosserie
Exemple
{a,b, c,d}
X3
{a}
X1
(a,b) (a,c) (a,d)
(b,b) (c,c) (d,d)
{a,b,c}
X2
{b,c}
X4
{b,c,d}
X5
(b,c) (b,d) (c,d)
{c}
X6
(b,b) (c,c) (d,d) (b,b)
(c,c) (d,d) (c,d)
pare-chocs portière
toit-ouvrant enjoliveurs
carrosserie
a:blanc, b:rose, c:rouge, d:noir
Définition formelle
P=(X,D,C)
X={x1,x2,x3,x5,x6}
D ={
(a),(a,b,c),(a,b,c,d),(b,c),(b,c,d),(c)}
C={
(x1,x3):((a,b),(a,c),(a,d)), (x2,x3):((b,b),(c,c),(d,d))…}
Solutions
S1={x1→a,x2→d,x3→d,x4→b,x5→d,x6→c}
S2={x1→a,x2→d,x3→d,x4→c,x5→d,x6→c}
capot
Consistance globale d’un CSP
Equivalence :
Deux CSP sont équivalents s’ils possèdent les mêmes solutions.
L’un peut être plus simple que l’autre
Exemple : un CSP P’ dont le domaine de x3=(a,d) est équivalent au CSP P précédent
Contrainte induite :
Une contrainte est induite si elle est respectée par toutes les solutions
Exemple : x3:((d)) est induite par P
Intérêt : elle peut être ajoutée au CSP et diminuer la difficulté de recherche d’une solution
Consistance globale :
un CSP est globalement consistant si les valeurs imposées par chaque contrainte séparément font partie des solutions.
Intérêt : toute instanciation partielle satisfaisant une contrainte sans violer les autres est globalement consistante et peut être étendue à une solution
P n’est pas globalement consistant
Exemple , l’instanciation partielle (x1→a, x3→b)
Résolution de CSP
Problèmes classiques
Trouver une solution (NP-difficile)
Satisfiabilité : Prouver qu’un CSP est consistant (NP- complet)
Trouver toutes les solutions
Exhiber une solution particulière qui optimise un ou plusieurs critères
Estimer ou calculer le nombre de solutions
Trouver pour une variable, un ensemble de valeurs qui se trouve dans toutes les solutions
Etc …
Illustration de la compléxité
n variables de cardinalité d
m contraintes
Générer/tester = m*d^n contraintes à tester au pire
Exemple :
n = 20, d = 5 et m = 20
Si le test d’une contrainte prend 10
-6secondes
Le générer/tester peut prendre 60 ans
Le CSP P précédent : 432 vérifications de
contraintes
Algorithme du backtrack
Tester avant de continuer à générer :
tester toutes les variables instanciées une à une
pare-chocs a X1
portière b c d X2
carrosserie a b c d a b c d a b c d X3
enjoliveurs b c b c b c X4
capot b c d b c d X5
toit-ouvrant c c X6
Solution 59 vérifications au + explications d’inconsistances
3+(4*3+4)+(2*3+2*3+2)+(3+3*2+3*2+3)+(2+1+2+2+1)
Filtrage
Simplifier le travail du backtrack
Modifier le CSP en un CSP équivalent
Contraintes induites
Filtrage
Arc-consistance de P
{a,b, c,d}
X3
{a}
X1
(a,b) (a,c) (a,d)
(b,b) (c,c) (d,d)
{d,b,c}
X2
{b,c}
X4
{b,c,d}
X5
(b,c) (b,d) (c,d)
{c}
X6
(b,b) (c,c) (d,d) (b,b)
(c,c) (d,d) (c,d)
pare-chocs portière
toit-ouvrant enjoliveurs
carrosserie
capot
X1-X3 : (a,a) impossible
X6-X3 : (c,b) et (c,c) impossibles X2-X3 : pas de problèmes
X2-X3 : (b,b) et (c,c) impossibles X3-X5 : (b,b) et (c,c) impossibles
Procédure AC3
P’’
Backtrack sur P’’
P’’ est globalement consistant
L’algorithme est glouton
pare-chocs a X1
portière d X2
carrosserie d X3
enjoliveurs b c X4
capot d X5
1erSolution 15 vérifications au +
Un CSP arc-consistant et inconsistant
X1 0,1
X2 0,1 X3 0,1
(0,1) (1,0) X1\=X2
(0,1) (1,0) X1\=X3
(0,1) (1,0) X3\=X2
Panel d’algorithmes d’arc-consistance
Si m est le nombre de contraintes de cardinalité d
AC3 : O(m*d^3)
AC4 : O(m*d^2) mais complexité spatiale importante
AC5 : O(m*d) mais restreint à certains types de contraintes
AC6 : la meilleure complexité spatiale en O(m*d)
et complexité temporelle en moyenne très bonne
K-consistance
L’objectif est de se rapprocher d’un CSP globalement consistant pour ne plus avoir à faire un backtrack
Un CSP est k-consistant si toute instanciation consistante de k-1 variable peut être étendue à une k
ièmevariable tout en restant consistante
K-consistance forte : un CSP est fortement k-consistant si il est k- consistant et (k-1)-consistant et (k-2)-consistant et …
L’arc-consistance est une 2-consistance
La 3-consistance forte s’appelle la ‘chemin-consistance’
Certains algorithmes établissent ces consistances mais leur complexité est souvent un écueil
Amélioration du Backtrack
Heuristiques d’explorations
Ordre d’instanciation des variables (first-fail : faire apparaître vite les violations de contraintes)
Ordre d’instanciation des valeurs
Ordre de vérification des contraintes
Ces ordres peuvent être redéfinis durant la résolution
Sophistication de l’algorithme
Méthodes rétrospectives
Faire le point après chaque instanciation et remonter leurs conséquences dans l’arbre (élagage)
Backtrack intelligent (conflict based backjumping, graph based backjumping, dynamic backtracking, local changes)
Mémorisation de contraintes
Méthodes prospectives
Déclencher, après chaque instanciation, des instanciations annexes pour détecter, à priori, des instanciations non globalement consistantes
Forward-checking, check backward …
Exemple
Heuristiques : ordre d’instanciation (fixe)
Ordre (a) : domaine le + petit → {X1,X2,X3,X4}
Ordre (b) : degrés d’implication (nb contraintes) →{X2,X4,X3,X1} (par exemple)
Ordre (c) dureté des contraintes →{X4,X3,X2,X1} (par exemple)
{1,2,3}
X3 (2)
{1,2}
X2 (2)
{1,2,3,4} X4 (2)
X1 {1}
X3=X4+2 (1/12)
X2.X4>1 (7/8)
X1<=X2 (1) X2<=X3 (5/6)
X2 (1)
Heuristiques sur backtrack
1 X1
1 2 X2
1 2 3 1 2 3 X3
1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 X4
A (domaine)
1 2 X2
1 2 3 4 1 2 3 4 X4
1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 X3
1 X1
B (degrés)
C (dureté)
1 2 3 4 X4
1 2 3 1 2 3 1 2 3 1 2 3 X3
1 2 X2
1 X1
Méthode rétrospective
Backtrack intelligent : le backjumping
pare-chocs a X1
portière b c d X2
carrosserie a b c d a b c d a b c d X3
enjoliveurs b c b c b c X4
capot b c d b c d X5
toit-ouvrant c c X6
X3 est une variable de conflit (à cause des contraintes entre X6 et X3), Il est inutile de faire un simple backtrack sur X5, car aucune instanciation contenant X3->c ne sera consistante : élagage
{a,b, c,d}
X3 X1{a}
(a,b) (a,c) (a,d)
(b,b) (c,c) (d,d)
{a,b,c}
X2
{b,c}
X4
{b,c,d}
X5 (b,c)
(b,d) (c,d)
{c} X6
(b,b) (c,c) (d,d) (b,b) (c,c) (d,d) (c,d)
Mémorisation de contraintes + backjumping
pare-chocs a X1
portière b c d X2
carrosserie a b c d a b c d a b c d X3
enjoliveurs b c b c b c X4
capot b c d b c d X5
toit-ouvrant c c X6
X3\=b
{a,b, c,d}
X3 X1{a}
(a,b) (a,c) (a,d)
(b,b) (c,c) (d,d)
{a,b,c}
X2
{b,c}
X4
{b,c,d}
X5 (b,c)
(b,d) (c,d)
{c} X6
(b,b) (c,c) (d,d) (b,b) (c,c) (d,d) (c,d)
X3\=c X2\=c
X2\=b
Re-exploitation de la mémorisation
pare-chocs a X1
portière b c d X2
carrosserie a b c d a b c d a b c d X3
enjoliveurs b c b c b c X4
capot b c d b c d X5
toit-ouvrant c c X6
X2\=b; X3\=b; X3\=c; X2\=c
Méthode prospective Forward-checking
Check forward
arc-consistance dégradée, très efficace
Si une variable x1 est instanciée, on réduit seulement les ensembles des variables non instanciées par arc-consistance.
FC(V,A)
Si V=φalors A est une solution Sinon
Soit xi∈V
Pour tout v ∈di faire Push(V-{xi})
si check-forward(xi,v,V) alors FC(V-{xi}, A∪{xi->v}) finsi
Pop(V-{xi}) FinPour Finsi
Check-forward(xi,v,V) Soit consistant=true
Pour tout xj∈V-{xi} tant que consistant faire Pour tout v’∈dj faire
si{xi->v, xj->v’} est non consistante alors dj<-dj-{v’}
finsi finPour si dj = φ
alors consistant <- false finsi
finPour
Forward checking
pare-chocs a X1
portière b c d X2
carrosserie b c d X3
enjoliveurs b c X4
capot d X5
toit-ouvrant c X6
V={x1,x2,x3,x4,x5,x6}, A={}
cf(x1,a,V-x1)=true -> d3={b,c,d}
d1= {a}, d2={b,c,d}, d3={a,b,c,d}, d4={b,c}, d5={b,c,d}, d6={c}
fc(V-x1,{x1->a}) -> xi=x2, v=b cf(x2,b,V-x1-x2)=true->d3={b}, d5={b}
fc(V-x1-x2,{x1->a,x2->b}) -> xi=x3, v=b cf(x3,b,V-x1-x2-x3)=false
fc(V,{}) -> xi=x1, v=a
fc(V-x1,{x1->a}) -> xi=x2, v=c cf(x2,c,V-x1-x2)=true->d3={c}, d5={c}
fc(V-x1-x2,{x1->a,x2->c}) -> xi=x3, v=c cf(x3,c,V-x1-x2-x3)=false
fc(V-x1-x2,{x1->a,x2->d}) -> xi=x3, v=d cf(x3,d,V-x1-x2-x3)=true->d4={c,b}, d5={d}
fc(V-x1,{x1->a}) -> xi=x2, v=d cf(x2,d,V-x1-x2)=true->d3={d}, d5={d}
fc(V-x1-x2-x3,{x1->a,x2->d,x3->d}) -> xi=x4, v=b cf(x4,d,V-x1-x2-x3-x4)=true
fc(V-x1-x2-x3-x4,{x1->a,x2->d,x3->d,x4->b}) -> xi=x5, v=d cf(x5,d,V-x1-x2-x3-x4-x5)=true
fc(V-x1-x2-x3-x4-x5,{x1->a,x2->d,x3->d,x4->b,x5->d}) -> xi=x6, v=c cf(x6,c,φ)=true
{a,b, c,d}
X3 X1{a}
(a,b) (a,c) (a,d)
(b,b) (c,c) (d,d)
{a,b,c}
X2
{b,c}
X4
{b,c,d}
X5 (b,c)
(b,d) (c,d)
{c} X6
(b,b) (c,c) (d,d) (b,b) (c,c) (d,d) (c,d)
Bilan sur les algorithmes de résolutions
Il existe peu de comparaisons expérimentales entre les algorithmes.
Il est actuellement impossible de prévoir l’efficacité d’un algorithme face à un problème donné.
Dans les cas généraux les méthodes prospectives fonctionnent en moyenne mieux
Des méthodes hybrides existent (forward checking + mémorisation de contraintes + backtrack intelligent)
On peut définir des classes de CSP plus simples à résoudre (classes polynomiales : complexité polynomiale)
De nombreux travaux portent sur la résolution de CSP
dynamiques qui implique la résolution partielle de CSP
Bibliographie
Cohen J. (1990) Constraint logic programming languages. Communication of the ACM, Vol. 33, n°7, July 1990, P. 52-68.
Colmeraurer A. (1990) An introduction to Prolog III. Communication of the ACM, Vol 33, n°7, July 1990, p. 71-90.
Cras J.-Y. (1993) A review of industrial constraint solving tools (1993).
Fron A. (1994) Programmation par contraintes. Addison-Wesley - 1994.
Hentenryck P.V. (1989) Constraint satisfac tion in logic programming. MIT Press - 1989.
ILOG (1999) ILOG Solver : reference manual 4.4. ILOG -- 1999.
CHIP, System Documentation, (3 tomes), 1996.
Laurière J.-L. (1978) A Language and a program for stating and solving combinatorial problems. Artificial Intelligence, Vol 10, n°1, 1978, p. 29-127.
Jean-Marc Alliot, Thomas Schiex : Intelligence artificielle et informatique théorique, Cepadues.
ICAPS-04 : Tutorial on Constraint Satisfaction for Planning and Scheduling
Fages F. (1996) Programmation Logique par contraintes, Edition Ellipses.