De AC3 à AC7
Christophe Lecoutre Frédéric Boussemart Fred Hemery
CRIL (Centre de Recherche en Informatique de Lens)
CNRS FRE 2499
rue de l’université, SP 16
F-62307 Lens cedex
{lecoutre,boussemart,hemery}@cril.univ-artois.fr
RÉSUMÉ. La consistance d’arc joue un rôle central dans la résolution de Problèmes de Sa-
tisfaction de Contraintes (CSPs). Récemment, un même algorithme appelé AC2001 et AC3.1
a été présenté indépendamment par leurs auteurs respectifs. Cet algorithme qui est considéré
comme une amélioration de AC3 a l’avantage d’être simple (à implémenter) et compétitif. Ce-
pendant, il ne prend pas en compte la bidirectionalité des contraintes comme le fait AC7. Dans
ce papier, nous abordons cette question en proposant deux algorithmes appelés AC3.2 et AC3.3
qui bénéficient des bonnes propriétés à la fois de AC3 et de AC7. Plus précisément, AC3.2 est
un algorithme général qui exploite partiellement la bidirectionalité des contraintes tandis que
AC3.3 est un algorithme binaire qui exploite totalement la bidirectionalité. Néanmoins, lorsque
la consistance d’arc est maintenue pendant la recherche d’une solution, MAC3.2 (grâce à un
effet de mémoire), s’avère plus efficace que MAC3.3 à la fois en termes de tests de consistance
et de temps CPU. Comparé à MAC2001/3.1, nos résultats expérimentaux montrent que MAC3.2
économise environ des tests de consistance et, en moyenne, du temps CPU.
ABSTRACT. Arc consistency plays a central role in solving Constraint Satisfaction Problems.
Recently, an algorithm called AC2001 and AC3.1 has been independently presented by their
authors. This algorithm which is considered as a refinement of the basic algorithm AC3 has
the advantage of being simple (to implement) and competitive. However, it does not take into
account constraint bidirectionality as AC7 does. In this paper, we address this issue, and,
in particular, introduce two new algorithms called AC3.2 and AC3.3 which benefit from good
properties of both AC3 and AC7. More precisely, AC3.2 is a general algorithm which partially
exploits bidirectionality whereas AC3.3 is a binary algorithm which fully exploits bidirection-
ality. It turns out that, when Maintaining Arc Consistency during search, MAC3.2, due to a
memorization effect, is more efficient than MAC3.3 both in terms of constraint checks and CPU
time. Compared to MAC2001/3.1, our experimental results show that MAC3.2 saves about 50%
of constraint checks and, on average, 15% of CPU time.
MOTS-CLÉS : problèmes de satisfaction de contraintes, consistance d’arc.
KEYWORDS: constraint satisfaction problems, arc consistency.
268 RSTI/hors série. JFPLC 2003.
1. Introduction
La consistance d’arc joue un rôle central dans la résolution de Problèmes de Sa-
tisfaction de Contraintes (CSPs). En effet, l’algorithme MAC [SAB 94], i.e., l’algo-
rithme qui consiste à maintenir la consistance d’arc au cours de la recherche d’une
solution, est considéré comme l’approche générique compte la plus efficace pour
résoudre des instances de problèmes larges et difficiles [BES 96]. De nombreux algo-
rithmes ont été proposés pour établir la consistance d’arc.
D’un coté, des algorithmes à gros grain tels que AC3 [MAC 77], AC2000 [BES 01],
AC2001/3.1 [BES 01, ZHA 01] et AC3 [DON 02] ont été développés; le principe
étant d’appliquer des révisions successives d’arcs, i.e., de couples composés
d’une contrainte et d’une variable appartenant à l’ensemble des variables de .
Ces algorithmes sont faciles à implémenter et efficaces en pratique.
De l’autre coté, des algorithmes à grain fin tels que AC4 [MOH 86], AC6 [BES 94]
et AC7 [BES 99] ont été proposés; le principe étant d’appliquer des révisions succes-
sives de “valeurs”, i.e., de triplets composés d’un arc et d’une valeur
appartenant au domaine de . Ces algorithmes sont plus difficiles à implémenter
puisqu’il est nécessaire de gérer des structures de données plus lourdes. Et même si,
AC6 et AC7 sont compétitifs vis à vis de AC3 et de AC2001/3.1 dans le contexte d’une
phase de pré-traitement, ceci est moins évident dans le contexte d’une recherche de
solution puisque maintenir ces structures de données peut s’avérer pénalisant.
Les algorithmes de consistance d’arc peuvent être caractérisés par un certain nom-
bre de propriétés “désirables” [BES 99]. En particulier, il est intéressant d’exploiter la
bidirectionalité des contraintes (appelée multidirectionalité si les contraintes ne sont
pas binaires) de manière à éviter des tests de consistance inutiles. La bidirectionalité
signifie que si une valeur d’un domaine d’une variable supporte (est compatible
avec) une valeur du domaine d’une variable par rapport à une contrainte binaire
liant et alors de supporte également de . Aussi, si un test de
consistance est réalisé lors de la recherche d’un support pour , il n’y a nul
besoin de réaliser ultérieurement le même test de consistance lors de la recherche
d’un support pour pourvu que ce test de consistance ait été enregistré comme un
succès ou comme un échec. On peut parler d’exploitation positive et négative de la
bidirectionalité.
Parmi tous les algorithmes cités précédemment, AC7 est le seul qui prenne en
compte la bidirectionalité. Dans ce papier, nous proposons d’exploiter la bidirectio-
nalité des contraintes pour les algorithmes à gros grain. Tout d’abord, nous introdui-
sons deux nouveaux algorithmes, appelés AC3.2 et AC3.3, qui peuvent être considé-
rés comme des améliorations de AC2001/3.1. AC3.2 est un algorithme général, i.e.,
adapté aux problèmes dont les contraintes sont d’arité quelconque, qui exploite par-
tiellement la bidirectionalité positive tandis que AC3.3 est un algorithme binaire, i.e.,
adapté uniquement aux problèmes dont les contraintes sont binaires, qui exploite to-
talement la bidirectionalité positive.
Algorithmes 269
Ensuite, nous montrons que AC2001/3.1, AC3.2 et AC3.3 peuvent bénéficier de la
bidirectionalité négative en concentrant la recherche des supports aux uniques tuples
appelés candidats [BES 97]. Il en résulte que AC3.2 et AC3.3 bénéficient des bonnes
propriétés de AC3 et de AC7. En effet, AC3.2 et AC3.3 sont simples à implémenter
(comme AC3) et tirent un avantage de la bidirectionalité (comme AC7).
2. Préliminaires
Dans cette section, nous introduisons quelques définitions utilisées par la suite.
Définition 1 Un problème de satisfaction de contraintes (CSP pour Constraint Satis-
faction Problem) est un couple où :
est un ensemble fini de variables tel que chaque variable
possède un domaine représentant l’ensemble des valeurs pouvant être
assignées à ,
est un ensemble fini de contraintes tel que chaque
contrainte correspond à une relation représentant l’ensemble des tuples
autorisés pour les variables liées par la contrainte .
Sans perte de généralité, nous considérons que tout ensemble de variables
associé à une contrainte est ordonné. Ainsi, il est possible d’obtenir la position
d’une variable dans et la variable dans .
On dira qu’une contrainte lie (ou implique) une variable ssi appartient à
. L’arité d’une contrainte est le nombre de variables liées par celle-ci. Une
contrainte binaire implique uniquement variables.
Une solution est l’affectation d’une valeur à l’ensemble des variables du problème
de telle sorte que chaque contrainte soit satisfaite. Une solution garantit l’existence
d’un support dans chaque contrainte.
Définition 2 Soit une contrainte d’arité , un -uplet (ou tuple) est une liste de
valeurs indexée de à et notée ici . Un tuple est dit :
valide pour ssi ,
autorisé par ssi ,
un support (courant) de ssi est valide et autorisé.
On dit qu’un tuple est un support de dans lorsque est un support de
tel que . Déterminer si un tuple est autorisé par une contrainte
s’appelle un test de consistance. Il est important de noter que, en considérant un ordre
total sur l’ensemble des domaines, les tuples peuvent être ordonnés en utilisant un
ordre lexicographique .
Un CSP est dit satisfiable ssi il admet une solution. Dans la plupart des cas, la
propagation de contraintes consiste à éliminer certaines valeurs du domaine des dif-
férentes variables, valeurs qui ne peuvent apparaître dans aucune solution. Modifier
270 RSTI/hors série. JFPLC 2003.
les domaines d’un problème donné de manière à le rendre arc-consistant nécessite
des tests de consistance et aussi, pour certains algorithmes, des tests de validité. Les
tests de consistance sont nécessaires pour trouver des (nouveaux) supports tandis que
des tests de validité sont utilisés pour déterminer si des (vieux) supports sont encore
valides.
Définition 3 Soit un CSP et un couple composé d’une variable de et
d’une valeur . est dit consistant par rapport à une contrainte
de ssi soit soit il existe un support de dans . est dit
consistant ssi est consistant par rapport à toutes les contraintes de . est
arc-consistant ssi tous les couples formés à partir de sont consistants.
3. Propriétés des algorithmes de consistance d’arc
De manière à éviter des tests de consistance inutiles, les algorithmes de consistance
d’arc peuvent exploiter différentes propriétés. Dans cette section, nous présentons une
adaptation des propriétés intéressantes définies dans [BES 99].
Dans tout algorithme de consistance d’arc, un test de consistance, noté , est
toujours réalisé pour un tuple donné et par rapport à un triplet désigne
une contrainte, une variable de et une valeur de . Idéalement,
les propriétés suivantes devraient être vérifiées par un algorithme de consistance d’arc,
étant donné un triplet et un tuple .
unidirectionalité positive n’est pas testé s’il existe un support de
dans déjà testé avec succès par rapport à .
unidirectionalité négative n’est pas testé s’il a déjà été testé sans succès
par rapport à .
multidirectionalité positive n’est pas testé s’il existe un support de
dans déjà testé avec succès par rapport à un triplet avec .
multidirectionalité négative n’est pas testé s’il a déjà été testé sans succès
par rapport à un triplet avec .
Les propriétés énoncées ci-dessus correspondent pour l’essentiel aux propriétés 1,
3a, 2 et 3b de [BES 99].
4. Algorithmes AC3.X
Dans cette section, nous présentons différents algorithmes qui sont basés sur AC3.
Ce sont des algorithmes à gros grain notés sous la formes AC3.X. Pour commencer,
nous introduisons la procédure principale de tous ces algorithmes et rappelons l’algo-
rithme AC2001/3.1. Nous introduisons ensuite deux algorithmes originaux AC3.2 et
AC3.3 qui peuvent être considérés comme des améliorations de AC2001/3.1. Notons
que la description de tous les algorithmes ci-dessous (excepté AC3.3) est donnée dans
le cadre général de problèmes d’arité quelconque.
Algorithmes 271
Algorithme 1 AC3.X
1:
2: init3.X()
3: while do
4: pick in
5: if revise3.X( , ) then
6: if then return FAILURE
7: else
8: end if
9: end while
10: return SUCCESS
4.1. Action principale des algorithmes AC3.X
La structure des algorithmes AC3.X correspond à celle de AC3 [MAC 77]. Tous
ces algorithmes nécessitent l’utilisation d’un ensemble, no , permettant de mémo-
riser les arcs qui doivent être révisés. La révision d’un arc consiste à éliminer
les valeurs inconsistantes de par rapport à .
Voici maintenant une description rapide de l’action principale décrite par l’algo-
rithme 1. Initialement, tous les arcs sont placés dans l’ensemble de manière
à être révisés, et un appel à la thode init3.X permet l’initialisation des structures de
données spécifiques aux différentes versions de AC3.X. Ensuite, les arcs sont révisés à
tour de rôle, et lorsqu’une révision est effective (au moins, une valeur a été éliminée),
l’ensemble doit être mis à jour. La révision consiste à éliminer les valeurs de qui
sont devenues inconsistantes par rapport à .
4.2. AC2001/3.1
Le même algorithme, vu comme une extension de AC3, et appelé AC2001 par
[BES 01] et AC3.1 par [ZHA 01] a été proposé indépendamment par leurs auteurs
respectifs. Il y a une différence simple mais importante entre AC3 et AC2001/3.1. En
effet, lorsqu’un support doit être trouvé pour une valeur, AC3 commence la recherche
à partir du premier tuple tandis que AC2001/3.1 commence la recherche à partir d’un
point de reprise qui correspond au dernier support trouvé pour cette valeur. Plus pré-
cisément, AC2001/3.1 vérifie la propriété d’unidirectionalité positive et négative.
Algorithme 2 init3.1()
Algorithme 3 revise3.1(in C,X) : int
1: nbElements
2: for each do
3: if is valid then continue
4:
5: if then remove from
6: end for
7: return nbElements
1 / 14 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !