Résolution de problèmes de Sudoku par réduction vers SAT 1 Sudoku

Transcription

Résolution de problèmes de Sudoku par réduction vers SAT 1 Sudoku
Résolution de problèmes de Sudoku
par réduction vers SAT
Sujet proposé par François Pottier
mailto:[email protected]
Diculté : facile (*)
Notre objectif est d'écrire un petit logiciel de résolution de problèmes de Sudoku,
et ce à l'aide d'une réduction vers un problème connu et très étudié, le problème
de satisabilité de formules de la logique propositionnelle problème connu sous
le nom de SAT. En d'autres termes, plutôt que de réinventer des techniques de
recherche d'une solution parmi un arbre de possibilités, et plutôt que d'utiliser une
connaissance pointue des techniques exploitées par les joueurs de Sudoku, nous allons tirer prot des eorts considérables investis depuis trente ans pour résoudre de
façon ecace le problème SAT. Ce sujet ne met donc en ÷uvre aucune technique
algorithmique pointue, mais illustre l'intérêt de la notion de codage d'un problème
vers un autre. Le Sudoku est un problème dont l'intérêt pratique est réduit, mais on
comprend l'intérêt qu'une réduction vers SAT peut avoir dans d'autres domaines,
par exemple la recherche d'erreurs dans des programmes ou dans des circuits électroniques.
N'oubliez pas d'utiliser un système de contrôle de versions pour gérer l'évolution
de votre travail et l'interaction entre vous si vous travaillez en binôme. cvs et svn
sont gratuits et très répandus.
Suivez avec attention les instructions données en ce qui concerne le format textuel des problèmes et des solutions. En eet, votre programme sera confronté à un
jeu de tests automatiques.
1 Sudoku
Généralités Un problème de Sudoku est constitué d'une grille ou matrice de
dimension n × n, où n est un carré parfait : n = k 2 . La grille peut donc également
être considérée comme une matrice de k × k régions carrées, chacune de ces régions
étant elle-même constituée de k × k cases. On utilise, le plus souvent, les valeurs
k = 3 et n = 9. Chaque case de la grille contient soit un blanc, soit un nombre
compris entre 1 et n. Nous appellerons symbole un tel nombre.
Le problème consiste à compléter les cases blanches, en inscrivant dans chacune
d'elles un symbole, de telle sorte que chaque ligne, chaque colonne, et chaque région
carrée contienne exactement un exemplaire de chacun des symboles.
Les problèmes proposés de Sudoku aux joueurs humains ont une solution unique,
qu'il est souvent possible de découvrir par un raisonnement direct, sans qu'il soit
nécessaire d'explorer de multiples possibilités et parfois de rebrousser chemin. Cette
propriété ne nous sera pas utile ici.
Format textuel d'entrée Un symbole sera représenté par un nombre en notation
décimale. Une case blanche sera représentée par les caractères . ou 0 . Une
1
ligne de la matrice sera représentée par une suite de n symboles, séparés par un
nombre arbitraire de blancs, et terminée par un retour à la ligne. Les lignes blanches,
ainsi que les commentaires (ouverts par le caractère # et terminés par un retour à
la ligne), seront ignorés. La valeur du paramètre n ne sera pas explicitement spéciée
et devra être déterminée par le programme. Voici un exemple de problème :
#
0
9
0
0
0
0
0
0
0
boardsize
2 4 3 0 5
0 0 0 1 2
0 5 9 7 0
0 1 0 8 0
0 0 1 0 9
0 0 2 4 0
8 2 0 0 4
0 0 0 5 0
1 7 0 0 0
3
0
7
4
0
0
1
0
0
0
x
9
5
6
0
0
3
0
0
4
3
0
0
0
9
0
7
0
8
6
Format textuel de sortie Une solution peut être considérée comme un problème
particulier, dans lequel aucune case blanche n'apparaît. Le format de sortie sera donc
identique au format d'entrée. Voici par exemple la solution au problème ci-dessus :
#
7
9
1
3
2
8
6
4
5
boardsize
2 4 3 6 5
6 8 4 1 2
3 5 9 7 8
4 1 5 8 7
7 6 1 3 9
5 9 2 4 6
8 2 7 9 4
9 3 6 5 1
1 7 8 2 3
3
8
7
4
6
5
1
3
2
9
x
9
5
6
2
8
3
1
7
4
3
1
3
2
9
4
7
5
8
6
2 SAT
Généralités Un problème SAT est constitué de n variables booléennes X1 , . . . , Xn
et d'une formule F de la logique propositionnelle dont les variables sont X1 , . . . , Xn .
Le problème consiste à déterminer si F admet ou non une solution, c'est-à-dire s'il
existe une attribution d'une valeur de vérité à chacune des variables X1 , . . . , Xn qui
satisfait F .
La formule F est en général présentée sous forme normale conjonctive. En
d'autres termes, F est une conjonction de clauses, où une clause est une disjonction
de littéraux, et un littéral est soit une variable soit la négation d'une variable.
Format textuel d'entrée Les outils existants pour résoudre le problème SAT appelés solveurs SAT acceptent un même format d'entrée, connu sous le nom
de DIMACS CNF . Ce format est le suivant. La première ligne du chier est
constituée des mots p et cnf , suivis du nombre de variables n et du nombre
de clauses c qui constituent le problème. Chacune des c lignes suivantes représente
une clause, et est terminée par le caractère 0 suivi d'un retour à la ligne. Une
clause est une suite de littéraux, séparés par des blancs. Un littéral de la forme Xi
est représenté par l'entier i, sous forme décimale, tandis qu'un littéral de la forme
¬Xi est représenté par l'entier −i, sous forme décimale. Toute ligne commençant
par le caractère c , suivi d'un blanc, est considérée comme un commentaire et
ignorée. Voici un exemple de problème :
2
c Un problème SAT.
p cnf 3 3
1 -3 0
2 3 -1 0
-1 0
Format textuel de sortie Malheureusement, les diérents solveurs SAT ne
semblent pas s'être mis d'accord sur le format textuel d'achage des solutions.
Je décris ici les formats produits par deux solveurs, relsat et zchaff.
relsat ache une liste de solutions, suivie des mots SAT ou UNSAT , et
éventuellement entrecoupée de lignes de commentaires au format DIMACS. Chaque
ligne de solution est constituée du mot Solution , suivi d'un entier, suivi d'un
caractère : , suivi d'une suite d'entiers séparés par des blancs, lesquels représentent les indices i des variables Xi auxquels la solution attribue la valeur vrai .
Voici une réponse possible de relsat au problème ci-dessus :
c Finding up to 1 solutions...
Solution 1: 2
c Solution limit reached.
SAT
zchaff ache d'abord un message arbitraire, suivi d'une ligne blanche. Viennent
ensuite d'éventuelles lignes de commentaires au format DIMACS, puis une ligne
constituée des mots Instance Satisfiable ou Instance Unsatisfiable .
Vient ensuite la solution, constituée d'une liste de n littéraux positifs ou négatifs
séparés par des blancs. Ici, l'entier i signie que la solution attribue à Xi la valeur
vrai , tandis que l'entier −i signie que la solution attribue à Xi la valeur faux .
Après la solution, viennent encore des messages arbitraires, que l'on peut ignorer.
Voici une réponse possible de zchaff au problème ci-dessus :
Z-Chaff Version: Chaff 2004.11.15 Simplified
Solving sample.cnf ......
c 3 Clauses are true, Verify Solution successful.
Instance Satisfiable
-1 2 -3 Random Seed Used 0
Max Decision Level 0
Dans les deux cas, il faut comprendre que le problème admet la solution qui à
X1 et X3 attribue faux et à X2 attribue vrai .
3 Réduction de Sudoku à SAT
Généralités Cook a démontré en 1971 que le problème SAT est NP-complet [3],
ce qui signie qu'il est probablement impossible de le résoudre à l'aide d'un algorithme déterministe en un temps polynomial vis-à-vis du paramètre n. De fait,
tous les solveurs SAT existants exigent, dans le pire des cas, un temps exponentiel
vis-à-vis de n. Néanmoins, grâce aux importants eorts de recherche investis dans
ces solveurs, ils ont atteint une ecacité qui leur permet souvent, en pratique, de
résoudre des problèmes de grande taille.
Yato et Seta ont démontré plus récemment que le problème de Sudoku est également NP-complet. Du fait que ces problèmes sont tous deux NP-complets, on peut
déduire que chacun des deux se réduit, en temps polynomial, à l'autre. En d'autres
termes, un solveur SAT peut être utilisé pour résoudre des problèmes de Sudoku,
3
et inversement. Bien sûr, c'est ici la première de ces réductions qui nous intéresse,
pour deux raisons. D'une part, la réduction de Sudoku à SAT est simple et naturelle,
alors que la réduction inverse serait probablement dicile. D'autre part, les solveurs
SAT sont des outils ecaces et complets, ce qui signie qu'ils trouvent toujours une
solution, s'il en existe une ; tous les solveurs Sudoku ne peuvent pas en dire autant.
Réduction L'idée est de se donner n3 variables booléennes, notées Xijd , où i, j, d
d
prendra la valeur vrai si et seulement
parcourent l'intervalle [1, . . . , n]. La Xij
si la case dont les coordonnées sont (i, j) contient le symbole d. On construira une
formule constituée de quatre types de clauses, qui coderont les contraintes suivantes :
1. toute case contient au moins un symbole ;
2. toute case contient au plus un symbole ;
3. deux cases issues d'une même ligne, colonne ou région carrée ne peuvent contenir un même symbole ;
4. si le contenu d'une case est initialement donné, celui-ci doit être respecté.
Pour plus de détails, on pourra se référer par exemple au court article de Weber [7].
Des variantes de cette réduction ont été étudiées par d'autres [5, 4]. On prendra
soin de réaliser la réduction (et, plus généralement, l'ensemble du projet) de façon
indépendante de la valeur du paramètre n.
4 Détails pratiques
Votre rôle est d'écrire un programme qui accepte, sur l'entrée standard, la description d'un problème de Sudoku, et écrit, sur la sortie standard, la solution de ce
problème. Pour cela, le programme construira, de façon interne, un problème SAT,
dont il stockera la description dans un chier temporaire, puis appellera un solveur
SAT externe, dont il analysera la réponse, pour en déduire la solution recherchée.
Il sera nécessaire d'installer sur votre machine un solveur SAT. Je vous demande
d'utiliser relsat [2] ou zchaff [1], an que je puisse moi-même exécuter votre
programme sans devoir installer de trop nombreux solveurs.
Pour tester votre programme, un jeu de problèmes de Sudoku vous est fourni
sur la page de suivi du projet [6]. Des précisions au sujet pourront également être
publiées sur cette page.
Références
[1] The SAT Research Group at Princeton University. zchaff, November 2004.
[2] Roberto Bayardo. relsat, March 2000.
[3] Stephen A. Cook. The complexity of theorem-proving procedures. In ACM
symposium on Theory of computing (STOC), pages 151158. ACM Press, 1971.
[4] Gihwon Kwon and Himanshu Jain. Optimized CNF encoding for Sudoku
puzzles. In International Conference on Logic for Programming, Articial Intelligence, and Reasoning (LPAR), November 2006.
[5] Inês Lynce and Joël Ouaknine. Sudoku as a SAT problem. In International Symposium on Articial Intelligence and Mathematics (AIMATH), January 2006.
[6] François Pottier. Page de suivi.
[7] Tjark Weber. A SAT-based Sudoku solver. In Geo Sutclie and Andrei Voronkov, editors, International Conference on Logic for Programming, Articial
Intelligence, and Reasoning (LPAR), pages 1115, December 2005.
4

Documents pareils

TP n°5

TP n°5 Un exemple de formule ainsi construite (en notant ∧ le “et” booléen) : F = (x1 ∨ ¬x2 ∨ x3 ∨ x4 ) ∧ (¬x1 ∨ x2 ) ∧ (x3 ∨ ¬x4 ) Le problème SAT est le problème de trouver, étant donné une formule...

Plus en détail