Généralités. Principe de résolution et fonctions de base. Lycée Carnot MP* PROJET BACKTRACKING 1 : RÉSOLUTION DE SUDOKU

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

Bien lire l énoncé 2 fois avant de continuer - Méthodes et/ou Explications Réponses. Antécédents d un nombre par une fonction

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

1 Recherche en table par balayage

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

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

Aide - mémoire gnuplot 4.0

Baccalauréat ES Polynésie (spécialité) 10 septembre 2014 Corrigé

TP 1. Prise en main du langage Python

L exclusion mutuelle distribuée

Fiche de version 12.16a - Septembre Gestion des Plans d actions personnalisés (PAP)... 6

Licence Sciences et Technologies Examen janvier 2010

Probabilités Loi binomiale Exercices corrigés

Python - introduction à la programmation et calcul scientifique

Programmation linéaire

Resolution limit in community detection

Baccalauréat ES/L Amérique du Sud 21 novembre 2013

Groupes et utilisateurs locaux avec Windows XP

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Cours 7 : Utilisation de modules sous python

Correction du baccalauréat ES/L Métropole 20 juin 2014

Business Talk IP Centrex. guide. web utilisateur. pour. les services standards

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

MIS 102 Initiation à l Informatique

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Soit la fonction affine qui, pour représentant le nombre de mois écoulés, renvoie la somme économisée.

Chap III : Les tableaux

Débuter avec Easyweb B

Cours 1 : Qu est-ce que la programmation?

Baccalauréat ES/L Métropole La Réunion 13 septembre 2013 Corrigé

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

Introduction à MATLAB R

Capacité d un canal Second Théorème de Shannon. Théorie de l information 1/34

Programmation Par Contraintes

Eteindre. les. lumières MATH EN JEAN Mme BACHOC. Elèves de seconde, première et terminale scientifiques :

Introduction à la théorie des graphes. Solutions des exercices

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Plus courts chemins, programmation dynamique

STAGE IREM 0- Premiers pas en Python

Technique opératoire de la division (1)

LE PROBLEME DU PLUS COURT CHEMIN

TS 35 Numériser. Activité introductive - Exercice et démarche expérimentale en fin d activité Notions et contenus du programme de Terminale S

Par combien de zéros se termine N!?

Présentation du langage et premières fonctions

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

4 Exemples de problèmes MapReduce incrémentaux

Exe Livret Animateur_Exe Livret Animateur 01/02/11 11:10 Page1

Les nombres entiers. Durée suggérée: 3 semaines

Gestion d'une billeterie défilé des talents

Apple Watch Guide de l utilisateur. Version 1.0

Créer et modifier un fichier d'importation SAU avec Excel

Conventions d écriture et outils de mise au point

Le langage C. Séance n 4

OLYMPIADES ACADEMIQUES DE MATHEMATIQUES. 15 mars 2006 CLASSE DE PREMIERE ES, GMF

Manuel Utilisateur. Module CAISSE

Programmation parallèle et distribuée (Master 1 Info )

Objectifs du cours d aujourd hui. Informatique II : Cours d introduction à l informatique et à la programmation objet. Complexité d un problème (2)

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

Logiciel de gestion pour restaurants et Bars

CARPE. Documentation Informatique S E T R A. Version Août CARPE (Documentation Informatique) 1

Découverte de Python

«Dire et écrire» pour réaliser une composition en travail collaboratif en géographie. Agnès Dullin, lycée J. Racine 20 rue du Rocher, Paris

Probabilités stationnaires d une chaîne de Markov sur TI-nspire Louis Parent, ing., MBA École de technologie supérieure, Montréal, Québec 1

Petit lexique de calcul à l usage des élèves de sixième et de cinquième par M. PARCABE, professeur au collège Alain FOURNIER de BORDEAUX, mars 2007

Cryptographie et fonctions à sens unique

Algorithmique avec Algobox

Université Paris-Dauphine DUMI2E 1ère année, Applications

Groupe symétrique. Chapitre II. 1 Définitions et généralités

Puissances d un nombre relatif

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

