Projet INF242
Transcription
Projet INF242
Projet INF242 Stéphane Devismes & Benjamin Wack Pour ce projet les étudiants doivent former des groupes de 3 ou 4 étudiants. 1 Planning – Distribution du projet au premier cours. – À la fin de la deuxième semaine de TD, constitution des groupes et validation du sujet par le chargé de TD. – Livraison par email à votre enseignant de TD au plus tard le 6 mars 2015 du pré-rapport (5 pages maximum). – Livraison au plus tard le 30 avril 2015 par email du rapport final. – Dans la semaine du 4 au 7 mai 2015, soutenance de 20 minutes par groupe, questions incluses (démonstration du travail réalisé en groupe). 2 Travail à réaliser Le projet se découpe en deux parties. La première partie fera l’objet d’un pré-rapport. À la fin de la seconde partie, les différents groupes devront produire un rapport résumant les travaux accomplis dans les deux parties. Enfin, ce projet sera aussi évalué par une soutenance. Les contenus des pré-rapport et rapport final seront pris en compte dans la notation. 2.1 Première partie La première partie de ce projet consiste à formaliser plusieurs problèmes en logique propositionelle sous la forme d’ensembles de clauses. Dans votre pré-rapport, pour chaque problème traité, vous devrez : 1. Donnez l’énoncé informel du problème, 2. Traduire cet énoncé sous la forme de formules propositionelles. Cette traduction devra être justifiée. 3. Traduire les formules propositionelles en un ensemble de clauses équivalentes. Cette traduction devra aussi être justifiée. Il vous est demandé de traiter plusieurs problèmes. Ces différents problèmes doivent être de difficulté croissante. Vous pouvez, par exemple, commencer avec des exercices du polycopié qui n’ont pas été traités en TD ou alors des exercices d’examen ou partiel des années précédentes, disponibles à cette adresse 1 http://www-verimag.imag.fr/~devismes/WWW/enseignements.html#INF242 Après vous être exercé sur des exemples simples, vous devrez vous concentrer sur la formalisation d’un problème plus complexe. Par exemple : – le Sudoku – le carré magique – Squaro – Tetravex – Paint-by-numbers D’autres pistes de sujets sont proposées sur la page http://www-verimag.imag.fr/~wack/inf242 avec en général des liens vers des applets de démonstration. Ce dernier problème devra obligatoirement être validé par votre chargé de TD ! 2.2 Deuxième partie La seconde partie de ce projet consiste en la résolution automatique des problèmes proposés lors de la première partie. Pour cela, vous utiliserez un solveur SAT. Plus précisement, vous programmerez vous-même votre propre solveur SAT (dans le langage de votre choix) avec différentes stratégies de résolution. En outre, il vous est demandé de fournir deux autres programmes qui concernent uniquement le dernier problème à traiter : le problème complexe validé par votre chargé de TD. Le format DIMACS. La première étape consistera à traduire les ensembles de clauses proposés lors de la première partie en fichier DIMACS. Le format des fichiers d’entrées des SAT-solveurs est un standard international pour la représentation de formules en forme normale conjonctive. Un fichier en format DIMACS commence par une ligne qui spécifie qu’il s’agit d’une forme normale conjonctive, qui précise combien de variables la formule contient, et de combien de clauses disjonctives elle est constituée. Par exemple : p cnf 5 3 indique que le fichier contient une formule en forme normale conjonctive, avec 5 variables et 3 clauses. Ensuite, le fichier est composé de plusieurs lignes, une par clause. Chaque ligne contient des entiers positifs et/ou négatifs, et se termine par 0. Un entier positif i indique que la i-ème variable apparaît avec polarité positive dans la clause. Un entier négatif −i indique que la i-ème variable apparaît avec polarité négative dans la clause. Par exemple, le fichier suivant au format DIMACS représente la formule : (x1 ∨ ¬x5 ∨ x4 ) ∧ (¬x1 ∨ x5 ∨ x3 ∨ x4 ) ∧ (¬x3 ∨ ¬x4 ) c c start with comments c c p cnf 5 3 1 -5 4 0 -1 5 3 4 0 -3 -4 0 Attention ! Pour les problèmes de taille conséquente (par exemple, le dernier problème proposé), cette transformation devra être effectuée automatiquement à l’aide d’un programme que vous aurez écrit 1 . Votre solveur SAT : WalkSat. Il vous est demandé de programmer dans le langage de votre choix un solveur de type WalkSat. Votre WalkSat devra lire en entrée l’ensemble de clauses à résoudre sous la forme d’un fichier DIMACS. Le but est ensuite de renvoyer une assignation modèle de toutes les clauses de l’ensemble si cela est possible. Notez que WalkSat est un solveur incomplet : si l’ensemble de clauses donné en entrée est contradictoire, il est incapable de le déterminer. Le pseudo-code d’un algorithme de type WalkSat est donné ci-dessous. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: Choisir une assignation v uniformément au hasard i=0 TANT QUE (v n’est pas modèle) et i < MAX_ITERATION FAIRE Choisir au hasard C parmi les clauses C’ telles que v(C’) = faux Tirer une valeur réelle x uniformément au hasard dans [0,1] SI x <= P ALORS Choisir uniformément au hasard une variable y de C SINON Choisir une variable y de C de manière déterministe FIN SI Inverser la valeur de v(y) dans l’assignation v i++ FIN TANT QUE SI v est modèle ALORS Renvoyer v SINON Renvoyer pas_de_decision FIN SI Le code donné ci-dessus est volontairement incomplet ! En effet, il ne précise pas les valeurs de MAX_ITERATION et P, ni la procédure de choix déterministe de la variable y à la ligne 9. Au minimum, il vous est demandé de proposer une valeur raisonnable pour ces deux constantes, et de faire en sorte que la variable y choisie soit la variable présente dans C qui va minimiser le nombre de clauses insatisfaites. Facultativement, vous pouvez mener des expérimentations afin de trouver les meilleures valeurs possibles pour MAX_ITERATION et P ; vous pouvez également programmer d’autres méthodes de choix de y, par exemple : – Choisir la variable présente dans C parmi celles les moins modifiées jusqu’ici. – Pour chaque variable z, calculer score(z) de la manière suivante : – si v(z) = vrai alors compter le nombre de clauses où z apparaît négativement moins le nombre de clauses où elle apparaît positivement, 1. Si vous programmez en JAVA, vous pouvez vous inspirer de l’exemple donné à la page www-verimag.imag.fr/~devismes/JAVA/Fichier.java pour la gestion de fichiers. – sinon compter le nombre de clauses où z apparaît positivement moins le nombre de clauses où elle apparaît négativement Ensuite choisir une variable de C de score maximum. – Vous inspirer des heuristiques MOMS et JW données dans le poly. – Mixer plusieurs des stratégies précédentes. – etc. Dans ce cas, il peut être judicieux de comparer entre elles les différentes procédures de choix que vous aurez implantées. Notez que pour simplifier votre implémentation, vous pouvez transformer en préambule votre ensemble de clauses en ensemble de clauses 3-SAT équivalent (vous pourrez vous baser sur l’algorithme proposé dans l’exercice 50 p. 63 de votre polycopié de cours). Problème complexe. En ce qui concerne le dernier problème demandé (le problème complexe validé par votre chargé de TD), vous devrez fournir : – Un programme générant le fichier DIMACS correspondant à une instance du problème. Par exemple, une grille de Sudoku contenant quelques nombres. – Un programme affichant de manière lisible une solution du problème complexe choisi. Par exemple, si vous choisissez le Sudoku, ce programme devra afficher une grille solution calculée par votre solveur à partir de la grille incomplète fournie en entrée. Ne perdez pas de temps à réaliser une interface graphique conviviale : des programmes recevant et affichant les instances du problème sous forme de simples fichiers texte sont tout-à-fait acceptables pour ce projet. 3 Rapport Votre rapport devra inclure : 1. le contenu (éventuellement mis à jour) de votre pré-rapport ; 2. la traduction en logique propositionnelle de l’énoncé des différents problèmes traités ; 3. une présentation (informelle) de votre solveur illustrée par l’analyse d’exemples pertinents ; 4. une présentation des deux programmes « interface » du gros problème que vous aurez traité ; 5. éventuellement, vos expérimentations sur les valeurs de MAX_ITERATION et de P et/ou l’étude comparative des différentes méthodes de choix de la variable que vous aurez programmées. 4 Soutenance La soutenance est OBLIGATOIRE (sauf pour les dispenses officielles). Toute absence injustifiée conduira le jury à délivrer la note de 0 au projet pour le candidat absent. Lors de votre soutenance, vous exécuterez vos programmes sur une machine personnelle ou une machine de l’université. Chaque membre du projet devra intervenir équitablement pendant la soutenance. Il faudra présenter le sujet du projet, mais aussi de donner une démonstration de vos programmes sur machine. 5 Exemple pour le problème des pigeons Nous illustrons par un exemple simple le minimum que nous attendons des étudiants pour le projet de INF242. 5.1 Enoncé informel Un colombophile possède n nids et p pigeons. Il souhaite que : – chaque pigeon soit dans un nid, – il y ait au plus un pigeon par nid. 5.2 Modélisation en ensemble de clauses La variable booléenne xi,j représente le fait que le pigeon i est dans le nid j. Par exemple, pour un ensemble de pigeons {a, b, c} et un ensemble de nids {1, 2, 3, 4}, nous devons donner au SAT-solveur l’ensemble de clauses suivant : – Chaque pigeon est dans un nid : – xa,1 ∨ xa,2 ∨ xa,3 ∨ xa,4 , – xb,1 ∨ xb,2 ∨ xb,3 ∨ xb,4 , – xc,1 ∨ xc,2 ∨ xc,3 ∨ xc,4 , – Chaque nid contient au plus un pigeon : – xa,1 ∨ xb,1 , xa,1 ∨ xc,1 , xb,1 ∨ xc,1 – xa,2 ∨ xb,2 , xa,2 ∨ xc,2 , xb,2 ∨ xc,2 , – xa,3 ∨ xb,3 , xa,3 ∨ xc,3 , xb,3 ∨ xc,3 , – xa,4 ∨ xb,4 , xa,4 ∨ xc,4 , xb,4 ∨ xc,4 . 5.3 Transformation en fichier DIMACS et résolution par un SATsolveur Le premier programme « interface » doit demander à l’utilisateur de donner le nombre de nids n et le nombre de pigeons p, puis doit générer le fichier DIMACS codant les contraintes relatives au problème de n nids et p pigeons. Si n ≥ p alors votre WalkSat trouvera une assignation modèle. Votre second programme « interface » devra alors afficher dans quel nid l’assignation à affecter chaque pigeon. Ainsi nous saurons comment placer les pigeons ! Nous remarquons qu’il nous est facile de trouver une solution à ce problème alors que l’ordinateur doit résoudre un nombre de contraintes exponentielles.