INFO-F-302 : Logique informatique Projet : Le Jeu ABCPath et Utilisation d un Solveur SAT

Documents pareils
Cours de Master Recherche

Plus courts chemins, programmation dynamique

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Manuel : Comment faire sa newsletter

Projet INF242. Stéphane Devismes & Benjamin Wack. Pour ce projet les étudiants doivent former des groupes de 3 ou 4 étudiants.

Systèmes décisionnels et programmation avancée

Chapitre 2. Eléments pour comprendre un énoncé

Logiciel de Base. I. Représentation des nombres

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

Algorithmique et Programmation, IMA

21 mars Simulations et Méthodes de Monte Carlo. DADI Charles-Abner. Objectifs et intérêt de ce T.E.R. Générer l'aléatoire.

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Model checking temporisé

Jean-Philippe Préaux

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

Limites finies en un point

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

La NP-complétude. Johanne Cohen. PRISM/CNRS, Versailles, France.

OCL - Object Constraint Language

Compression Compression par dictionnaires

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Le langage C. Séance n 4

Intelligence Artificielle Planification

TRIGONOMETRIE Algorithme : mesure principale

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Cours d initiation à la programmation en C++ Johann Cuenin

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

I. Introduction aux fonctions : les fonctions standards

Module 16 : Les fonctions de recherche et de référence

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Algorithme. Table des matières

Solutions du chapitre 4

Propagation sur réseau statique et dynamique

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Algorithmique et programmation : les bases (VBA) Corrigé

Architecture des Systèmes d Information Architecture des Systèmes d Information

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Objets Combinatoires élementaires

Ecran principal à l ouverture du logiciel

Encryptions, compression et partitionnement des données

INTRODUCTION A JAVA. Fichier en langage machine Exécutable


Licence Sciences et Technologies Examen janvier 2010

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

TP3 : Manipulation et implantation de systèmes de fichiers 1

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

V- Manipulations de nombres en binaire

(Mis à jour : 7 déc. 12)

SOMMAIRE GUIDE D UTILISATION DU WEBMAIL. vous guide

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Direction générale statistique et information économique. Manuel d usage : l application web pour l enquête sur la structure des entreprises

Exercice : la frontière des portefeuilles optimaux sans actif certain

R01 Import de données

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Perl Orienté Objet BioPerl There is more than one way to do it

Support de TD ArcGIS Introduction à l automatisation et au développement avec ArcGIS 10.1 JEAN-MARC GILLIOT e année ingénieur

Le théorème de Perron-Frobenius, les chaines de Markov et un célèbre moteur de recherche

Quelques éléments de compilation en C et makefiles

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Représentation d un entier en base b

Vision industrielle et télédétection - Détection d ellipses. Guillaume Martinez 17 décembre 2007

Souad EL Bernoussi. Groupe d Analyse Numérique et Optimisation Rabat http ://

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

Les arbres binaires de recherche

Comment automatiser la création d index multiples avec Word Paul-Henri Dumas - URFIST

TP 1. Prise en main du langage Python

L ALGORITHMIQUE. Algorithme

Bernard Lecomte. Débuter avec HTML

Logique : ENSIIE 1A - contrôle final

Rallye Mathématiques de liaison 3 ème /2 nde et 3 ème /2 nde pro Epreuve finale Jeudi 21 mai 2015 Durée : 1h45

La programmation linéaire : une introduction. Qu est-ce qu un programme linéaire? Terminologie. Écriture mathématique

Saisissez le login et le mot de passe (attention aux minuscules et majuscules) qui vous ont

Programmation C++ (débutant)/instructions for, while et do...while

Exercices Corrigés Premières notions sur les espaces vectoriels

SOMMAIRE AIDE À LA CRÉATION D UN INDEX SOUS WORD. Service général des publications Université Lumière Lyon 2 Janvier 2007

La classification automatique de données quantitatives

FONCTIONS DE PLUSIEURS VARIABLES (Outils Mathématiques 4)

Cours de Systèmes d Exploitation

1 Recherche en table par balayage

Feuille TD n 1 Exercices d algorithmique éléments de correction

Spip 2. Premiers pas pour créer son site web. Anne-Laure Quatravaux Dominique Quatravaux. Avec la contribution de Sandrine Burriel

Recherche dans un tableau

LES MOTEURS DE RECHERCHE SUR INTERNET

Résolution de systèmes linéaires par des méthodes directes

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

Inscriptions en ligne

Séance d ED n 5 : HTML et JavaScript

chapitre 4 Nombres de Catalan

Exemples de problèmes et d applications. INF6953 Exemples de problèmes 1

A l aide de votre vous pouvez visiter un site web!

Cours Informatique Master STEP

Cours d Analyse. Fonctions de plusieurs variables

Conventions d écriture et outils de mise au point