UNE EXPERIENCE, EN COURS PREPARATOIRE, POUR FAIRE ORGANISER DE L INFORMATION EN TABLEAU

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

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

TP : Gestion d une image au format PGM

CREATION D UNE EVALUATION AVEC JADE par Patrick RUER (

Informatique et sciences du numérique

Probabilités. I Petits rappels sur le vocabulaire des ensembles 2 I.1 Définitions... 2 I.2 Propriétés... 2

Rappels sur les suites - Algorithme

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

pyensae StockPrices September 1, Manipulation de séries financières avec la classe StockPrices

avec des nombres entiers

GESTION DE STOCKS AVEC CIEL GESTION COMMERCIALE

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

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)

C f tracée ci- contre est la représentation graphique d une

Choisir le mode d envoi souhaité. Option 1 : Envoyer un SMS à un nombre réduit de numéros (0 10 )

Représentation d un entier en base b

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

Programmation par contraintes. Laurent Beaudou

FOCUS Evolution. Lisez-Moi. Version FE 7.0.t

Baccalauréat ES Pondichéry 7 avril 2014 Corrigé

Entraînement au concours ACM-ICPC

Synthèse «Le Plus Grand Produit»

Chapitre 6. Fonction réelle d une variable réelle

Raisonnement probabiliste

Introduction aux SGBDR

Techniques d interaction dans la visualisation de l information Séminaire DIVA

Eclairage. 3 Dimmer 5Kw

Transcription:

MP* PROJET BACKTRACKING 1 : RÉSOLUTION DE SUDOKU Lycée Carnot Le but du projet de résoudre des grilles de sudoku. Les différentes parties peuvent être traitées par différentes personnes, puis le mis en commun par la suite. Généralités Une grille de sudoku sera représentée par une liste de neuf listes python. Chaque sous-liste représentera les cœfficient situés sur une ligne. Les cœfficients inconnus seront codés par l entier 0. Par exemple, la grille suivante, sera codée par la liste de listes : 3 2 6 9 3 5 1 1 8 6 4 8 1 2 9 7 8 6 7 8 2 2 6 9 5 8 2 3 9 5 1 3 grille = [[0, 0, 3, 0, 2, 0, 6, 0, 0], [9, 0, 0, 3, 0, 5, 0, 0, 1], [0, 0, 1, 8, 0, 6, 4, 0, 0], [0, 0, 8, 1, 0, 2, 9, 0, 0], [7, 0, 0, 0, 0, 0, 0, 0, 8], [0, 0, 6, 7, 0, 8, 2, 0, 0], [0, 0, 2, 6, 0, 9, 5, 0, 0], [8, 0, 0, 2, 0, 3, 0, 0, 9], [0, 0, 5, 0, 1, 0, 3, 0, 0]] Principe de résolution et fonctions de base On va résoudre informatiquement les sudokus en appliquant une méthode dite de backtracking. Le principe est le suivant : on va tester toutes les possibilités jusqu à en trouver une qui fonctionne. Lorsque l on se trouve dans une impasse (grille impossible), on revient en arrière (backtracking) et on teste une autre possibilité. La récursivité nous permettra de mettre ce procédé en pratique (assez) facilement. Le couple des coordonnées d un élément de la grille de sudoku étant un couple (i, j ) où i est le numéro de la ligne et j le numéro de la colonne, on obtient cet élément grâce à grille[i][j]. La grille est alors décomposée en 9 sous-carrés dont les éléments ont des coordonnées de la forme (i +3m, j +3n) où i et j varient entre 0 et 2 et où m et n sont fixés (pour un sous-carré) entre 0 et 2 également. 1. Créer une liste sous_carres contenant les 9 sous-listes contenant elles-mêmes les coordonnées (x, y) des éléments de chacun des 9 sous-carrés de la grille de sudoku. Il s agit donc d une liste de listes de couples. On pourra utiliser une liste en compréhension de la forme [[(, ) for in for in ] for in for in ] On obtiendra une numérotation des sous-carrés de la forme : 0 1 2 3 4 5 6 7 8 Projet Backtracking 1 : résolution de Sudoku - page 1

