660 likes | 1.05k Views
Programmation Logique par Contraintes. CHIP P.De Loor. Plan. Limites de la programmation logique. Limites de la programmation logique. Petit programme 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).
E N D
Programmation Logique par Contraintes CHIP P.De Loor
Plan • Limites de la programmation logique
Limites de la programmation logique Petit programme 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 ?
Limites de la programmation logique « is » n ’est pas qu ’une unification copie(X,Y):- X is Y. ?- copie(X,56). [WARNING: Arguments are not sufficiently instanciated] Exception: ( 9) _L169 is _G127 ?
Limites de la programmation logique Prolog ne « raisonne » pas sur les opérations 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 !!!
Limites de la programmation logique Petit programme CHIP fact(0,1). fact(X,Y):- X ^> 0, X2 ^= X-1, fact(X2,Z), Y ^=Z*X. ?-fact(5,X). X=120 ? ?-fact(120,Y). Y=5 ?
Limites de la programmation logique Optimiser ? maximiser(, Min, Max, Val ):- X==Max, Y is Val.
Généralités sur la PLC Origines
Généralités sur la PLC Domaines d ’applications
Généralités sur la PLC • Ré-utilisation de la programmation logique, syntaxe prolog. • CLP(X) concepts : J.L Lassez et J. Jaffar 87. • Preuves : - Les solutions trouvées sont correctes. - Toutes les solutions sont trouvées.
CHIPgénéralités • Version industrielle de la PLC • Prolog + contraintes • Société COSYTEC • Contraintes sur Domaines • Contraintes sur Rationnels • Contraintes Booléennes • Classes • Interface Oracle, C, Xwindows • Concurrents : ILOG-SOLVER, PROLOG IV • + générique, + I.A. (déclaratif)
Domaines finis : Applications Types • Emplois du temps • Planification (capacités finies) • Placement d ’objets ou de formes • Optimisation de stratégies (jeux) • Coloriage de cartes • Optimisation de parcours • Problème d ’assignation
Contraintes sur les domaines finis • Un domaine • est une variable X • peut avoir plusieurs valeurs entières. • le nombre des valeurs est fini. • possède des bornes min et max • Les contraintes peuvent être • arithmétiques, • symboliques, • globales …
Contraintes sur les domaines finis : exemple • Puzzle Cryptarithmétique S E N D + M O R E ----------- M O N E Y • Chaque caractère est un chiffre (0..9) [S,E,N,D,M,O,R,Y] :: 0..9
Contraintes sur les domaines finis : exemple • Les contraintes : • Tous les chiffres sont différents alldifferent([S,E,N,D,M,O,R,Y]) • Les nombres ne commencent pas par 0. S^\=0, M^\=0 • L ’addition doit être satisfaite. 1000*S + 100*E + 10*N + D + 1000*M + 100*O + 10*R + E ^= 10000*M + 1000*O + 100*N + 10*E + Y
Contraintes sur les domaines finis : exemple 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,_).
Définition de domaines finis • X est compris entre 1 et 10 X::1..10 • Liste de variables [X1,X2,X3]::1..10 • Limite des domaines entre 0 et 100000 (couteux)
Types de domaines finis • Suite d ’entiers consécutifs X::A..B, (explicitement représentés en mémoire) • Ensemble de valeurs X::[V1, V2, V3], (restriction a priori de domaine : grande liste = couteux) • Intervalles X::A:B, (Seuls le min et le Max sont mis à jour) (très peu couteux pour des grands domaines) (impossibilité d ’enlever des valeurs intermédiaires)
Domaines : exemples • wflags(64).(force l ’affichage des domaines) ?- X::1..5. X = X in {1..5} ? ?- X::1:5. X = X in [1..5] ? ?- X::[5,9,2] ? X = X in {5,9,2} ?
Termes linéaires sur des domaines finis • Un entier naturel (c) • Un domaine (X) • c * X ou X * c (c : entier, X : variable) • X + Y • Pas de négatifs ni de signes « - » dans un terme.
Prédicats d ’information sur les variables • integer(X) • réussit si X est un entier • dvar(X) • réussit si X est une variable à domaine fini • dvarint(X) • réussit si X est un entier ou une variable à domaine fini.
Unification sur les domaines finis • Domaine X et variable « libre » Y • Y devient un domaine équivalent à X. • Domaine X et entier c • si c appartient au domaine, X devient l ’entier c • sinon échec de l ’unification (fail) • Domaine X et Domaine Y • calcul de leur intersection • si intersection vide, échec • si l ’intersection est une valeur, X et Y deviennent un entier de cette valeur • si l ’intersection est un ensemble, les domaines de X et Y sont réduits à cet ensemble
Contraintes arithmétiques sur les domaines X, Y : domaines c : variable entière X #< Y X #<= Y X #> Y X #>= Y X #= Y X #\= Y X #\ Y + c
Contraintes arithmétiques sur les domaines • distance(X,Y,Comp,Dist) • distance : |X-Y| • Comp : (>,=,<) • Dist : entier • notin(X, From, To) • les valeurs de X ne sont pas entre From et To. X::1..10, notin(X,5,9) . X = X in {1..4,10}? X::1:10, notin(X,5,9). No (more) solutions.
Contraintes symboliques sur les Domaines allDifferent(List) atleast(N,List,V) • au moins N de List ont la valeur V atmost(N,List,V) • au plus N de List ont la valeur V maximum(X,List) • le domaine X possède la plus grande valeur de List. minimum(X,List)
Contraintes symboliques sur les domaines circuit(L), - les éléments de L doivent être un circuit Hamiltonien. 38?- length(L,5), L::1..5, circuit(L), labeling(L,0,first_fail,indomain). L = [2, 3, 4, 5, 1] ? ; L = [2, 3, 5, 1, 4] ? ; L = [2, 4, 1, 5, 3] ? ; L = [2, 4, 5, 3, 1] ? ; L = [2, 5, 1, 3, 4] ? ; L = [2, 5, 4, 1, 3] ? ; ... 1 2 4 5 3
Contraintes symboliques sur les domaines element(Index, List, Value) X::0..10, element(X,[3,5,9],C). X X in {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} C C in <2,5,8>
Prédicats de Choix indomain(X) • choix d ’une valeur de X • par défaut : commence par la plus petite valeur du domaine. indomain(X,Method) Method : - min (idem que indomain/1) - max (la plus grande) - middle - 3 (un entier )
Exemple ex1(X,Y,Z):- [X,Y,Z]::1:100, X #> Y+10, Y #> Z + 25, indomain(X). 97?- ex1(X,Y,Z). X = 38 Y = 27 Z = 1 ? ; 1 call(s) delayed X = 39 Y = Y in [27..28] Z = Z in [1..2] ? ; 1 call(s) delayed X = 40 Y = Y in [27..29] Z = Z in [1..3] ?
Prédicats de choix • Assigner une liste de valeur ? Labeling([]). Labeling([H|T]):- indomain(H), labeling(T). • Dans quel ordre évaluer les variables ? • Quelles valeurs tester ?
Prédicats de choix Labeling(List,Arg,Method,Pred) List : liste des variables ou terms Arg : 0 pour liste de variable n° du terme si liste de term Method : voir page suivante Pred : prédicat d ’affectation, généralement indomain mais possibilité de configuration
Prédicats de choix • Les heuristiques (Méthodes) d ’ordre d ’affectation : first_fail variable de plus petit domaine, théoriquement plus rapide (petit arbre de recherche) most_constrained comme first_fail mais si conflit, préférer la variable intervenant le plus souvent dans les contraintes, solution performante.
Prédicats de choix smallest variable ayant la plus petite valeur de son domaine : économiser de la mémoire. Largest l ’inverse de smallest, utiliser si l ’on connaît une valeur max possible (?) max_regret variable ayant la plus grande différence entre la plus petite et la 2ème plus petite valeur de son domaine ->pour les variables de type cout, ce critère est une bonne mesure du « travail » qu ’il rest à faire (convergence).
Exemple top(L,N):- length(L,N), L::1..N, alldifferent(L), labeling(L,0,first_fail, indomain). 99?- top(L,7). L = [1, 2, 3, 4, 5, 6, 7] ? ; L = [1, 2, 3, 4, 5, 7, 6] ? ; L = [1, 2, 3, 4, 6, 5, 7] ? ; L = [1, 2, 3, 4, 6, 7, 5] ? ...
Prédicats d ’opimisation • Recherche la meilleur solution • Recherche rapide (un findall est exclu) min_max(Goal, C) Goal : prédicat à satisfaire C : liste de couts minimise la valeur de C.
Prédicats d ’optimisation Accélérer la recherche : min_max(Coal, C, lower, Upper) Une solution inférieure à lower peut être considérée optimale. Une solution supérieure à Upper ne peut l ’être. min_max(Coal, C, lower, Upper, Percent) fixe un pourcentage Percentminimum entre deux solutions qui se suivent dans la recherche. min_max(Coal, C, lower, Upper, Percent, Timeout) la recherche s ’arrête après Timeout secondes
Exemple top :- X::1..10, Y::1..10, X+2 #< Y, min_max(labeling([X,Y],0,first_fail,indomain),X+Y). 108?- top. THE SOLUTION IS labeling([1, 4], 0, first_fail, indomain) ITS COST IS 5 min_max -> proven optimality
Exemple travel(Cities, Costs) :- Cities=[X1,X2,X3,X4,X5,X6,X7], Costs = [C1,C2,C3,C4,C5,C6,C7], Cities::1..7, element(X1,[0,205,377,581,461,878,345], C1), element(X2,[205,0,882,427,390,1105,540], C2), element(X3,[677,882,0,619,316,201,470], C3), element(X4,[581,427,619,0,412,592,570], C4), element(X5,[461,390,316,412,0,517,190], C5), element(X6,[878,1105,201,592,517,0,69], C6), element(X7,[345,540,470,570,190,691,0], C7), circuit(Cities), min_max(labeling(Costs,0,max_regret,indomain),C1+C2+C3+C4+C5+C6+C7). • Xi sera la ième ville visitée • Ci représente le coût pour aller de la ville i a j. Exemple : pour aller de la ville 2 à la ville 3 ça coute 882
Exemple 29?- travel(Citees,Cout). THE SOLUTION IS labeling([377, 205, 201, 427, 412, 69, 190], 0 ITS COST IS 1881 ----------------------------------------- min_max -> proven optimality Citees = [3, 1, 6, 2, 4, 7, 5] Cout = [377, 205, 201, 427, 412, 69, 190] ? ; no (more) solutions 201 377 3 1 6 205 69 2 7 427 4 5 190 412
Contraintes globales sur domaines diffn(+ListOfRectangle) • Les rectangles ne doivent pas se chevaucher. • Leur position et leur taille sont des domaines diffn([[1,1],[3,2],[5,3]]). • « Rectangles » à n-dimension (hypercubes) • contraintes sur les volumes, les distances, les régions : diffn(+Rectangles, +Min_volume, +Max_volume, +End, +Distances, +Regions) début taille 1 2 3 4 5 6 7 8
Contraintes globales sur Domaines • Contraintes cumulatives • entre ensembles de domaines • basée sur un élément : tache • répartitions (temporelle, 2D, 3D) • 20 méthodes de résolutions conjointes cumulative(Starts, Duration, Resources, Ends, Surfaces, High, End, Intermediate, Interruption). Taux d ’utilisation Exemple de tâche i Hi (souvent t) Si Ei
Contraintes globales sur Domaines Exemple d ’utilisation simplifiée : Si, Di et Ri sont des domaines à définir. cumulative([S1,S2,…Sn], [D1,D2,…,Dn], [R1,R2,…,Rn], unused, unused, Limit, End, unused unused). A tout instant Ri Limit Limit End
Contraintes globales sur Domaines • Contraintes de précédence • precedence/5 • cumulative + #<= • Contraintes de cycle • cycle/2 à cycle/12 • exemple 49?- length(L,3), L::1..10, cycle(2,L), labeling(L,0,first_fail,indomain). L = [1, 3, 2] ? ; L = [2, 1, 3] ? ; L = [3, 2, 1] ? ; no (more) solutions 1 1 2 2 3 3 cycle(2,L)
Contraintes globales sur domaines Among/5 Nombre d ’occurrence de valeur dans une suite de domaines : [X1,X2,X3, X4,X5]::1..4, K::1..5, among([1,2,K],[X1,X2,X3,X4,X5],[0,0,0,0,0],[[1,2],[3],[1,3,4]],all), 1 ou 2 apparaissent 1 fois 3 apparaît 2 fois 1,3,4 apparaissent entre 1 et 5 fois
Contraintes globales sur les domaines Utilisation de among top:- [X1,X2,X3, X4,X5]::1..4, K::1..5, among([1,2,K],[X1,X2,X3,X4,X5],[0,0,0,0,0],[[1,2],[3],[1,3,4]],all), labeling([X1,X2,X3,X4,X5],0,most_constrained,indomain), writeln([X1,X2,X3,X4,X5]). 94?- top. [1, 3, 3, 4, 4]
Prédicats d ’information sur les domaines dom(X,L) top(L):- X1::1..4, X1#\=2, dom(X1,L). 37?- top(L). L = [1, 3, 4] ? 39?- X::1..4, indomain(X), dom(X,L). X = 1 L = [1] ? ; X = 2 L = [2] ? ;
Prédicats d ’information sur les domaines domain_info(X,Min,Max,Size,Occurrence,Active) 43?- X::1..4, X#\=3, domain_info(X,Mn,Mx,S,NbO,NbA). X = X in {1..2,4} Mn = 1 Mx = 4 S = 3 NbO = 0 %nb de contraintes où X est utilisée NbA = 0 ? %nb contraintes utilisant X non résolues
Prédicats d ’information sur les domaines 46?- X::1..4, Y::2..6, X#\=3, X#>=Y, domain_info(X,Mn,Mx,S,NbO,NbA). 1 call(s) delayed X = X in {2,4} Y = Y in {2..4} Mn = 2 Mx = 4 S = 2 NbO = 1 NbA = 1 ? 47?- X::1..4, Y::2..6, X#\=3, X#>=Y, indomain(Y), domain_info(X,Mn,Mx,S,NbO,NbA). X = X in {2,4} Y = 2 Mn = 2 Mx = 4 S = 2 NbO = 1 NbA = 0 ?
Prédicats d ’information is_in_dom(X,V). Réussi si la valeur V se trouve dans le domaine X pc(Term). Affiche toutes les contraintes actives sur toutes les variables du term Term
Méthodes de recherche partielles • Propagation conditionelle If Cond then Pred1 else Pred2 Cond doit etre satisfait pour toutes les valeurs des domaines concernés. • Démons de mise à jour touched(Callback, Var, Info, Type) le prédicat Callback(Var,Info) sera appelé lorsque la condition Type sera satisfaite (souvent utilisé avec la bibliothèque graphique XGIP)