Algorithmes de recherche

Simulation de variables aléatoires

Cours d algorithmique pour la classe de 2nde

Transcription:

UNIVERSITE LIBRE DE BRUXELLES INFO-F-302 : Logique informatique Projet : Le Jeu ABCPath et Utilisation d un Solveur SAT L objectif de ce projet est de modéliser plusieurs problèmes en logique propositionnelle autour du jeu ABCPath, et de résoudre ces problèmes à l aide du solveur SAT MiniSat. 1 Le Jeu ABCPath Une instance du jeu ABCPath est donnée par une grille 7x7 : B C D W J N F R A - - - - X S - - - - - V U - - - - - O G - - - - - I M - - - - - E T Y H K Q P L Nous appellerons contour la partie extérieure de la grille, c est-à-dire celle où apparaissent les lettres B,C,D,W,J,N,F,X,V,etc... Nous appellerons intérieur le reste de la grille, c est-à-dire le carré 5x5 se trouvant au milieu. L objectif est de remplir l intérieur de cette grille avec les lettres A jusque Y avec les contraintes suivantes (la position du A est toujours donnée) : 1. chaque lettre n apparaît qu une seule fois à l intérieur ; 2. pour toute lettre α qui n est pas Y, la lettre suivante dans l ordre alphabétique apparaît dans le voisinage direct de α. Autrement dit, si (i, j) est la position de α, la lettre suivante se trouve en position (i + d, j + e) pour un certain couple (d, e) { 1, 0, 1} { 1, 0, 1} ; 3. pour chaque lettre du contour, une lettre de la colonne / ligne / diagonale correspondante doit apparaître dans l intérieur de la grille. Par exemple, le C doit apparaître dans la première colonne de l intérieur, le S dans la deuxième ligne de l intérieur, le K dans la troisième colonne dans l intérieur, le B dans la diagonale de l intérieur qui commence en haut à gauche, etc... Voici une solution pour cette grille : B C D W J N F R A X W Q R X S Y B V S P V U C H T U O O G G D I L N I M F E K J M E T Y H K Q P L Vous pouvez vous entrainer à résoudre des grilles à l adresse suivante : http://www.brainbashers.com/abcpath.asp Dans ce projet, il vous sera demandé de résoudre des grilles à l aide d un solveur SAT, de tester l unicité d une solution, de générer des grilles, avec au moins deux solutions ou avec solution unique, tout cela pour des grilles de tailles variables : 7x7, 8x8 ou 9x9.

On peut en effet généraliser le problème à des grilles de taille plus grande, on aura alors besoin de plus de lettres. Nous utiliserons les lettres minuscules a,b,c,etc... qui seront triées dans l ordre suivant : A,B,...,Y,Z,a,b,...,z. Par exemple, pour une grille 8x8, la grille intérieure aura une taille 6x6, donc on prendra les 36 lettres dans l intervalle [A,j], et les contraintes de contour seront elles aussi exprimées avec des lettres de l intervalle [A,j]. Voici par exemple une grille 8x8 : F H d K L M S O J - - - - - A E D - - - - - - B G - - - - - - C R - - - - - - P Y - - - - - - U e - - - - - - g a I b Z X W T Q et une solution : F H d K L M S O J I J E L M A E D H F K D N B B G G b j O C S C R c i a P R T P Y h d Z Y Q U U e g f e X W V g a I b Z X W T Q 2 Le Solveur SAT MiniSat Le solveur SAT MiniSat prend en entrée une formule de logique propositionnelle en forme normale conjonctive, en teste la satisfiabilité et retourne une valuation qui satisfait la formule dans le cas où elle est satisfaisable. Dans ce projet, nous vous laissons le choix de l utilisation de MiniSat : vous pouvez soit programmer dans le langage de votre choix et faire des appels à MiniSat via son système d entrées/sorties, soit programmer en C++ et utiliser directement la bibliothèque C++ MiniSat que nous vous fournissons. Dans le premier cas, vous devrez installer MiniSat vous même à partir de l adresse suivante : http://minisat.se/minisat.html. MiniSat prend des fichiers au format Dimacs expliqué ici : http://logic.pdmi.ras.ru/ basolver/dimacs.html Si vous utilisez la biblithèque MiniSat que nous vous fournissons, vous pouvez repartir du code utilisé pour la résolution du problème Sudoku, disponible à l adresse suivante : http://www.ulb.ac.be/di/info-f-302/index.html Dans cette bibliothèque, chaque variable propositionnelle est représentée par un entier. Pour créer une clause, il faut créer une liste de litéraux. Voici un exemple de code qui crée la formule (p 0 p 1 ) ( p 0 p 2 ) et affiche une valuation si la formule est satisfaisable. La variable p i est représentée par l entier i pour tout i {0, 1, 2}. #include "Solver.hpp" // déclaration d un solveur MiniSat // ajout de trois variables for (int i = 0 ; i <= 2 ; i++) { s.newvar() ; }

