A voir également:
- [c] mon solveur de sudoku
- Sudoku gratuit - Télécharger - Jeux vidéo
- Solveur mots entre amis ✓ - Forum jeux en ligne
- Solveur mastermind ✓ - Forum Programmation
- Mots entre amis - Forum jeux en ligne
- Sudoku en c - Forum C++
5 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
19 mai 2007 à 14:57
19 mai 2007 à 14:57
Hum bon en fait je ne vais pas te faire un cours de recherche opérationnelle mais le sudoku est un problème assez trivial de satisfaction de contrainte (problème CSP). Un CSP se définit par trois ensembles (X,D,C) :
- X : les variables : ici les nombres associés à chaque case, en gros ta matrice de sudoku. X = {X00,X01,...X09,X10,...,X19,....X99}
- D : les domaines de chaque variables. Les domaines des cases initialisées sont de taille 1 (la valeur de la case), les autres domaines étant {1,2,...,9}
- C : les contraintes, qui définissent les règles du sudoku (un seul nombre dans un carré de 9, dans une ligne, et dans une colonne). Ca donne des contraintes du genre :
Xi0 != Xi1 != ... != Xi9 pour tout i de 0 à 9
X0i != X1i != ... != X9i pour tout i de 0 à 9
X01 != X02 !=X03 != X10 != X12 != X13 !=X20 != X22 != X23 (idem pour les autres carrés)
Phase de présolve
A ce stade on peut réduire certains domaines grâce à tes contraintes. Par exemple si dans ma grille de départ j'ai un 2 qui est placé, je peux
- supprimer cette valeur de tous les domaines des variables associées à cette ligne
- supprimer cette valeur de tous les domaines des variables associées à cette colonne
- cette valeur de tous les domaines des variables associées à ce carré.
Ensuite tu marques cette case comme traitée et tu répètes la procédure pour toutes les cases ayant un domaine de taille 1 qui ne sont pas encore marquées. A ce stade il y aura pas mal de cases qui se seront remplies. Les cases "survivantes" seront celle ou un doute subsiste (noeud de branchement).
Phase de résolution
Là il y a deux possilibités, mais tu risques de devoir lire un peu de littérature sur la recherche opérationnelle.
1) Soit tu explores toutes les solutions restantes avec une procédure récursive (en effectuant les réductions de domaines à chaque itération) (Branch and Bound). C'est assez coûteux en terme de mémoire et de performance mais ca permet de trouver toutes les solutions admissibles ou de prouver qu'il n'en existe aucune. En particulier il faudra retenir les configurations des noeuds au cas ou une branche de l'arbre de recherche ne mène pas à une solution. Etant donné que ce sont de tout petits problèmes cette solution est envisageable.
2) Soit tu pars du principe qu'il en existe une et tu fais une méthode de recherche locale (genre un tabu search).
Bonne chance
- X : les variables : ici les nombres associés à chaque case, en gros ta matrice de sudoku. X = {X00,X01,...X09,X10,...,X19,....X99}
- D : les domaines de chaque variables. Les domaines des cases initialisées sont de taille 1 (la valeur de la case), les autres domaines étant {1,2,...,9}
- C : les contraintes, qui définissent les règles du sudoku (un seul nombre dans un carré de 9, dans une ligne, et dans une colonne). Ca donne des contraintes du genre :
Xi0 != Xi1 != ... != Xi9 pour tout i de 0 à 9
X0i != X1i != ... != X9i pour tout i de 0 à 9
X01 != X02 !=X03 != X10 != X12 != X13 !=X20 != X22 != X23 (idem pour les autres carrés)
Phase de présolve
A ce stade on peut réduire certains domaines grâce à tes contraintes. Par exemple si dans ma grille de départ j'ai un 2 qui est placé, je peux
- supprimer cette valeur de tous les domaines des variables associées à cette ligne
- supprimer cette valeur de tous les domaines des variables associées à cette colonne
- cette valeur de tous les domaines des variables associées à ce carré.
Ensuite tu marques cette case comme traitée et tu répètes la procédure pour toutes les cases ayant un domaine de taille 1 qui ne sont pas encore marquées. A ce stade il y aura pas mal de cases qui se seront remplies. Les cases "survivantes" seront celle ou un doute subsiste (noeud de branchement).
Phase de résolution
Là il y a deux possilibités, mais tu risques de devoir lire un peu de littérature sur la recherche opérationnelle.
1) Soit tu explores toutes les solutions restantes avec une procédure récursive (en effectuant les réductions de domaines à chaque itération) (Branch and Bound). C'est assez coûteux en terme de mémoire et de performance mais ca permet de trouver toutes les solutions admissibles ou de prouver qu'il n'en existe aucune. En particulier il faudra retenir les configurations des noeuds au cas ou une branche de l'arbre de recherche ne mène pas à une solution. Etant donné que ce sont de tout petits problèmes cette solution est envisageable.
2) Soit tu pars du principe qu'il en existe une et tu fais une méthode de recherche locale (genre un tabu search).
Bonne chance
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
19 mai 2007 à 18:14
19 mai 2007 à 18:14
Je pense que c'est plus simple avec du "backtracking", à savoir réunir l'ensemble de solutions possibles pour chaque case compte tenu des valeurs déjà définies pour les autres et revenir en arrière si ça ne va plus.
On part du principe que la première des solutions possibles pour la case courante est la bonne, on fait la même chose pour la suivante. Si pour la suivante on a pas de solution possible, alors on revient à la case précédente et on prend la solution possible suivante, s'il n'y en a pas non plus, on revient encore à la case précédente etc...
C'est à mon avis la manière la plus simple et la plus concise pour écrire un solveur de sudoku...
Et pour celà, il suffit d'un tableau à deux dimensions de 9x9. Ce qui permet de limiter les boucles imbriquées avec des for dans des for dans des for etc...
On part du principe que la première des solutions possibles pour la case courante est la bonne, on fait la même chose pour la suivante. Si pour la suivante on a pas de solution possible, alors on revient à la case précédente et on prend la solution possible suivante, s'il n'y en a pas non plus, on revient encore à la case précédente etc...
C'est à mon avis la manière la plus simple et la plus concise pour écrire un solveur de sudoku...
Et pour celà, il suffit d'un tableau à deux dimensions de 9x9. Ce qui permet de limiter les boucles imbriquées avec des for dans des for dans des for etc...
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
19 mai 2007 à 18:33
19 mai 2007 à 18:33
En même temps je dis ça aussi parce que j'avais de très mauvaises notes en recherche opérationnelle ;-)
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
20 mai 2007 à 03:02
20 mai 2007 à 03:02
Ca s'appelle un branch and bound ca kilian :) C'est la solution n°1 que j'ai donné en phase de résolution ;)
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
20 mai 2007 à 15:12
20 mai 2007 à 15:12
Oups :-s
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question