Par exemple, sous_carres[1] est la liste [(0,3),(0,4),(0,5),(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)] car le deuxième sous-carré contient dans les trois premières lignes, les éléments des colonnes 3, 4, 5. 2. Écrire une fonction quel_sous_carre(i,j) renvoyant, pour un couple d entiers (i, j ) 0,8 2 le numéro du (seul) sous-carré dans lequel il se trouve. Ce numéro s obtient très simplement à l aide de i et j et en utilisant la division entière //. 3. On appelle voisin de (i, j ) tout couple de coordonnées correspondant à une case, différente de (i, j ), se trouvant sur la même ligne, sur la même colonne ou dans le même sous-carré. Écrire une fonction voisins(i,j) qui renvoie la liste des voisins de (i, j ). On fera en particulier attention à ce que chaque couple apparaissent une et une seule fois. 4. En utilisant cette fonction construire une liste de listes voisinage telle que voisinage[i][j] soit la liste des voisins de (i, j ). Cette liste sera calculée une fois pour toutes, et pourra être utilisée telle quelle dans les algorithmes (variable globale). 5. Écrire une fonction valeurs(grille,i,j) renvoyant une liste vide si la case (i, j ) est déjà remplie, la liste des valeurs possible en position (i, j ) en fonction de ses voisins sinon. On pourra commencer par remplir un tableau de booléens permettant de savoir si oui ou non la valeur k est possible en (i, j ) pour chaque k entre 1 et 9 puis après le parcours des voisins, renvoyer la liste demandée. Une première version naïve 6. Écrire une fonction récursive remplir(grille,n) permettant de faire effectivement la résolution par backtracking en modifiant directement grille. n est le numéro (entre 0 et 81) de la prochaine case à remplir. Le fonction renverra True si la résolution est terminée, False si la grille est impossible. Pour cela, on propose d utiliser l algorithme suivant : Si n = 81, renvoyer Vrai, la résolution est terminée. Sinon, rechercher les coordonnées (i, j ) de la case à remplir correspondant au numéro n. Si elle est déjà remplie, remplir la suivante, renvoyer le résultat. Sinon pour chaque valeur v valide en (i, j ), Placer la valeur v en position (i, j ) dans la grille. Afficher la nouvelle valeur de la grille. Remplir la valeur n + 1 de la grille. Si la résolution a été possible, renvoyer Vrai : la résolution est terminée. Sinon, effacer le chiffre et passer à la valeur suivante. Si la résolution n a été possible pour aucune valeur v, alors réinitialiser la case (i, j ) à 0 et renvoyer Faux : c est une impasse (backtrack). Une version un peu plus efficace Naturellement, lorsque l on résout une grille, on commence par chercher des valeurs dans les emplacements pour lesquels la ligne, et la colonne et le sous-carré sont le plus remplis. On se propose de mettre en œuvre cette amélioration. L idée est que l on va manipuler et faire évoluer une liste de listes de listes de valeurs possibles dans chaque case de la grille. On désignera par liste_val cette liste de liste de listes. 1. Écrire une fonction nb_non_rempli(grille) renvoyant le nombre de case non remplies (de zéros, donc) dans la grille. Projet Backtracking 1 : résolution de Sudoku - page 2

