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