DM: Résolution automatique d`une grille de Sudoku - e-phyz

Transcription

DM: Résolution automatique d`une grille de Sudoku - e-phyz
DM: Résolution automatique d’une grille de Sudoku
1
L’objectif de ce problème est de mettre en oeuvre un programme permettant de résoudre automatiquement
une grille de Sudoku.
Document 1 : Règles du jeu
Le Sudoku, actualisé par Wayne Gould est un jeu subtil, de logique, de mémoire et d’observation. Ce jeu
s’adresse à tous, petits et grands. Les règles sont très simples mais remplir sans erreur une grille de Sudoku
peut être,pour certaines grilles, très difficile.
Principe : Il s’agit de compléter une grille de 9 cases sur 9 cases, subdivisée en 9 carrés appelés régions,
avec des chiffres allant de 1 à 9.
◮ Chaque chiffre ne doit apparaitre qu’une seule fois dans chaque ligne,
◮ Chaque chiffre ne doit apparaitre qu’une seule fois dans chaque colonne,
◮ Chaque chiffre ne doit apparaitre qu’une seule fois dans chaque région.
Quelques chiffres sont déjà placés correctement dans la grille. Le joueur doit placer les autres chiffres.
Plusieurs niveaux de difficultés sont proposés. Une grille doit toujours posséder une solution logique pour
être proposée au public.
Document 2 : Histoire du Sudoku
Le nom Sudoku est né de l’abréviation de la règle du jeu japonaise ≪ Suji wa dokushin ni kagiru ≫ signifiant
littéralement ≪ Chiffre limité à un seul ≫ (sous entendu par case et par ligne). Cette abréviation associe
les caractères Su (chiffre) et Doku (unique). Ce nom est une marque déposée au Japon de l’éditeur Nikoli
Corporation Ltd.. Au Japon, Nikoli est toujours propriétaire du nom Sudoku ; ses concurrents utilisent
donc un autre nom : ils peuvent renvoyer au jeu par le nom américain original ≪ Number Place ≫ , ou encore
par le mot ≪ Nampure ≫, plus court. Quelques éditeurs non japonais orthographient le titre ≪ Su Doku ≫.
Ce jeu est tout d’abord probablement inspiré par le carré magique, connu des mathématiciens chinois, à
partir de -650 sous le nom Luoshu
Ce sont vraisemblablement les indiens, inventeurs des chiffres arabes, qui les limitèrent à des chiffres.
Le mathématicien français Claude-Gaspard Bachet de Méziriac décrit une méthode pour résoudre le
problème du carré magique en prenant pour exemple un caviste qui veut ranger des bouteilles dans un
casier 3 × 3, dans ses ≪ Problèmes plaisants et délectables qui se font par les nombres ≫, publié en 16122.
Le mathématicien suisse, Leonhard Euler (1707 - 1783), crée ou au moins cite le ≪ Carré latin ≫, tableau
carré de n lignes et n colonnes remplies de n éléments distincts dont chaque ligne et chaque colonne ne
contient qu’un seul exemplaire.
En 1892, en France, dans le quotidien monarchiste ≪ Le Siècle ≫, apparaı̂t la plus ancienne grille connue
de Sudoku.
Document 3 : Exemple de grille de Sudoku et son paramétrage
Afin de repérer une case dans la grille on utilise ses coordonnées i et j définies ci-dessous et en commençant
par 0 sous Python. Une région est, elle, définie par ses coordonnées a et b également définies ci-dessous.
DM: Résolution automatique d’une grille de Sudoku
2
1. Quel(s) chiffre(s) peu(ven)t convenir pour la case de coordonnées (0, 0) de la grille du document 3 ?
Dans ce problème une grille de Sudoku sera décrite par une matrice de type ≪ list ≫. Les cases vides seront initialement
remplies par des 0.
2. Ecrire la ligne de commande permettant de définir en Python la matrice grille qui correspond à la grille du
document 3 dans son état initial.
3. Que doit renvoyer la commande grille[1][3] ?
Pour pouvoir jouer, on réalise la fonction suivante :
1
2
3
4
5
6
7
8
def cv (M) :
”””Que p e u t b i e n f a i r e c e t t e f o n c t i o n ? ”””
vide =[]
for i in range ( 9 ) :
for j in range ( 9 ) :
i f M[ i ] [ j ]==0:
v i d e=v i d e + [ [ i , j ] ]
return v i d e
4. Quel est le rôle de la fonction cv(M) ?
Après avoir défini la matrice grille dans la question 2, on écrit la commande liste cv=cv(grille).
5. Donner le contenu de liste cv.
6. Que renverra l’interpréteur si on lui demande le contenu de vide ?
Il faut maintenant apprendre à notre programme les règles du jeu en détails.
7. Ecrire une fonction test ligne(chiffre,i,j,M) qui renvoie
— True si mettre chiffre dans la case de coordonnées (i, j) dans la matrice M respecte la condition d’unicité
sur la ligne i,
— False sinon.
8. Ecrire une fonction test colonne(chiffre,i,j,M) qui renvoie
— True si mettre chiffre dans la case de coordonnées (i, j) dans la matrice M respecte la condition d’unicité
sur la colonne j,
— False sinon.
9. En utilisant les propriétés de la division euclidienne, écrire une fonction region(i,j) qui renvoie la liste [a, b]
donnant les coordonnées de la région dans laquelle se trouve la case de coordonnées (i, j)
10. A partir de la fonction précédente, écrire une fonction test region(chiffre,i,j,M) qui renvoie
— True si mettre chiffre dans la case de coordonnées (i, j) dans la matrice M respecte la condition d’unicité
sur la région,
— False sinon.
11. A partir des fonctions précédentes, mettre en oeuvre une fonction test(chiffre,i,j,M) qui renvoie
— True si mettre chiffre dans la case de coordonnées (i, j) dans la matrice M respecte toutes les conditions
d’unicité
— False sinon.
Pour résoudre une grille de Sudoku, on peut employer diverses méthodes. L’une des plus simples à coder, même si
ce n’est pas la plus rapide, est la méthode du ≪ backtracking ≫.
DM: Résolution automatique d’une grille de Sudoku
3
Document 4 : Principe du backtracking appliqué au Sudoku
Les cases vides sont d’abord identifiées. On teste alors la première case vide en lui attribuant la valeur 1.
Si cette valeur respecte les conditions d’unicité, alors on teste la case vide suivante. Sinon on incrémente
la valeur de la case vide testée de 1 en 1 jusqu’à trouver une valeur qui convienne avant de passer à la
case vide suivante. Si aucune valeur ne convient pour une case testée, cela signifie qu’une valeur attribuée
précédemment n’est finalement pas la bonne. Il est alors nécessaire de revenir en arrière et d’augmenter le
chiffre de la case vide précédente. Ce retour en arrière a lieu autant de fois qu’il subsiste une incompatibilité
concernant le choix d’un chiffre.
Les algorithmes mettant en oeuvre une méthode de backtracking sont généralement codés de manière
récursive. Dans le cas de la grille de Sudoku :
— On identifie les case vides,
— s’il n’y a pas de case vide, alors la grille est remplie et on l’affiche,
— sinon on examine la première case vide, et on attribue à cette case la première valeur possible. (alors
elle n’est plus vide, ou plus exactement pour nous ici, elle ne vaut plus 0)
— On applique le même procédé à la grille ainsi partiellement (et provisoirement) complétée.
— Si aucun incompatibilité n’a été décelé (on a de la chance on a toujours choisi la bonne valeur) alors
le procédé se répète tant qu’il y a des cases vides,
— Si, au cours du remplissage, une incompatibilité apparait, on revient en arrière en ≪ vidant ≫ la
dernière case remplie et en choisissant une valeur plus élevée compatible. S’il n’y en a pas on retourne
en arrière autant de fois que nécessaire.
12. Ecrire la fonction sudoku(M) qui retourne la grille M remplie ou False si la grille n’a pas de solution.
13. Résoudre la grille donnée en document 3.
14. Importer les modules math et time.
15. Réaliser une commande qui mesure la durée de la résolution de la grille donnée en document 3.
16. A l’aide d’une fonction stat(liste num), déterminer la durée moyenne de calcul ainsi que l’incertitude (coefficient d’élargissement égal à 2) sur la durée mesurée pour une liste de 100 mesures . Ecrire le résultat sous une
forme standardisée.

Documents pareils