Aller au contenu
Kudos AI

Problème de satisfaction de contraintes

Un problème énoncé comme un ensemble de variables, un domaine de valeurs permises pour chacune, et des contraintes restreignant les combinaisons de valeurs qui peuvent être prises simultanément, de sorte qu’un solveur générique puisse raisonner sur sa structure sans aucune connaissance du domaine.

Aussi appelé : PSC, Programmation par contraintes, Réseau de contraintes

Comprendre Problème de satisfaction de contraintes

Un problème de satisfaction de contraintes remplace la vision en boîte noire de la recherche - un état initial, une fonction d’actions et un test de but - par une description explicite de ce qui rend un état bon ou mauvais. Les variables portent les choix, les domaines portent les options, et les contraintes enregistrent quelles combinaisons sont permises. Une affectation est cohérente quand elle ne viole aucune contrainte, complète quand chaque variable a une valeur, et c’est une solution quand elle est les deux. Comme la description est standardisée, le solveur n’a besoin de rien de spécifique au problème : il peut inspecter les contraintes elles-mêmes pour décider quoi essayer ensuite et quoi écarter.

Les contraintes binaires induisent un graphe de contraintes, un nœud par variable et une arête par contrainte, et la forme de ce graphe est la carte du problème dont dispose le solveur. Le degré d’une variable, le nombre de contraintes auxquelles elle participe, prédit à quel point l’affecter restreindra tout le reste. L’exemple standard de Russell et Norvig colorie les sept régions de l’Australie avec trois couleurs sous neuf contraintes d’adjacence ; l’Australie-Méridionale est de degré cinq et la Tasmanie, une île, de degré zéro : la couleur de la Tasmanie est donc libre et les dix-huit solutions se répartissent en six coloriages continentaux multipliés par trois.

Deux idées rendent la forme praticable. La première est la commutativité : atteindre une affectation partielle par un ordre d’affectations revient au même que par n’importe quel autre, l’ordre ne porte donc aucune information et un solveur peut fixer une variable par niveau de son arbre. Pour sept variables et trois valeurs, cela transforme 7! × 3⁷ feuilles en 3⁷, un facteur 5 040 gratuit. La seconde est la propagation : avant et pendant la recherche, les valeurs sans partenaire possible peuvent être supprimées d’emblée. La cohérence d’arc, imposée par l’algorithme AC-3, rend cohérente toute paire ordonnée de variables en un temps polynomial en la taille du problème.

La propagation est correcte mais incomplète. Elle ne supprime jamais une valeur susceptible de figurer dans une solution, et pourtant un problème peut franchir la cohérence d’arc sans en avoir aucune, parce que la cohérence d’arc n’inspecte que deux variables à la fois et ne peut pas voir une contradiction qui en exige trois. Ce qui comble l’écart, c’est la recherche avec retour arrière, et ce qui rend cette recherche rapide, c’est l’association de l’inférence avec les heuristiques d’ordonnancement : les valeurs restantes minimales retiennent la variable la plus proche de l’échec, le degré départage les égalités, et la valeur la moins contraignante choisit celle qui laisse le plus de marge aux voisines. L’association compte davantage que chacune des moitiés, puisqu’une heuristique d’ordre des variables qui lit les tailles de domaine ne fait absolument rien tant que rien ne réduit les domaines.

Comment calculer

CSP = (X, D, C), solution: complete assignment violating no c ∈ C

où

X
les variables X₁ … Xₙ, une par choix qu’exige le problème
D
un domaine Dᵢ de valeurs permises pour chaque variable
C
les contraintes, chacune restreignant les valeurs qu’un sous-ensemble de variables peut prendre ensemble
consistent
une affectation, éventuellement partielle, qui ne viole aucune contrainte

Exemple : Problème de satisfaction de contraintes

Colorier l’Australie utilise sept variables de domaine {rouge, vert, bleu} et neuf contraintes d’inégalité, une par frontière commune. Lancé sur le problème intact, AC-3 n’effectue aucune révision : chaque région dispose encore de trois couleurs, aucune valeur ne peut donc être supprimée et la propagation n’a rien sur quoi travailler tant qu’une affectation n’a pas créé d’asymétrie.

Posez l’Australie-Occidentale au rouge et le Queensland au vert et la branche est déjà morte, même si une seule méthode s’en aperçoit. La vérification en avant laisse le Territoire du Nord et l’Australie-Méridionale avec la seule valeur bleu et poursuit ; la cohérence d’arc complète propage ce singleton un cran plus loin, constate que les deux régions sont voisines, vide le domaine de l’Australie-Méridionale et signale un échec. Une énumération exhaustive sur les cinq régions restantes confirme qu’il y a zéro complétion.

Mesurer le problème des N reines montre pourquoi les heuristiques sont habituellement mal présentées. À n = 24, le retour arrière simple essaie 411 608 affectations ; ajouter les seules valeurs restantes minimales en essaie exactement autant, parce que rien ne supprime de valeurs et que tous les domaines sont à égalité. La seule vérification en avant ramène le compte à 286 963, et les deux ensemble à 43.

Avantages et inconvénients

Avantages

  • Une seule représentation et un seul solveur servent des problèmes qui n’ont rien d’autre en commun.
  • La propagation peut prouver qu’une branche est sans espoir sans l’explorer, souvent avant même toute affectation.
  • La structure est visible : degré, taille de domaine et forme du graphe guident directement la recherche.

Inconvénients

  • La satisfaction de contraintes est NP-complète : la forme standard organise donc la difficulté plutôt qu’elle ne la supprime.
  • La cohérence d’arc est incomplète, et une k-cohérence plus forte coûte un temps et un espace exponentiels en k.
  • Certains problèmes, en particulier ceux aux conditions numériques ou temporelles compliquées, s’expriment malaisément par des contraintes.

Questions fréquentes

En quoi cela diffère-t-il d’une recherche ordinaire dans un espace d’états ?

Un problème de recherche est opaque : le solveur peut tester si un état est un but mais ne peut pas voir pourquoi un état est mauvais. Un PSC expose la structure, si bien que le solveur peut supprimer les valeurs impossibles, détecter tôt les impasses et choisir quoi essayer ensuite à partir des contraintes elles-mêmes plutôt que d’une heuristique écrite à la main.

Si la cohérence d’arc est incomplète, pourquoi la lancer ?

Parce qu’elle est bon marché et qu’elle est correcte. Elle s’exécute en temps polynomial, ne retire jamais une valeur susceptible de faire partie d’une solution, et effondre fréquemment les domaines au point de rendre triviale la recherche restante. Elle fournit aussi les écarts de taille de domaine dont dépendent les heuristiques d’ordre des variables.

L’inférence doit-elle être lancée une fois au début ou tout au long de la recherche ?

Tout au long. Un prétraitement par AC-3 n’aide que si les domaines initiaux sont déjà inégaux. Chaque affectation faite pendant la recherche crée une nouvelle occasion de déduire, et ce sont ces déductions qui permettent aux valeurs restantes minimales d’orienter. C’est l’entrelacement des deux qui produit les grandes accélérations.

En résumé

Un PSC est un problème décrit avec assez de détail pour qu’un solveur générique puisse raisonner dessus : variables, domaines et contraintes, plus le graphe qu’elles induisent. La commutativité réduit l’arbre gratuitement, la propagation supprime ce qui ne peut pas marcher, et la recherche munie d’heuristiques d’ordonnancement alimentées par l’inférence fait le reste.