• Aucun résultat trouvé

Programmation Logique par Contraintes

N/A
N/A
Protected

Academic year: 2022

Partager "Programmation Logique par Contraintes"

Copied!
62
0
0

Texte intégral

(1)

Programmation Logique par Contraintes

CHIP

P.De Loor

(2)

Plan

• Limites de la programmation

logique

(3)

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]

(4)

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 ?

(5)

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

(6)

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 ?

(7)

Limites de la

programmation logique

Optimiser ?

maximiser(, Min, Max, Val ):- X==Max,

Y is Val.

(8)

Généralités sur la PLC

Origines

(9)

Généralités sur la PLC

Domaines d ’applications

(10)

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.

(11)

CHIP

gé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

(12)

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

(13)

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,

(14)

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

(15)

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

(16)

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,_).

(17)

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)

(18)

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)

(19)

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} ?

(20)

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.

(21)

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.

(22)

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

(23)

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

(24)

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.

(25)

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.

(26)

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] ? ; ...

Contraintes symboliques sur les domaines

1 2

4

5

3

(27)

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>

(28)

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 )

(29)

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

Exemple

(30)

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 ?

(31)

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

(32)

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.

(33)

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).

(34)

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] ? ...

(35)

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.

(36)

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 Percent minimum 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

(37)

Exemple

top :-

X::1..10, Y::1..10, X+2 #< Y,

min_max(labeling([X,Y],0,first_fai l,indomain),X+Y).

108?- top.

THE SOLUTION IS

labeling([1, 4], 0, first_fail, indomain)

ITS COST IS 5

min_max -> proven optimality

(38)

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

(39)

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

1 3

6 7 5

4 2

377 201

69

412 190 427

205

(40)

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)

1 2 3 4 5 6 7 8

début taille

(41)

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).

Exemple de tâche i

Taux d ’utilisation Hi

(42)

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

(43)

• 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] ? ;

Contraintes globales sur Domaines

1

2

1

2

(44)

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

(45)

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_c onstrained,indomain),

writeln([X1,X2,X3,X4,X5]).

94?- top.

[1, 3, 3, 4, 4]

(46)

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] ? ;

(47)

Prédicats d ’information sur les domaines

domain_info(X,Min,Max,Size,Occ urrence,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

(48)

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 ?

(49)

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

(50)

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)

(51)

Contraintes Rationnelles

• Les variables sont continues (nombre infini de valeurs)

• Résolution type simplex, Gauss

• Domaine d ’application

– Problèmes mathématiques

– Problèmes financiers (analyse d ’emprunt)

– utilisé de façon complémentaire

aux contraintes sur domaines

(52)

Définition de variables rationnelles

• Nombre rationnel = rapport de deux entiers a/b

• Variable rationnelle :

– toute variable utilisée dans une contrainte rationnelle est une variable rationnelle.

– Déclaration explicite :

positive(X)

allpositive(List).

(53)

Termes rationnels

• Entier ou nombre rationnel

• Variable rationnelle

• t1+t2, t1-t2 (ti sont des termes)

• -t (t est un terme)

• c*t, t*c, t/c (t : terme, c : nombre

entier ou rationnel)

(54)

Tests de type

rational(X)

réussit si X est un nombre rationnel rvar(X)

réussit si X est une variable rationnelle pvar(X)

réussit si X est une variable rationnelle positive

rlinear(X)

réussit si X est un term rationnel

linéaire

(55)

Contraintes

arithmétiques sur les rationnels

X, Y : termes rationnels

X^=Y X^>=Y X^<=Y X^>Y X^<Y

power(X,Pow,Y)( Pow : entier)

ne permet pas le calcul des racines nième (pas des rationnels)

sqrt(X,Y)

(56)

Optimisation pour termes rationnels

rmax(X)

utilisation du simplex pour trouver la valeur maximum de X

rmin(X)

valeur maximum de X

rmax2(X,Limit)

Limit est unifiée à la valeur maximum

de X, X n ’est pas unifiée.

(57)

Exemple

• Page 61 user ’s guide

(58)

Regrouper plusieurs contraintes

• But : optimiser la résolution

linear_block(List)

exemple page 62 user guide

(59)

Trouver les solutions entières

Plus rapide que les domaines, mais moins de type de contraintes

cutting(?Obj, +List, -Ncuts,+Time) Obj : terme rationnel à minimiser

List : liste de variables

Ncuts : nombre de contraintes supplémentaires générées

Time: entier non utilisé

(60)

Arrondis et conversion

(61)
(62)

CHIP

Les classes

Références

Documents relatifs

V´erifier que A est une tribu de parties de E, contenue

Consigne : Reconstitue la phrase de l’album dans les trois écritures puis recopie la phrase donnée en modèle.. Recopie la phrase en

La cantine était bonne , je ne suis pas la plus petite .... A l'école tout le monde est petit et

[r]

Trouver le plus petit entier positif dont le tiers est un cube parfait, le septi` eme est une puissance septi` eme parfaite et le huiti` eme est une puis- sance huiti` eme

L’incertitude absolue est trois fois plus petite pour le premier objet que pour le second.. Cependant, la précision est notée par le rapport de l’incertitude absolue sur la

E 1 Puce reçoit une première liste de 2019 entiers compris entre 0 et n qu’il doit recopier sur une même colonne puis en face de chaque entier il doit écrire sur une

On doit donc avoir 13 premiers distincts (ou une de leurs puissances), dont on prend les 13 qui minimisent l'écart entre le plus petit et le