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.