// déclaration d un vecteur de litéraux vec<lit> lits; // clause p0 or (not p1) lits.push(lit(0)) ; // ajout du litéral 0 lits.push(~lit(1)) ; // ajout du litéral (non 1) s.addclause(lits) ; // ajout de la clause // clause (not p0) or p2 lits.clear(); // réinitialisation du vecteur de clauses lits.push(~lit(0)) ; // ajout du litéral (non 0) lits.push(lit(2)) ; // ajout du litéral 2 s.addclause(lits) ; // ajout de la clause if (s.solve()) // résolution par MiniSat { // la formule est satisfaisable cout << "La formule est satisfaisable avec la valuation où\n" ; for (int i = 0 ; i <= 2 ; i++) { // récupération de la valuation if (s.model[i] == l_true) cout << "la variable " << i << " est mise à vraie\n"; else cout << "la variable " << i << " est mise à faux\n"; } else cout << "La formule n est pas satisfaisable\n" ; Si votre clause ne contient qu un seul litéral, vous pouvez utiliser la méthode addunit(), par exemple, addunit(lit(0)). Si elle ne contient que deux litéraux, vous pouvez utiliser par exemple addbinary(lit(0), Lit(2)). 3 Questions Dans toutes ces questions, vous pouvez vous contenter de ne considérer que des grilles de taille 5x5. Si votre programme prend en plus la taille de la grille comme un paramètre défini par l utilisateur, il vous sera attribué un bonus. Toutefois, vous pouvez vous limiter à des grilles de taille 9x9 au plus. Attention, il se peut que les temps de calcul soient longs, jusqu à plusieurs minutes pour les grandes grilles, soyez patients. Question 1 (Résolution d une grille) Ecrire une procédure qui prend en entrée une grille au format texte de la section 1 et qui résout cette grille en utilisant MiniSat. Votre procédure devra donner la solution sous format texte comme dans la section 1. Votre procédure devra générer une instance du problème SAT telle que les valuations qui satisfont la formule (s il en existe) représentent des solutions de la grille. Expliquer comment vous coder le problème comme une instance du problème SAT (représentation de la grille, des lettres, des variables, formules générées, éventuellement expliquer comment vous mettez sous forme normale conjonctive). A l adresse http: // www. ulb. ac. be/ di/ info-f-302/ index. html vous trouverez un ensemble de grilles 7x7, 8x8 et 9x9 pour tester votre procédure. Question 2 (Génération de grilles) Ecrire une procédure qui génére une grille (c est-à-dire un contour et le placement de la lettre A de départ) telle que la grille générée a au moins une solution. Pour cette question, la contrainte est la suivante : une même lettre ne peut pas apparaître plus d une fois sur le contour, et le A n apparaît pas sur le contour (cette contrainte serait en effet inutile car la position du A est donnée au départ). Pour cette question, il ne s agit pas de générer aléatoirement des grilles et de tester si elles ont une solution. Comme pour la question 1, on vous demande de générer une instance du problème SAT telle que toute valuation qui satisfait l instance représente une grille qui possède au moins une solution. Comme pour la question 1, expliquez votre codage du problème en logique propositionnelle. Vous pourrez tester votre procédure en utilisant la procédure de la question 1 pour résoudre les grilles que vous générez.

