J'ai effectué mon stage de DEA au CRID (Centre de Recherche en Informatique de Dijon) en 1994 sous la direction de Jacqueline Chabrier. Mon sujet portait sur l'utilisation de techniques de symétrie pour la résolution de problèmes SAT :
Symétries dans les Problèmes SAT structurés, Application à Score(FD/B)
mots clés : Calcul Propositionnel, Problème SAT, Problèmes de Satisfaction de Contraintes (CSP).
Le problème de satisfiabilité d'un ensemble de formules du calcul propositionel (SAT) est un problème fondamental en logique mathématique, inférence, raisonnement automatique. Le problème SAT est NP-complet, i.e. qu'il n'existe pas d'algorithme déterministe de complexité polynomiale capable de résoudre ce problème de manière efficace. En conséquence, de nombreux paradigmes et techniques de programmation ont été développés afin d'améliorer la résolution de ce problème. Citons brièvement les méthodes de saturation (SL-Résolution), les algorithmes énumératifs (Quine, Davis et Putnam), la programmation linéaire en 0-1 (FAST), les méthodes basées sur la recherche locale (Recuit Simulé, Tabu), l'approche programmation par contraintes (CSP, CLP).
La méthode SCORE développée au laboratoire CRID s'inscrit dans le cadre de la Programmation par Contraintes. SCORE est une méthode complète et originale de résolution de problèmes de satisfaction de contraintes sur les domaines booléens et entiers offrant un langage déclaratif et statique de haut niveau pour la modélisation des problèmes.
Il est possible de réaliser une classification des problèmes SAT en problèmes structurés et aléatoires. Concernant les problèmes SAT aléatoires, il n'existe a priori pas d'heuristique à caractère général capable de les résoudre tous en apportant un gain de performance majeur.
Par contre, pour les problèmes structurés (tels Ramsey, Pigeons, Schur) la prise en compte des symétries inhérentes à ce type de problèmes donne des résultats intéressants et permet dans certains cas de diminuer de manière drastique le temps de résolution comme en témoignent les résultats que nous avons obtenus.
Dans le cadre de SCORE, le langage de déclaration de problème nous permet de rechercher des symétrie sur l'expression du problèmes, alors que la plupart des méthodes basées sur les symétries recherchent celles-ci lors de la résolution du problème.
Ce problème consiste à déterminer s'il est possible de placer n pigeons dans m pigeonniers, un pigeonnier ne pouvant être occupé au plus que par un seul pigeon.
Pour modéliser ce problème, on utilise n x m variables propositionnelles pi,j avec i variant de 1 à n, et j variant de 1 à m. Si pi,j est vraie alors le pigeon i trouve dans le pigeonnier j.
Ce problème, archétype des problèmes combinatoires, est intéressant sa solution est évidente mais le résoudre peut demander un important temps de calcul :
Le problème, écrit en fonction des clauses de cardinalité, s'exprime par :
#(1,1, p1,1, ..., p1,m) |
... |
#(1,1, pn,1, ..., pn,m) |
#(0,1, p1,1, ..., pn,1) |
... |
#(0,1, p1,m, ..., pn,m) |
Voici la représentation du problème en SCORE(FD/B) :
proc PigeonHole(N, P)
{
int I;
array pig[N][P];
/* One pigeon is in one and only one dovecote*/
foreach I in 1..N
#(1, 1, pig[I][*]);
/* In a dovecote, there is 1 pigeon maximum */
foreach I in 1..P
#(0, 1, pig[*][I]);
}
Le problème de Ramsey, ici en trois couleurs (rouge, vert, bleu), consiste à colorier les triangles d'un graphe complet sans qu'il n'y ait de triangle monochromatique (une seule couleur).
Ce problème admet des solutions pour $3 ≤ n ≤ 16$ et n'admet pas de solution au dela de 16.
Voici la représentation du problème en SCORE(FD/B) :
proc Ramsey(N)
{
int I,J,K;
array red[N][N], green [N][N], blue [N][N];
/* One edge has one and only one color */
foreach I in 1..N-1
foreach J in I+1..N
#(1,1, red[I][J], green[I][J], blue[I][J] );
/* There is no monochromatic triangle */
foreach I in 1..N-2
foreach J in I+1..N-1
foreach K in J+1..N
{
#(0,2, red[I][J], red[I][K], red[J][K] );
#(0,2, green[I][J], green[I][K], green[J][K] );
#(0,2, blue[I][J], blue[I][K], blue[J][K] );
}
}
Nous présentons ci-dessous les résultats obtenus à l'époque sur une Station SUN Sparc 10.
Le symbole Inf indique que le programme a été arrêté après deux jours de calculs.
Problème | Sat | Vars | Ctrs | Temps | Temps + Sym |
Pigeon 10, 10 | Oui | 100 | 20 | 1 | 1 |
Pigeon 10, 9 | Non | 90 | 19 | 45 | 1 |
Pigeon 30, 30 | Oui | 900 | 60 | 1 | 1 |
Pigeon 20, 29 | Non | 870 | 59 | Inf | 55 |
Ramsey 14 | Oui | 273 | 1183 | 1 | 1 |
Ramsey 15 | Oui | 315 | 1470 | 48 | 1 |
Ramsey 16 | Oui | 360 | 1800 | 3m45 | 1 |
Ramsey 17 | Non | 408 | 2176 | Inf | 1 |