• Aucun résultat trouvé

Problèmes de satisfaction de contraintes

6.2 Allocation de créneaux de décollage par AG

7.1.2 Problèmes de satisfaction de contraintes

Le cadre de la PPC est très générique et fait intervenir des domaines quelconques ainsi que des relations quelconques entre les variables. Nous donnons dans cette section le formalisme des CSP sur les domaines finis, ainsi que des méthodes constructives de résolution.

Dé nition 9 (CSP sur les domaines nis) Un CSP sur les domaines nis se dé nit

comme un triplet P = (X , D, C), où :

X = {x1, ..., xn} est un ensemble ni de variables.

D = (D1, ..., Dn) est un ensemble ni de domaines de cardinal ni. Le domaine Di de

la variable xi est l'ensemble des valeurs que celle-ci peut prendre.

C = {c1, ..., cm} est l'ensemble des contraintes. Chaque contrainte ci = (Xi, Ri) est

dé nie par l'ensemble Xi ⊆ X des variables sur lesquelles elle porte et par une relation

Ri dé nissant l'ensemble des valeurs que peuvent prendre simultanément les variables

de Xi.

Pour une contrainte i donnée, le cardinal de l’ensemble Xi = {xi1, ..., xiki}, |Xi| = ki, sera appelé l’arité de la contrainte (en particulier, on appelera contrainte unaire une contrainte d’arité un et contrainte binaire une contrainte d’arité deux). L’ensemble Ri définissant la

relation entre les variables de Xi est un sous-ensemble du produit cartésien des domaines

de chaque variable de Xi : Ri ⊆ Di1 × ... × Diki.

Exemple 3 (CSP : x = y, y < z) Soient trois variables x ∈ {1, 2}, y ∈ {1, 2, 4}, z ∈

{2, 3, 4}. On cherche à instancier ces variables de telle manière que : x = y, y < z.

100 CHAPITRE 7. RÉSOLUTION EN PROGRAMMATION PAR CONTRAINTES

Ce problème se modélise par le CSP suivant :

P          X = {x, y, z} D = {{1, 2}, {1, 2, 4}, {2, 3, 4}} C = ® ({x, y}, {(1, 1), (2, 2)}) ({y, z}, {(1, 2), (1, 3), (1, 4), (2, 3), (2, 4)}) ´

Dans la définition 9, ainsi que dans l’exemple précédent, les contraintes sont définies

en extension, c’est-à-dire sous la forme d’une liste exhaustive de toutes les combinaisons

possibles de valeurs. Cependant, la plupart des problèmes applicatifs utilisent des contraintes exprimées à l’aide de formules arithmétiques, d’équations avec des opérateurs d’ensembles, d’opérateurs logiques ou même de spécifications de plus haut niveau (e.g. « toutes ces variables sont différentes », souvent appelée alldi ). Ces dernières contraintes sont exprimées

en intention. Ceci n’affecte pas la définition 9, puisque toute contrainte en intention peut

s’exprimer sous la forme d’une contrainte en extension. Dans la notation d’une contrainte en intention, on pourra omettre l’ensemble des variables sur lesquelles elle porte, puisque celles- ci apparaissent dans l’expression de la contrainte. Les solveurs PPC proposent généralement ces contraintes en intention en tant que primitives, ainsi que des connecteurs logiques permettant de les combiner. Le langage ainsi obtenu est proche des notations algébriques et ensemblistes de haut niveau utilisées dans les premières étapes de la formalisation des problèmes et facilite donc leur modélisation.

Afin de s’abstraire du type des contraintes utilisées dans la définition d’un CSP, on associe à chaque contrainte une fonction qui indique si celle-ci est satisfaite pour une instanciation donnée.

Dé nition 10 (Fonction de satisfaction) Soit P = (X , D, C) un CSP. On associe à chaque contrainte ci = (Xi, Ri) ∈ C une fonction booléenne de satisfaction dé nie par :

˜ ci : Di1 × ... × Diki −→ {vrai, f aux} (vi1, ..., viki) 7−→ ˜ci(vi1, ..., viki) = ® vrai si(vi1, ..., viki) ∈ Ri f aux sinon

Nous verrons dans la section 7.1.3 que l’on n’a pas toujours à attendre que toutes les variables d’une contrainte ci soient instanciées pour savoir si celle-ci est satisfaite ou non,

c’est-à-dire si ˜ci = 0 ou ˜ci = 1, notamment grâce au maintien de l’arc-consistance du CSP.

Dé nition 11 (Instanciation) Soit P = (X , D, C) un CSP.

On appelle littéral une a ectation de la forme xi = vi avec xi ∈ X , vi ∈ Di.

Une instanciation totale est un ensemble de littéraux, un pour chaque variable de X . Une instanciation partielle est un sous-ensemble d'une instanciation totale. Pour une instanciation partielle I, on note XI l'ensemble des variables sur lesquelles elle porte.

On utilisera la notation I(xi) = vi pour indiquer que la valeur vi est affectée à la

7.1. PRINCIPES DE LA PROGRAMMATION PAR CONTRAINTES 101 de satisfaction de la contrainte ci à la restriction de I sur les variables de Xi, si Xi ⊆ XI.

On dira alors que l’instanciation I satisfait la contrainte ci si et seulement si ˜ci(I) = vrai.

Dans le cas contraire, on dira que I viole la contrainte.

Pour qu’une instanciation partielle I puisse mener à une solution, il faut que toutes les contraintes concernées par cette instanciation soient satisfaites. On dira alors que I est une

instanciation consistante. Une solution d’un CSP est une instanciation totale et consistante.

Réi cation Il est possible de relaxer certaines contraintes lors de la modélisation d’un

problème en CSP en utilisant des contraintes réi ées. La réi cation d’une contrainte c consiste à ajouter une variable booléenne b(c) contrainte à 1 si c est satisfaite et à 0 si c est violée. Dans ce cas, la contrainte c n’est pas ajoutée à l’ensemble C des contraintes du CSP ; elle pourra l’être dynamiquement (ou sa négation) lors de la recherche. Il est en revanche possible d’utiliser les variables b(c) dans de nouvelles contraintes.

Exemple 4 (Réi cation) Soit {x1, ..., xn} un ensemble de variables de domaines Di =

[1, n], ∀i ∈ [1, n]. Pour une valeur v donnée, la variable booléenne b(xi = v), correspondant

à la réi cation de la contrainte (xi = v), vaut 1 si xi = v, 0 sinon.

Cette réi cation permet par exemple de construire une contrainte communément appelée

contrainte de cardinalité, qui compte le nombre de variables d'un ensemble égales à une

valeur v : card(c, v, {x1, ..., xn}) ⇔ c = n X i=1 b(xi = v)

Il existe d'ailleurs un algorithme ad-hoc e cace pour cette contrainte.

La réification permet également de relaxer des contraintes lors de la résolution de problèmes surcontraints et peut donc permettre de trouver des « bonnes » solutions là où la résolution aurait échoué. Elle augmente également l’expressivité d’un langage de contraintes, en permettant notamment d’écrire des disjonctions (voir exemple 5).

Exemple 5 (Disjonction) Soient c1 et c2 deux contraintes. On peut par exemple exprimer

la disjonction c1∨ c2 grâce à la réi cation des contraintes c1 et c2 de la manière suivante : c1∨ c2 ⇔ b(c1) + b(c2) ≥ 1