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
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...