Etendre votre procédure pour qu elle génère n grilles différentes (n étant donné en paramètre par l utilisateur). Expliquez comment vous procéder. Pour accélérer votre programme lors de la génération de n grilles, vous pouvez utiliser l incrémentalité de MiniSat. Par exemple, si vous ajoutez des clauses supplémentaires à une formule, au lieu de déclarer un nouveau solveur, vous pouvez relancer le solveur précédent avec la nouvelle formule. MiniSat réutilise en effet les résultats précédents pour la résolution de la nouvelle formule. Par exemple, le programme suivant : createclauses1(s); Solver s ; createclauses1(s ); createclauses2(s ); s.solve(); où les procédures createclauses1 et createclauses2 générent un ensemble de clauses et l ajoute au solveur, peut être optimisé en : createclauses1(s); createclauses2(s); Notez que cette fonctionnalité ne peut être utilisée que si vous utilisez les sources de MiniSat. Question 3 (Unicité de la solution) Ecrire une procédure qui résout une grille comme dans la question 1 et qui teste si la solution est unique via une instance de SAT. Si la solution n est pas unique, votre procédure devra sortir une deuxième solution. Attention, n oubliez pas que la lettre A est toujours donnée au départ et ne peut donc pas être déplacée. Expliquez comment vous procéder, en particulier, expliquez quelles formules vous générez. Vous pouvez tester votre procédure sur les exemples qu on vous a donnés, dans les répertoires unique pour les grilles avec solution unique, et les répertoires notunique pour les grilles avec au moins deux solutions, pour des grilles de taille 7x7 et 8x8. Pour la question suivante, on pourra se limiter à des grilles de taille 8x8 au plus. Question 4 (Bonus 1 : Génération de grilles avec au moins deux solutions) Ecrire une procédure qui génére n grilles différentes (n étant donné en entrée) telle que chaque grille a au moins deux solutions. On ne vous demande pas ici de procéder en deux étapes : générer une grille et tester si la solution est unique, recommencer sinon, jusqu à temps que n grilles soient trouvées. On vous demande plutôt de procéder en une seule étape : générer une seule instance de SAT telle que les valuations qui satisfont cette instance représentent des grilles avec au moins deux solutions. Pour la question précédente, vous aurez peut-être besoin d utiliser l astuce suivante pour mettre une formule sous forme normale conjonctive, en ajoutant des variables. Prenons par exemple la formule suivante : k=1 l i,j,k où pour tout i {1,..., n 1 }, j {1,..., n 2 }, k {1,..., n 3 }, l i,j,k est un litéral. Pour mettre cette formule en forme normale conjonctive, vous pouvez distribuer la disjonction au risque de créer une formule exponentiellement plus grande, ou utiliser l astuce suivante : pour

tout i, j, ajouter la variable y i,j et transformer la formule comme ceci : ( y i,j ) ( (y i,j k=1 l i,j,k )) Cette formule peut facilement être mise sous forme normale conjonctive : ( y i,j ) ( k=1 ( y i,j l i,j,k )) ( n 3 y i,j ( l i,j,k )) Il est donc possible, en introduisant de nouvelles variables, de mettre en forme normale conjonctive une formule en évitant l explosion combinatoire. Si on applique cette astuce à la formule suivante (a b a c) ( a b d), on obtient en première étape la formule : (y 1 y 2 ) (y 3 y 4 ) (y 1 a b) (y 2 a c) (y 3 a b) (y 4 d) Chaque double équivalence peut facilement être mise sous forme normale conjontive, et la formule devient : (y 1 y 2 ) (y 3 y 4 ) ( y 1 a) ( y 1 b) (y 1 a b) ( y 2 a) ( y 2 c) (y 2 a c) ( y 3 a) ( y 3 b) (y 3 a b) (y 4 d) ( y 4 d) Toute valuation qui satisfait cette dernière formule satisfait aussi la formule d origine. Réciproquement, toute valuation ν de la formule d origine (donc des variables a, b, c, d) peut être transformée en une valuation β qui satisfait la nouvelle formule de la manière suivante : β(a) = ν(a), β(b) = ν(b), β(c) = ν(c), β(d) = ν(d) et β(y 1 ) = ν(a) ν(b), β(y 2 ) = ν(a) ν(c), β(y 3 ) = ν(a) ν(b), et β(y 4 ) = ν(d). Pour la question suivante on pourra se limiter aux grilles de taille 7x7, mais si vous êtes capables d y répondre pour des grilles plus grande, c est un plus. k=1 Question 5 (Bonus 2 : Génération de grilles avec solution unique) En vous aidant du solveur MiniSat, écrire un algorithme qui génère n grilles telles que pour chaque grille, la solution est unique. Pour cette question il n est pas demandé de résoudre le problème directement par n appels à MiniSat, mais il faut vous aider de MiniSat. Conseil : observez les raisons pour lesquelles une solution n est pas unique, et essayez d interdire certains motifs lors de la génération des grilles. Modalités Le projet se fait en binôme, il est à rendre au bureau de Maryka Peetroons pour le 8 Mai 16h. Il doit comprendre un rapport papier qui répond aux questions et explique la manière dont vous codez les différents problèmes commme des instances de SAT. Il vous est demandé de rendre les sources de votre programme, avec un manuel d installation / utilisation. Pour la génération de grilles, on vous demande de donner dans un fichier 5 grilles générées pour chaque taille, 7x7, 8x8 et 9x9. Les grilles seront au format texte comme dans la section 1, séparées par une ligne vide. Vous devez donc rendre trois fichiers pour la question 2 (chacun avec 5 grilles), deux fichiers pour la question 4 (car on se limite aux grilles de taille 8x8 au plus), et un fichier pour la question 5 (on se limite aux grilles de taille 7x7). Le tout (rapport, grilles générées et sources) devra être rendu dans un dossier compressé dont le nom portera les deux noms de famille du binôme, et envoyé à l adresse efiliot@ulb.ac.be avec pour objet Projet Logique : nom de famille1-nom de famille2. Le fichier est à envoyer pour la même date que la version papier.