Introduction

Le sudoku est un jeu en forme de grille défini en 1979 et inspiré du carré latin ainsi que du problème des 36 officiers du mathématicien suisse Leonhard Euler. Le but du jeu est de remplir cette grille avec des chiffres allant de 1 à 9 en respectant certaines contraintes. Ce jeu va nous permettre d'illustrer la réduction d'un problème à SAT.

 

Publié dans geek spirit | Laisser un commentaire

Présentation du problème SAT et des techniques de résolutions

 


Le formalisme

Un problème SAT est représenté au moyen de $n$ variables propositionnelles
$x_1, qui peuvent prendre la valeur $0$ (faux) ou $1$ (vrai).

On appelle littéral une variable $x_i$ ou son complément $neg.

Une clause est une disjonction de littéraux (par exemple ($x_1$ ou $x_3$) ou encore ($x_4$ ou $neg)).

Une formule logique sous forme normale conjonctive (CNF) est une conjonction de clauses.

Un littéral qui a la valeur $1$ est dit satisfait. Une clause est satisfaite si l'un de ces littéraux l'est. Une formule est satisfaite si toutes ses clauses le sont.

Le problème SAT est un problème NP-complet (d'après le théorème de Cook) qui consiste à dire s'il existe ou non une combinaison de valeurs pour les littéraux d'une formule donnée, telle que ces valeurs satisfont cette formule.

 


Exemple 1

Soient
${v_1, des variables propositionnelles. Soit l'expression
$(v_1.

Pour cet exemple simple, il est possible de déterminer les valeurs de toutes les variables par simples déduction. En effet, on s'aperçoit que $v_3$ vaut $0$, on peut donc déduire $v_1$ de
$(neg et trouver que $v_1$ vaut $0$. Ainsi, on peut en déduire $v_2$ à partir de
$(v_1 et trouver que $v_2$ vaut $1$.

Cette résolution très simple n'est bien sûr pas applicable à tous les coups. Dans l'exemple, chaque valeur des variables pouvait se déduire. Dans le cas général, il faudrait développer l'arbre de recherche.

 


Exemple 2

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 variables propositionnelles $p_{i,j}$ avec $i$ variant de $1$ à $n$, et $j$ variant de $1$ à $m$. Si $p_{i,j}$ est vraie alors le pigeon $i$ trouve dans le pigeonnier $j$.

Ce problème, archétype des problèmes combinatoires, est intéressant et sa solution est évidente mais le résoudre peut demander un important temps de calcul :

 

  • si $n, le problème est consistant et la recherche d'une solution se fait de manière linéaire sachant que le nombre de solutions ($C_m^n$) est exponentiel,
  • si $n, le problème est inconsistant mais les algorithmes standard (du type Davis et Putnam) prouvent l'inconsistance en un temps exponentiel.

Le problème, écrit en fonction des clauses de cardinalité, s'exprime par :

 

  • chaque pigeon occupe un seul pigeonnier :

     

    begin{displaymath}card(1,1,

     
    begin{displaymath}ldots

     begin{displaymath}card(1,1,

     

  • chaque pigeonnier contient au plus un pigeon :

     

    begin{displaymath}card(0,1,

     
    begin{displaymath}ldots
     

    begin{displaymath}card(0,1,

     

 

Problème
SAT
Nombre de variables
pigeons $11,
Non
$110$
pigeons $30,
Non
$870$
pigeons $31,
Oui
$930$

 


Quelques méthodes de résolution

 


Les méthodes de saturation

Ces méthode effectuent des tests de consistance locale pour détecter l'incohérence de la base de clauses. Elles essaient de prouver l'inconsistance de l'ensemble de clauses en réfutant (démontrant la fausseté) une d’elles.

On pourra notamment citer l'algorithme SL-Resolution.

 


Les algorithmes énumératif

Ces algorithmes consistent en une exploration systématique de l'ensemble des interprétations afin de déterminer si l’une d'entre elles est un modèle. Cette procédure peut aisément être assimilée à une forme de résolution que l'on nomme résolution dirigée.

On pourra notamment citer la célèbre procédure de Davis et Putnam.

 


La recherche locale

Ces méthodes commencent à donner des valeurs à chaque variables puis vont en modifier certaines itérativement de façon à réduire le nombre de clauses non satisfaites.

On pourra notamment citer le célèbre recuit-simulé.

 


L'approche programmation par contrainte (PPC)

Cette méthode consiste à programmer avec des relations appelées « contraintes''. Un problème comporte un certain nombre de variables, chacune ayant un domaine, et un certain nombre de contraintes. Trouver une solution à un problème de PPC consiste à décrire l'ensemble des affectations autorisées de chaque variable, de telle sorte que la totalité des contraintes soient satisfaites.

On pourra notamment citer le célèbre algorithme « Branch And Bound''.

 

Publié dans geek spirit | Laisser un commentaire

Formalisation du problème du Sudoku pour la réduction à SAT

 


Le Sudoku

Une grille de Sudoku est composée de $n cases, avec $n$ un carré parfait (c'est à dire que l'on a $n) et cette grille est elle-même divisée en $k sous-grilles. Généralement, on prend $n et $k. Au départ certaines cases sont remplies par des chiffres et d'autres sont vides. Le but du jeu est de remplir les cases vides en respectant les règles suivantes :

 

  • On ne doit pas avoir deux chiffres identiques sur une même ligne
  • On ne doit pas avoir deux chiffres identiques sur une même colonne
  • Il ne doit pas y avoir deux chiffres identiques dans l'une des sous-grilles de taille $k.

 


Figure:
Grille de sudoku
Image

Le Sudoku possède plusieurs propriétés :

 

  • Un problème de Sudoku ne possède qu'une seule solution
  • Il est possible de résoudre un Sudoku en raisonnant, donc sans faire de recherche de toutes les possibilités.

 

Formalisation

Pour représenter le problème sous forme de problème SAT, nous avons besoin de beaucoup de variables booléennes (qui correspondent aux littéraux). En effet il faut $n variables $Vxyz$ avec $x$, $y$ et $z$ $in$ $[1..n]$. La variable $V_{xyz}$ sera vraie si et seulement si la case ($x,y$) contient la valeur $z$. On a besoin de $n variables pour avoir chaque case et on multiplie une troisième fois par $n$ pour avoir chaque case remplie du symbole $z$, avec $z$ $in$ $[1..n]$, ce qui donne $n^3$ variables.

Par exemple : si $V_{135}$ est vraie, alors on a la case $[1,3]$ remplie avec le chiffre $5$.

Si on prend $n, il faudra
$9 variables.

 

Publié dans geek spirit | Laisser un commentaire

La Réduction

 


Les clauses et la formule

Pour effectuer la réduction, on va construire une formule basée sur 4 types de clauses :

  • Une case contient au moins un symbole
  • Une case contient au plus un symbole
  • Deux cases issues d'une même ligne, colonne, ou sous-grille ne peuvent pas contenir le même symbole
  • Si le contenu d'une case est donné initialement, alors il doit être respecté

Ces clauses peut être formalisées comme suit :

 

 

begin{displaymath}bigvee_{d=1}^9

 

 

 

begin{displaymath}bigwedge_{1leq

 

 


Les méthodes d'inférence possibles

Comme certaines cases sont préfixées, il est possible de réduire les règles définies plus haut en plaçant directement leurs valeurs. On peut également éliminer tout de suite les valeurs qui représentent des nombres égaux à une valeur préfixée qui se trouve sur la même ligne, la même colonne ou dans la même sous-grille.

Après cette étape on peut utiliser les méthodes de résolution vues à la section 1.

 

Publié dans geek spirit | Laisser un commentaire

Conclusion

Dans ces quelques pages, nous avons vu la réduction du problème du sudoku à SAT et cet exemple nous à permit de mieux comprendre le mécanisme de réduction.

 

Publié dans geek spirit | Laisser un commentaire