La programmation par contraintes (PPC, ou CP pour Constraint Programming en anglais) est un paradigme de programmation apparu dans les années 80 [1] permettant de résoudre des problèmes combinatoires de grandes tailles tels que les problèmes de planification et d'ordonnancement[2]. La programmation par contraintes sépare la partie modélisation à l'aide de problème de satisfaction de contraintes, de la partie résolution dont la particularité réside dans l'utilisation active des contraintes du problème pour réduire la taille de l'espace des solutions à parcourir (on parle de propagation de contraintes).

« Constraint Programming represents one of the closest approaches computer science has yet made to the Holy Grail of programming: the user states the problem, the computer solves it. »

— E. Freuder

Dans le cadre de la PPC, les problèmes sont modélisés sous à l'aide de variables de décision et de contraintes, où une contrainte est une relation entre une ou plusieurs variables qui limite les valeurs que peuvent prendre simultanément chacune des variables liées par la contrainte. Les algorithmes de recherche de solution, en PPC, s'appuient généralement sur la propagation de contraintes, pour réduire le nombre de solutions candidates à explorer, ainsi que sur une recherche systématique parmi les différentes affectation possible de chacune des variables. De tels algorithmes garantissent de trouver une solution, quand elle existe, et permettent de prouver qu'il n'existe pas de solution à un CSP si ils n'ont pas trouvé de solutions à la fin de la recherche exhaustive.

Problème de satisfaction de contraintes sur les domaines finis

modifier

Une contrainte est une relation entre plusieurs varaibles qui limitent l'ensemble des valeurs que peuvent prendre ces variables simultanément.

Définition — Un problème de satisfaction de contraintes sur des domaines finis (ou CSP) est défini par un triplet   où:

  •   est l'ensemble de variables du problème;
  •   est l'ensemble des domaines des variables, c'est-à-dire que pour tout   on a  ;
  •   est un ensemble de contraintes. Une contrainte   est définie par l'ensemble   des variables sur lequel elle porte et la relation   qui définie l'ensemble des valeurs que peuvent prendre simultéanément les variables de  :

On appelle affectation, le fait d'associer une valeur de son domaine à une variable. Dans le cadre de la résolution de problème de satisfaction de contraintes, on parle d'affectation partielle lorsque l'on affecte un sous-ensemble de l'ensemble des variables du problème, et d'affectation totale lorsque l'on affecte toutes les variables du problème.

Définition —  Une affectation   d'un CSP   est définie par le couple   où:

  •   est un sous-ensemble de variables;
  •   est le tuple des valeurs prises par les variables affectées.

On dit qu'une affectation est partielle lorsque l'ensemble de variables affectées est différent de l'ensemble des variables du problème, sinon on parle d'affectation totale.

Propriété — Soit   une affectation (partielle ou totale) d'un CSP  , et   une contrainte de   tel que  , l'affectation   satisfait la contrainte   si et seulement si l'ensemble des valeurs   des variables sur lesquelles porte la contrainte   appartient à  .

Définition — Une solution d'un CSP est une affectation totale qui satisfait l'ensemble des contraintes.

Notes et références

modifier
  1. Mackworth 77, Haralick 80
  2. Roman Bartak, A Guide to Constraint Programming, 1998