2. Écrire une fonction min_non_rempli(liste_val) renvoyant, à partir d une liste de listes de listes de valeurs possibles, les coordonnées (imin,jmin) d une case non remplie (au moins une valeur possible) ayant un minimum de valeurs possibles. On suppose ici qu il y a au moins une valeur possible pour au moins une case de la grille. 3. Écrire une fonction supprime(l, v) renvoyant une copie de la liste L débarrassée de toute occurrence de v. 4. Écrire une fonction mise_a_jour(liste_val, i, j, v) prenant en argument une liste de listes de listes de valeurs possibles, des coordonnées (i, j ) et une valeur v (que l on veut placer en (i, j )) et renvoyant : une copie de liste_val (attention : copie de liste de liste de liste!) dans laquelle on aura vidé la liste des valeurs possibles en (i, j ) et supprimé toutes les apparitions de v dans les valeurs possibles pour ses voisins s il y a d autres valeurs possibles, la liste vide si l un des voisins de (i, j ) ne peut prendre que la valeur v initialement (ce qui correspondra à une impasse). 5. Écrire une fonction récursive resolution_mieux(grille, liste_val, n) prenant en argument une grille, la liste de listes de listes des valeurs possibles correspondante, et un entier n égal au nombre de cases non encore remplies dans la grille utilisant les fonctions précédentes pour résoudre (récursivement) le problème. Cette fois, c est une case ayant le minimum de valeurs possibles que l on tentera de remplir avec les différentes valeurs possibles données par liste_val, et pour chacune de ces valeurs en (i, j ), calculant une copie mise à jour de cette liste et rappelant récursivement la fonction si l on n est pas dans une impasse. De nouveau, on renverra vrai si la résolution est terminée, faux si elle n est pas possible (impasse). 6. Écrire enfin la fonction sudoku_mieux(grille). 7. Constater empiriquement un gain de facteur environ 20 (en moyenne) sur le temps d exécution. Affichage des grilles 1. Écrire une fonction affiche_txt(grille) permettant un affichage d une grille dans la console, sous la forme 3 2 6 9 3 5 1 1 8 6 4 8 1 2 9 7 8 6 7 8 2 2 6 9 5 8 2 3 9 5 1 3 2. On se propose de créer un affichage graphique des grilles à l aide de matplotlib (nommé plt dans ce qui suit), par exemple. On pourra aussi le faire directement avec Tkinter. 2.a) Écrire une fonction affiche_tout(grille) permettant d obtenir l affichage complet d une grille, avec quadrillage, de la forme : Projet Backtracking 1 : résolution de Sudoku - page 3

On pourra utiliser plt.axis, plt.plot pour les lignes, plt.text pour les chiffres. 2.b) Écrire une fonction affiche(v, i, j) permettant d afficher seulement la valeur v en position (i, j ) et renvoyant l objet correspondant à cet affichage (renvoyé par plt.text afin de pouvoir l effacer ultérieurement si nécessaire. Ou pourra utiliser plt.pause(...) pour forcer l affichage au cours de l exécution. 2.c) Écrire efface(chiffre) prenant en argument cet objet et l effaçant. Par exemple, chiffre = affiche(4, 0, 0) modifie l affichage en ajoutant le chiffre 4. Et efface(chiffre) permet de revenir à l état précédent. Lecture de grilles dans des fichiers 3. Écrire enfin une fonction sudoku(grille) qui affiche la grille initiale et effectue la résolution de celle-ci. 4. Écrire une fonction transforme(chaine) qui permet d obtenir une grille de sudoku (liste de listes) à partir d une chaîne de caractères de la forme ci-contre. (Utiliser la méthode split des chaînes de caractères.) 003020600 900305001 001806400 008102900 700000008 006708200 002609500 800203009 005010300 De nombreux exemples de grilles sont disponibles dans le problème 96 du project Euler : https://projecteuler.net/problem=96. Projet Backtracking 1 : résolution de Sudoku - page 4

Fonction de test Écrire une fonction teste(grille) permettant de tester si une grille de sudoku (pas nécessairement pleine) est cohérente. Project Euler Résoudre le problème 96 du Project Euler. On conseille de désactiver l affichage qui ralentit beaucoup la résolution. (Chez moi, cela prend une quinzaine de secondes avec la version naïve et moins d une seconde avec l algorithme amélioré ci-après.) Plusieurs solutions Modifier le code pour obtenir toutes les solutions possibles en cas de solutions multiples. Interface utilisateur Écrire une fonction permettant à un utilisateur de remplir de façon interactive une grille de sudoku. Création de grilles Proposer une fonction de création de grille. L idée pourra être de partir d une grille pleine aléatoire et d enlever des (le plus de?) chiffres en s assurant qu il existe une unique solution. Généralisation Proposer une généralisation des des sudoku qui ne sont pas de taille 9 9. Projet Backtracking 1 : résolution de Sudoku - page 5