Programmation par Contraintes PPC Contenu - Index of

Transcription

Programmation par Contraintes PPC Contenu - Index of
SysCom
SysCom
Prog Par Contraintes
Contenu
Programmation par
Contraintes
PPC
Introduction à la PPC
Notion de contrainte
Méthodes de solution
PPC en Java. Bibliothèque Choco
Miguel Tomasena
SysCom - Université de Savoie
1
2
SysCom
SysCom
Prog Par Contraintes
"Constraint programming represents one of the
closest approaches computer science has made to
the Holy Grail of programming:
the user states the problem, the computer solves it."
Notion de
contrainte
Eugene C. Freuder
Cork Constraint Computation Centre
3
4
SysCom
SysCom
Introduction PPC
Introduction PPC
Les langages de PPC proposent :
Qu'est-ce qu'une contrainte ?
Une description déclarative du pb à résoudre
Des techniques de résolution de contraintes
relation qu'indique la compatibilité entre variables
chaque variable prend valeur dans un ensemble appelé domaine
Beaucoup de pbs peuvent être traités de manière
naturelle par la PPC : planification, diagnostic,
conception, jeux ...
Exemple : la relation entre Celcius C et Fahrenheit F
F = (95) * C + 32
est un contrainte.
Les domaines de F et C son les réels
Caracteristiques des ces pbs :
sa solution requiert l'exploration d'un espace de recherche
peuvent avoir plusieurs solutions
peuvent avoir un critère d'optimisation
5
la contrainte es déclarative
l'exemple montre une égalité, non une affectation
l'ordre des déclarations est sans importance
6
SysCom
SysCom
Introduction PPC
Introduction PPC
Définition de contrainte par "extension", énumère explicitement les
valeurs appartenant à la relation.
Arité d'une contrainte : nombre de variables concernées.
exemples de binaires
"x ≠ y"
"A U B = A"
Exemple, si les domaines de x et y sont {0, 1, 2}, alors on peut
définir la contrainte "x inférieur à y" par extension :
"(x=0, y=1), ou (x=0, y=2), ou (x=1 , y=2)" ,
o bien :
"(x,y) élément de {(0,1),(0,2),(1,2)}"
Exemple n-aires
"alldifferent(E)"
où E est un ensemble de variables
Définition de contrainte par "intention", on utilise des propriétés
mathématiques. Exemple :
"x < y"
7
8
SysCom
SysCom
Introduction PPC
Différents types de contraintes
Selon le domaine :
Contraintes numériques : =, ≠ , <, ≤, >, ≥
valeurs réels, entiers ou rationnels
contraintes linaires, exemple
4*x - 3*y + 8*z < 10
et non-linaires, exemples
x*y=2
sinus(x) + z*log(y) = 4
9
Introduction PPC
Contraintes booléennes. Domaine: vrai et faux.
Relations : => , <=>, <≠>
Exemple
(¬ a) ∨ b => c
¬ (a ∧ b) <=> (c ∧ d)
Contraintes de structure. Domaine : l'univers d'Herbrand.
Relations =, ≠ entre deux termes (structures) d l'univers d'Herbrand.
Par exemple, l'unification de "f(X,Y)" avec "f(g(a),Z)"
f(X,Y) = f(g(a),Z)
10
SysCom
SysCom
Introduction PPC
Problème de Satisfaction de Contraintes "CSP"
Un CSP es un triplet (X,D,C) tel que
X = { X1, X2, ..., Xn} est l'ensemble de variables
D est une fonction qui associe à chaque Xi son domaine D(Xi)
C = {C1, C2, ..., Ck} est l'ensemble des contraintes
Exemple de CSP:
X = {a,b,c,d}
D(a) = D(b) = D(c) = D(d) = {0,1}
C = { a ≠ b, c ≠ d, a+c < b }
11
Introduction PPC
Solution d'un CSP
La solution consiste à affecter des valeurs aux variables, de telle sorte
que toutes les contraintes soient satisfaites.
Termes :
Une affectation A = { (X1,V1), (X2,V2), ..., (Xr,Vr) }
est une instanciation d’un ensemble de variables.
Une affectation peut être totale ou partielle
Une affectation (totale o partielle) peut être consistante ou
inconsistante.
Une solution est une affectation totale consistante
12
SysCom
SysCom
Introduction PPC
CSP surcontraint s'il n'y a pas de solution.
--> max-CSP. On cherche à maximiser le nombre de
contraintes satisfaites.
--> CSP valué. On associe un poids à chaque contrainte et on
cherche l'affectation totale qui minimise la somme des poids des
contraintes violées.
Introduction PPC
Premier exemple: le pb des reines
Description : placer 4 reines sur un échiquier de manière qu'aucune
reine ne soit attaquée par une autre.
X
X
X
Lorsqu'un CSP admet beaucoup de solutions différentes, on dit
qu'il est sous-contraint. On peut alors chercher la solution qui
optimise un coût.
--> CSOP (Constraint Satisfaction Optimisation Problem).
13
X
Modélisation sous forme d'un CSP, il faut identifier :
L'ensemble de variables X
Les domaines D des variables.
Les contraintes C entre las variables
14
SysCom
SysCom
Introduction PPC
Introduction PPC
Première Modélisation des reines
La reine i sera placé dans la colonne i, la variable Xi indique la ligne de
la reine i.
Remarques sur la modélisation:
Pour l'instant on ne s'intéresse pas à la solution, on cherche
seulement à modéliser le pb.
Variables : X = {X1,X2,X3,X4}
Domaines : D(X1) = D(X2) = D(X3) = D(X4) = {1,2,3,4}
un même pb peut être modélisé de manières différentes.
La modélisation a une incidence sur la performance de la solution.
Contraintes :
alldifferent(X)
{Xi+i ≠ Xj+j / i ∈ {1,2,3,4}, j ∈ {1,2,3,4} et i ≠ j}
{Xi-i ≠ Xj-j / i ∈ {1,2,3,4}, j ∈ {1,2,3,4} et i ≠ j}
15
16
SysCom
SysCom
Introduction PPC
Deuxième Modélisation des reines
Les variables représentent les positions.
La variable Xij sera associée à la ligne i colonne j.
Variables : X = { X11, X12, X13, X14, X21, X22, X23, X24,
X31, X32, X33, X34, X41, X42, X43, X44}
Domaines : D(Xij) = {0,1} pour tout i, j entre 1 et 4
Introduction PPC
Quelle est la meilleure modélisation ?
Eléments à considérer:
Reflète la réalité, est la plus "naturelle"
Performance dans la résolution
Contraintes :
{Xi1 + Xi2 + Xi3 + Xi4 = 1 / i ∈ {1,2,3,4}}
{X1i + X2i + X3i + X4i = 1 / i ∈ {1,2,3,4}}
pour toute couple de variables
Xij et Xkl, i+j=k+l => Xij + Kkl ≤ 1
Xij et Xkl, i-j=k-l => Xij + Kkl ≤ 1
17
Solution
A = {(X1,2), (X2,4), (X3,1), (X4,3)}
Solution: A = {(X11,0), (X12,1), (X13,0), (X14,0), (X21,0), (X22,0), (X23,0),
(X24,1), (X31,1), (X32,0), (X33,0), (X34,0), (X41,0), (X42,0), (X43,1), (X44,0)}
Dernière remarque: le pb des reines peut être généralisé à n reines.
Variables : X = {Xi / i entier entre 1 et n}
Domaines : D(Xi) = {1, 2, . . . , n}
Contraintes :
alldifferent(X)
{Xi+i ≠ Xj+j / i ∈ {1,..,n}, j ∈ {1,..,n} et i ≠ j}
{Xi-i ≠ Xj-j / i ∈ {1,..,n}, j ∈ {1,..,n} et i ≠ j}
18
SysCom
SysCom
Introduction PPC
Deuxième exemple: les mariages stables
Introduction PPC
Exemple : 6 hommes et 6 femmes.
Chaque membre d'un groupe d'hommes et femmes fait une liste de
ses "préférences" du groupe de sexe opposé.
Les listes peuvent être incomplètes et avoir des ex aequo.
Pour simplifier prenons le même nb d'hommes et femmes.
19
Il s'agit de définir un ensemble de couples "stables".
Par exemple,
si Roméo est marié à Isabelle, et
Paul à Juliette, et
si à la fois Roméo préfère Juliette et
Juliette préfère Roméo,
alors ces mariages ne sont pas stables.
20
SysCom
Liste hommes
Liste femmes
1 préfère 8, (ex aequo 12 et 10)
2 préfère (8 et 11), 12
3 préfère 7, 9, 12
4 préfère 12, 9
5 préfère 8, 7, 11
6 préfère 12, (10 et 8), 11, 7
7 préfère (5 et 3), 6
8 préfère 2, 5, 1, 6
9 préfère (3 et 4)
10 préfère 6, 1
11 préfère 5, 2, 6
12 préfère 1, (4 et 6), 2, 3
Solution, mariages stables :
1 - 10,
2 - 8,
3 - 7,
4 - 9,
5 - 11 et 6 - 12.
SysCom
Introduction PPC
Modélisation de CSPs
Modélisation des mariages stables
Retour de monnaie
On associe à chaque homme i une variable Ei qui représente son
épouse.
Variables :
X = {E1, E2, E3, E4, E5, E6}
Domaines :
D(E1) = {8,10,12}
D(E2) = {8,11,12}
D(E3) = {7,9,12}
D(E4) = {9,12}
D(E5) = {7,8,11}
D(E6) = {7,8,10,11,12}
Contraintes :
préfère(1,X,Y) <=>
alldifferent(X)
(X=8 ∧ Y=12) ∨ (X=8 ∧ Y=10)
pour tout i et j entre 1 et 6,
¬ ( préfère(i,Ej,Ei) ∧ préfère(Ej,i,j) )
où préfère(a,b,c) se satisfasse si a préfère b par rapport à c
21
Solution
A = { (E1,10), (E2,8), (E3,7), (E4,9), (E5,11), (E6,12) }
On s'intéresse à un distributeur automatique de boissons.
L'utilisateur insère des pièces de monnaie pour un total de T centimes
d'Euros, puis il sélectionne une boisson, dont le prix est de P centimes
d'Euros (T et P étant des multiples de 10).
Calculer la monnaie à rendre, sachant que le distributeur a en réserve
10 pièces des chacune des monnaies de : 2 €, 1 €, 50, 20 et 10
centimes.
22
SysCom
SysCom
Modélisation de CSPs
Modélisation
Variables:
{E2, E1, C50, C20, C10}
Domaines:
Pour toutes les variables {0,. .,10}
Contraintes :
T - P = 200*E2 + 100*E1 + 50*C50 + 20*C20 + 10*C10
Méthodes des
solution
Contrainte d'optimisation :
minimiser E2 + E1 + C50 + C20 + C10
23
24
SysCom
SysCom
Solution des CSP
Solution des CSP
Méthodes des solution
Vérification de consistance a-posteriori
On se limitera aux CSP sur les Domaines Finis.
D'autres CSP emploient des méthodes tel que la méthode simplex.
Vérification de la consistance une fois que les variables ont été
instanciées.
La démarche générale : explorer systématiquement l'espace de
recherche.
On termine quand on trouve une affectation consistante ou bien quand
on démontre qu'une telle affectation n'existe pas.
Méthode: Génère et Test. Si l'espace de recherche est fini, alors on
peut vérifier les contraintes quand l'affectation est totale.
Deux familles des méthodes de vérification de consistance de
contraintes :
a-posteriori
et
Taille de l'espace de recherche : O(dn), où d es la cardinalité moyenne
des Domaines de n variables.
Méthode correcte mais impraticable.
a-priori.
25
26
SysCom
SysCom
Solution des CSP
Solution des CSP
Par exemple, supposons d=2 (variables booléennes) et un ordinateur
capable de tester un milliard d'affectations par seconde,
alors on obtient :
Nb de variables n
Nb d'affectations totales
2^n
Temps (10^9
affectations/seg)
10
aprox 10^3
aprox 1 millionième de seg
20
aprox 10^6
aprox 1 millième de seg
30
aprox 10^9
aprox 1 seg
40
aprox 10^12
aprox 16 minutes
50
aprox 10^15
aprox 11 jours
60
aprox 10^18
aprox 32 années
70
aprox 10^21
aprox 317 siecles
Conclusion : génère et test est une méthode impraticable.
Méthodes plus efficaces :
Explorer les affectations partiellement consistantes :
back-track (retour arrière) simple et back-track sélectif.
Réduire les domaines des variables : vérification a-priori
Introduire des heuristiques de recherche.
27
28
SysCom
SysCom
Solution des CSP
Solution des CSP
Back-Track
Analyse des Contraintes. Exemple de CSP:
X ={a,b,c},
D(a)=D(b)=D(c)={0,1,2,3,4, ..., 1000},
C = {4*a - 2*b = 6*c + 3}
L'espace de recherche est de l'ordre d'un milliard d'affectations !
Mais une analyse simple nous permet de voir qu'il n'y a pas de
solution.
Systématiser ce type d'analyse est difficile.
29
Les contraintes sont vérifiées au fur et à mesure des instantiations.
Si une contraintes n'est pas satisfaite, alors l'algorithme reconsidère la
dernière instanciation (back-track chronologique).
Méthode beaucoup plus efficace que "génère et test", mais qui
comporte des pbs :
Explorer répétitivement des combinaisons inconsistantes
Reconsidérer des instantiations qui ne sont pas la cause de
l'inconsistance
30
SysCom
SysCom
Solution des CSP
Solution des CSP
Exemple de recherche avec Back-Track
Algorithme Back-Track chronologique
function back-track(A,(X,D,C)) {
si A est une affectation inconsistante return false
si A est une affectation total return true
sinon { /*A est un affectation partielle consistante*/
sélectionner Xi de X telle non instanciée en A
pour toute valeur Vi de D(Xi) {
si (back_track(A U {(Xi,Vi)}, (X,D,C)) )
return true
}
return false
}
}
31
32
Re
SysCom
SysCom
Solution des CSP
Solution des CSP
Exemple de retour inutile. Déplacer la reine 5 ne "débloque" pas le
placement de la reine 6
Vérification de consistance a-priori
Appelé propagation de Contraintes.
1
2
3
4
5
6
7
8
Méthode complémentaire au back-tack.
1
Son objectif est de diminuer l'espace de recherche en éliminant des
valeurs des domaines des variables. On parle de "filtrage".
2
3
Différents nivaux de filtrages correspondent à des différents niveaux de
vérification de la consistance.
4
5
6
Forward Checking. Filtrage simple. Pour chaque variable Xi non
instanciée, on retire de D(Xi) toute valeur incompatible par rapport aux
variables instanciées.
7
8
33
34
SysCom
SysCom
Solution des CSP
Solution des CSP
Exemple d'application du Forward Checking au reines.
1
1
2
3
4
5
6
7
8
35
2
3
4
5
6
7
8
X X X X X X X
X X
X
X
X
X
X
X
X
X
X
X
X
X
Situation après le
placement de 3
reines :
1
1
2
3
4
5
6
7
8
X
X
X
X
X
X
X
2
3
X X
X X
X
X X
X
X X
X X
X X
4
5
6
X X X
X
X X X
X
X X X
X X X
X X
X
7
8
X X
X X
X X
X
X X
La reine 6 devient instanciée sans besoin de faire un choix. Cette
instanciation peut à son entraîner d'autres réductions de domaines :
36
Forward Checking Généralisé.
SysCom
SysCom
Solution des CSP
Solution des CSP
Algorithme Back-Track avec Forward Checking
function btFc(A,(X,D,C)) {
si A est une affectation no-consistante return false
si A est une affectation totale return true
sinon { /*A est une affectation partielle consistante*/
sélectionner Xi de X non-instanciée en A
pour toute valeur Vi de D(Xi) {
/* filtrage des Domaines */
pour toute variable Xj de X non-instanciée {
Dfiltre(Xj) <- {Vj ∈ D(Xj) / A U
{(Xi,Vi),(Xj,Vj)} est consistante}
si (Dfiltre(Xj) est vide) return false
}
si (btFc(A U {(Xi,Vi)}, (X,Dfiltre,C)) )
return true
}
return false
}
37
}
Forward Checking
est beaucoup plus efficace que le simple back-track car le filtrage est
relativement rapide.
Integration des heuristiques
L'ordre d'instanciation des variables peut avoir des incidences
importantes sur l'efficacité de la recherche. Deux heuristiques
courantes :
Statique. Trier les variables selon le nb de contraintes. On
commence par les plus contraintes.
38
SysCom
SysCom
Solution des CSP
Solution des CSP
Dynamique. La prochaine variable à instancier est celle dont la
cardinalité de son domaine est minimale.
Performance des méthodes (Van Hentenryck).
Heuristique "échouer au plus vite" (first-fail). Il faut commencer par
le plus difficile.
"Si on va échouer, il vaut mieux le faire le plus vite possible".
1
1
2
Exemple d'ordre d'instanciation :
1, 2, 3, 6, . . .
3
4
5
6
7
8
39
X
X
X
X
X
X
2
3
X X
X X
X
X X
X
X X
X X
4
5
6
X X X
X
X X X
X
X X X
X X X
X X
X X X
7
Placer 16 reines
Méthode
Back-Tacks
Contraintes
Temps (sec)
Back-Track
42865
654781
813,64
Forward Checking
3182
96407
185,78
Forward Checking
Généralisé
1833
97809
70,07
Forward Checking
Géneralisé + First Fail
7
756
1,09
8
X X
X X
X X
X
X X X
40
SysCom
SysCom
Solution des CSP
Solution des CSP
Un arc (Xi, Xj) peut devenir consistant en retirant des valeurs de son
domaine :
Un niveau de filtrage plus important est obtenu en faisant le CSP arcconsistant.
Vérification de consistance a-priori
Un niveau de filtrage plus important est obtenu en faisant le
CSP arc-consistant.
Soit Rij une contrainte binaire sur les variables Xi et Xj.
L'arc (Xi, Xj) es consistant si pour toute valeur Vi de D(Xi), existe une
valeur Vj de D(Xj) telle que Rij est satisfaite.
D(Xi) = D(Xi) ∩ { Vi / existe Vj ∈ D(Xj) ∧ Rij(Xi,Xj) }
Si le domaine devient vide, alors la contrainte ne peut pas être
satisfaite.
Exemple: colorier le graphe. Contraintes: Rij(Xi,Xj) si Xi ≠ Xj
X3 ∈ {vert}
X1 ∈ {rouge,vert,bleu}
41
arc (X3,X2) est consistant,
tandis que (X2,X3) ne l'est pas
X2 ∈ {vert,bleu}
Le CSP est arc-consistant si tous ses arcs (contraintes binaires) sont
arc-consistant.
Il ne suffit pas de faire arc-consistant les arcs un par un !
Si on modifie un domaine il faut reconsiderer les arcs concernés.
42
SysCom
SysCom
Solution des CSP
Solution des CSP
Algorithme AC-3 (Mackworth) pour obtenir un CSP arc-consistant.
function AC-3(X,D,C) {
Q <- {(Xi, Xj)/ Rij(Xi,Xj)∈ C}
tantque (Q est non vide) {
sélectionner et retirer un arc (Xi, Xj) de Q
Faire (Xi, Xj) consistant
si D(Xi) se réduit, alors
si D(Xi) est vide
alors return fail //il n'y a pas de solution
sinon Q <- Q ∪ {(Xk, Xi)/ Rki(Xi,Xj)∈ C ∧
Xk≠Xi ∧ Xk≠Xj }
}
return D
}
43
Complexité de AC-3 est O(ed3), où
e nb de contraintes binaires et
d taille moyenne des domaines des variables.
Remarques :
CSP arc-consistant n'est pas une garantie qu'il existe une solution.
Sauf si tous les domaines ont cardinalité un.
44
SysCom
SysCom
Solution des CSP
Solution des CSP
Exemple de problème dont le graphe de contraintes est un arbre.
Back-Track + Arc-consistant = Full Lookahead
Si le graphe de contraintes est un arbre et il est arc-consistant, alors
une solution peut être trouvée sans besoin de back-tack (Freuder).
Une contrainte sur plus de deux variables peut être re-écrite dans un
ensemble de contraintes binaires.
Jean et Pierre ont chacun un sac de bonbons pouvant stocker 10
bonbons.
Jean a un nombre impair.
Si Pierre donne un bonbon à Jean, alors Jean aura le double de Pierre et
Pierre aura moins de 4.
Modélisation:
Variables:
Domaines:
Contraintes:
45
46
SysCom
SysCom
Solution des CSP
Solution des CSP
Graphe de Contraintes:
Ordre d'instantiation libre de brack-track
Ordre d'instantiation :
on commence par les variables
participant au plus grand nb de
contraintes
Application de AC-3:
Q
DJ
(J,N)(N,J)(J,P)(P,J) {0,1,..,10}
47
X = {J, P, N}
D(J) = D(N) = {0,1,2,3,4,5,6,7,8,9,10}
D(P) = {0,1,2,3,4}
J = (2*N) + 1
2 * (P-1) = J + 1
DP
DN
Commentaire
{0,1,2,3,4}
{0,1,..,10}
init Q avec les arcs
(N,J)(J,P)(P,J)
{1,3,5,7,9} {0,1,2,3,4}
{0,1,..,10}
réduire DJ
réduire DN
(J,P)(P,J)
{1,3,5,7,9} {0,1,2,3,4}
{0,1,2,3,4}
(P,J)(N,J)
{1,3,5}
{0,1,2,3,4}
{0,1,2,3,4}
réduire DJ
(N,J)
{1,3,5}
{2,3,4}
{0,1,2,3,4}
réduire DN
{1,3,5}
{2,3,4}
{0,1,2}
domaines à la fin
Graphe de contraintes
48
SysCom
SysCom
Solution des CSP
PPC
Image des méthodes de solution.
L'axe correspond à l'instantiation des variables.
La Programmation Par Contraintes
Certains langages ont intégré des méthodes de résolution de
contraintes.
Il s'agit des langages de Programmation Par Contraintes.
Pour résoudre un CSP avec un langage de PPC il suffit de définir les
contraintes, c'est à dire (X, D, C).
Un des premières langages de PPC est ALICE (1976, Laurière).
Depuis beaucoup d'autres langages PPC ont apparu dans les différent
types de programmation : impérative, fonctionnelle, logique ou objet.
49
50
SysCom
SysCom
PPC
L'intégration des méthodes de résolution de contraintes est
particulièrement naturelle en Prolog.
En fait, on peut considérer Prolog comme un langage de PPC.
Le domaine des variables est l'univers de Herbrand (c'est à dire
l'ensemble de termes du langage).
La contrainte est l'égalité entre termes, c'est à dire l'unification.
PPC en Java.
Bibliothèque
Choco 2.1
Une des raisons de l'importance de la famille de langages CLP(X)
(Constraint Logic Programming ) : CLP(H), CLP(R), CLP(FD),
CLP(Q), CLP(Bool).
51
52
SysCom
SysCom
PPC en Java
Le modèle en Choco
Variables
La bibliotheque "Choco"
Bouygues SA, École des Mines de Nantes
http://choco.emn.fr
Trois types de variables:
1. IntegerVariable
Projet "open source".
2. RealVariable
Pour résoudre un pb il faut définir :
3. SetVariable
• Le model : variables, domaines et contraintes.
• Le "solveur"
// Modelisation
Model model = new CPModel();
Domaines
import static choco.Choco.*;
// Resolveur
Solver solver = new CPSolver();
solver.read(model); // lien model - solveur
solver.solve();
// résoudre le problème
53
à la place de
Choco.makeIntVar("v1", 1, 3)
Par exemple pour définir un domaine fini :
IntegerVariable v1 = makeIntVar("v1", 1, 3);
54
SysCom
SysCom
Le modèle en Choco
Contraintes
IntegerVariable
IntegerExpressionVariable. Exemple :
IntegerExpressionVariable v1Plusv2 = plus(v1, v2);
Méthodes (opérateurs) retournant une IntegerExpressionVariable :
abs, div, ifThenElse, max, min, minus, mod, mult, neg, plus, power,
scalar, sum
Le modèle en Choco
Contraintes binaires : eq, geq, gt, leq, lt, neq, abs, oppositeSign,
sameSing
Contraintes ternaires : distanceEQ, distanceNEQ, distanceGT,
distanceLT, intDiv, mod, times
distanceEQ(x1, x2, x3)
signifie : x3 = |x1 - x2|
Contraintes globales : allDifferent, atMostNValue, among,
occurrence, . . .
Ajout d'une contrainte. Exemple :
model.addConstraint(neq(v1, plus(v2,4)));
IntegerExpressionVariable
Constraint
55
56
SysCom
SysCom
Le "solveur" Choco
Instanciation du "solveur", association du modèle et lancement :
// Modelisation
Model model = new CPModel();
// . . . suite : variables, domaines et contraintes
// Solveur
Solver solver = new CPSolver();
solver.read(model); // lien model - solveur
solver.solve(); // cherche la première solution
Exemple reines en choco
Modélisation
La reine i sera placée dans la colonne i,
Xi représente la ligne de la reine i.
Variables : X = {X1,X2, . . ,Xn}
Domaines : D(X1) = D(X2) = . . = D(Xn) = {1,2, . . , n}
Contraintes :
alldifferent(X)
{Xi+i ≠ Xj+j / i ∈ {1,2, . . , n}, j ∈ {1,2, . . , n} et i ≠ j}
{Xj-j ≠ Xj-j / i ∈ {1,2, . . , n}, j ∈ {1,2, . . , n} et i ≠ j}
Autres recherches : solveAll, maximize, minimize
Stratégies de recherche : MinDomain, . . .
57
58
SysCom
SysCom
Exemple reines en choco
Exemple reines en choco
// First Fail Optionnel
Source java en utilisant Choco :
Model m = new CPModel();
int n = 8;
// variables
IntegerVariable[] reines = new IntegerVariable[n];
// domaines
for (int i = 0; i < n; i++) {
reines[i] = makeIntVar("Reine " + i, 1, n);
}
// Contraintes
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
int k = j - i;
m.addConstraint(neq(reines[i],reines[j]));
m.addConstraint(neq(reines[i],plus(reines[j],k)));
m.addConstraint(neq(reines[i],minus(reines[j],k)));
}
Ou bien à la place de la première contrainte
}
m.addcontraint(allDifferent(reines));
59
// Solution
s.setVarIntSelector(
new MinDomain(s,s.getVar(reines)));
Solver s = new CPSolver();
s.read(m);
s.solve();
// afficher résultat
for(int i = 0; i < n; i++){
System.out.println(s.getVar(reines[i]));
}
}
Exécution :
60
SysCom
SysCom
Retour de monnaie en choco
Retour de monnaie en choco
Modélisation
Exemple d'optimisation en Choco
Variables:
{E1, E1, C50, C20, C10}
Domaines:
Pour toutes les variables {0,. .,10}
Contraintes :
T - P = 200*E2 + 100*E1 + 50*C50 + 20*C20 + 10*C10
Retour de monnaie
On s'intéresse à un distributeur automatique de boissons.
L'utilisateur insère des pièces de monnaie pour un total de T centimes
d'Euros, puis il sélectionne une boisson, dont le prix est de P centimes
d'Euros (T et P étant des multiples de 10).
Contrainte d'optimisation :
minimiser E2 + E1 + C50 + C20 + C10
Calculer la monnaie à rendre, sachant que le distributeur a en réserve
10 pièces des chacune des monnaies de : 2 €, 1 €, 50, 20 et 10
centimes.
61
62
SysCom
SysCom
Retour de monnaie en choco
Retour de monnaie en choco
Code
Code
public static void main(String[] args) {
Model m = new CPModel();
IntegerVariable e2 = makeIntVar("e2", 0, 10);
IntegerVariable e1 = makeIntVar("e1", 0, 10);
IntegerVariable c50 = makeIntVar("c50", 0, 10);
IntegerVariable c20 = makeIntVar("c20", 0, 10);
IntegerVariable c10 = makeIntVar("c10", 0, 10);
IntegerVariable nbPiecesRendues =
makeIntVar("Pieces rendues", 0, 20); // nb pieces rendues
System.out.print("Prix consommation ? ");
int p = Keyboard.getInt();
System.out.print("Montant inseré ? ");
int t = Keyboard.getInt();
int rendu = t - p; // montant rendu
m.addConstraint(eq(
scalar(new IntegerVariable[]{e2,e1,c50,c20, c10},
new int[]{200,100,50,20,10}),
rendu));
63
}
Exemple exécution :
64
Exemple SEND + MORE = MONEY
SysCom
Résoudre l'addition:
SEND
+ MORE
----------MONEY
où chaque lettre représente un chiffre (entre 0 et 9)
Modélisation
Variables : lettres = {S,E,D,N,M,O,R,Y}
Domaines : pour S et M = {1,..,9} autres {0,..,9}
65
// variable à optimiser
m.addConstraint(eq(
sum(new IntegerVariable[]{e2,e1,c50,c20,c10}),
nbPiecesRendues));
false :- la recherche continue à partir
du nœud solution avec backtrack
Solver s = new CPSolver();
s.read(m);
s.minimize(s.getVar(nbPiecesRendues), false);
System.out.print(s.getVar(e2)+ " " + s.getVar(e1) +
" "+s.getVar(c50)+ " "+s.getVar(c20)+" "+s.getVar(c10)+
" "+s.getVar(nbPiecesRendues));
Contraintes :
alldifferent(lettres)
1000*S + 100*E + 10*N + 1*D +
1000*M + 100*O + 10*R + 1*E =
10000*M + 1000*O + 100*N + 10*E + 1*Y
Exemple SEND + MORE = MONEY
SysCom
Code Choco :
public static void main(String[] args) {
// Création du modèle
Model m = new CPModel();
// Variables et domaines
IntegerVariable S = makeIntVar("S", 1, 9);
IntegerVariable E = makeIntVar("E", 0, 9);
IntegerVariable N = makeIntVar("N", 0, 9);
IntegerVariable D = makeIntVar("D", 0, 9);
IntegerVariable M = makeIntVar("M", 1, 9);
IntegerVariable O = makeIntVar("O", 0, 9);
IntegerVariable R = makeIntVar("R", 0, 9);
IntegerVariable Y = makeIntVar("Y", 0, 9);
IntegerVariable[] lettres = {S, E, N, D, M, O, R, Y};
// Contraintes d'unicité
m.addConstraint(allDifferent(lettres) );
// Contrainte somme
m.addConstraint(eq(plus(
scalar(new IntegerVariable[]{S,E,N,D},new int[]{1000,100,10,1}),
scalar(new IntegerVariable[]{M,O,R,E},new int[]{1000,100,10,1})),
scalar(new IntegerVariable[]{M,O,N,E,Y},new int[]{10000,1000,100,10,1})
66
));
Exemple SEND + MORE = MONEY
SysCom
SysCom
Problème "La partition"
Code Choco :
// Création du solveur
Solver s = new CPSolver();
s.read(m);
// Toutes les solutions
s.solveAll();
System.out.println("nb solutions = " + s.getNbSolutions());
System.out.println(s.pretty());}
Diviser les nombres 1,2,...,n en deux sous-ensembles a et b tels que :
a) a et b ont la même taille,
b) La somme des nbs de a = somme des nbs de b,
c) La somme des carrés de a = somme des carrés de b.
Le pb a une solution si n est un mutiple de 8.
Faire le programme Choco et le tester pour
n = 8, n = 14, n = 16
67
68
SysCom
Remarques :
Utiliser des tableaux des IntegerVariable pour représenter les
ensembles a et b (et certainement d'autres).
Les tableaux peuvent "partager" des valeurs IntegerVariable
Opérateurs utiles : sum, mult
Contraintes utiles : allDifferent, eq
SysCom
Sudoku en Choco
Modélisation.
Variables : 81 variables certaines instanciées au départ
Domaines : 1 .. 9
contraintes:
allDifferent pour chaque ligne
allDifferent pour chaque colonne
allDifferent pour chaque "bloc"
Point clé : trois tableaux qui partagent les 81 variables
69
Sudoku en Choco
public class
package
sudoku;
Sudoku {
import static
public
choco.*;
void main(String[] args) {
import
int
n =choco.integer.*;
9; // taille
// Création du modèle
publicmclass
Model
= newSudokuClass
CPModel(); {
public
//
lignes
static
et colonnes
void main(String[] args) {
int n = 9; // tamañolignes = new IntegerVariable[n][];
IntegerVariable[][]
IntegerVariable[][]
Problem pb = new Problem();
cols = new
// nueva
IntegerVariable[n][];
instancia
//.n.variables
.
pour chaque ligne et colonne
for (int i = 0; i < n; i++) {
lignes[i] = new IntegerVariable[n];
for (int j = 0; j < n; j++) {
// domaines des 81 variables
lignes[i][j]=makeIntVar("("+i+","+j+")",1,n);
}
}
70
SysCom
SysCom
Sudoku en Choco
// correspondence
correspondenciaentre
entrelignes
lineaset
y columnas
cols
for (int i = 0; i < n; i++) {
cols[i] = new IntegerVariable[n];
IntVar[n];
for (int j = 0; j < n; j++) {
partage devariables
variables
cols[i][j] = lineas[j][i];
lignes[j][i]; // comparten
}
}
// "allDifferent"
for (int i = 0; i < n; i++) {
m.addConstraint(allDifferent(cols[i]) );
m.addConstraint(allDifferent(lignes[i]) );
}
Sudoku en Choco
// tableau blocs 3x3
IntegerVariable[][] blocs = new IntegerVariable[n][];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
blocs[i*3 + j] = new IntegerVariable[n];
for (int k = 0; k < 3; k++) {
for (int l= 0; l < 3; l++) {
// partage de variables
blocs[i*3 + j][k*3 + l] = lignes[i*3 + k][j*3 + l];
}
}
(i, j)=(1,2)
}
}
// allDifferent blocs
for (int i = 0; i < n; i++) {
m.addConstraint(allDifferent(blocs[i]) );
}
71
72
SysCom
SysCom
Sudoku en Choco
// données initials. Un seul nombre ...
m.addConstraint(eq(lignes[4][6], 5));
// Création du solveur
Solver s = new CPSolver();
s.read(m);
s.solve(); // une solution
if (s.existsSolution()){
// On affiche les résultats
System.out.println("----- Solution ----");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(s.getVar(lignes[i][j]).getVal()+" ");
}
System.out.println();
}
}
} // fin main
} // fin classe
73
Freuder E., A sufficient condition for back-tack free search, Journal
or ghe ACM, 29(1), 1982.
Freuder E., Back_track free and back-track bounded search, in search
in AI, ed Kamal & Kumar, 1988.
Van Hentenryck P., Constraint satisfaction in Logic programming,
MIT press, 1989
On-line guide to constraint programming
http://ktiml.mff.cuni.cz/~bartak/constraints/
Programmation par contraintes
http://bat710.univ-lyon1.fr/~csolnon/Site-PPC/e-miage-ppc-som.htm
Constraint archive
http://4c.ucc.ie/web/archive/index.jsp
PPC en java : http://choco.emn.fr
74
SysCom
75
Références

Documents pareils

Yes we do

Yes we do ► Mise au point sur la machine en utilisant les sondes mobiles pour injecter des signaux et visualiser les sorties sur un oscilloscope, fonction particulièrement utile pour les cartes SMD où l’accè...

Plus en détail