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
Balises dans head> En-tête d`un document HTML : l`élément
Pour effacer : type="reset"
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è...