De tout le programme en C qui est fourni, la seule ligne que je trouve vraiment intéressante d'un point de vue algortihmique est celle de la procédure Resolve «... IF (! case_dispo_nbre(nbre,ligne,col)) continue;». En effet, c'est là que ce trouve le cerveau palpitant de l'algorithme.
Comme l'a dit un autre commentaire du forum, le maximum de combinaisons possibles sur une grille est 9!^9 soit en gros 10^50. Sur une machine qui permet d'en essayer 170.000 par secondes il faut 2x10^37 années de calcul pour les épuiser. On a vite compris que la seule chose à faire quand on écrit un programme de résolution de Sudoku est de trouver un moyen de limiter ce nombre. Tout ce qu'on pourra écrire à côté pour limiter le nombre d'appel à Resolve est à un coût nul par rapport au gain. Pour cette raison, le programme C présenté est beaucoup trop lent.
En gros, on a des cases à remplir et des chiffres à poser. Le plaisir du programmeur est de bien choisir la prochaine case à remplir et de bien choisir le prochain chiffre à y essayer. La règle absolue est de couper au maximum le nombre de branches de l'arborescence. Par conséquent on essaiera de prendre d'abord celles qui dés le départ ont le maximum de contraintes, c'est à dire le minimum de choix possibles. C'est ce qu'on appelle une heuristique. J'ai employé deux méthodes.
Mtéhode M1 - Choisir d'abord la case et ensuite le chiffre.
L'onglet sur les techniques de résolution donne une bonne mesure pour choisir la case. On maintient pour chaque case libre l'ensemble des chiffres qui ne peuvent pas s'y trouver (méthode d'inclusion décrite dans ce site) et on prend la case dont le nombre de chiffres possibles est le plus petit. A ce point, comme il y a parfois plusieurs minimums, je les trie en fonction du nombre décroissant de placement de ces chiffres. Ex : Dans une case qui peut recevoir (9, 2, 4) et qu'à ce moment on a déjà 7 fois le 2 sur la grille alors que le 9 et le 4 n'y sont que deux fois, on essayera d'abord de placer le 2.
A celà on ajoute des tests rapides de blocage futur. J'en ai trouvé deux . 1/ Lorsqu'on place le 8eme exemplaire d'un chiffre, il ne reste plus qu'une seule case pour placer le dernier. Au lieu d'attendre que la récursivité aille le visiter on peut d'emblée tester que la case correspondante est libre et économiser dans ce cas des années de calcul lorsqu'elle est occupée. 2/ Lorsqu'on place un chiffre dans une case il faut vérifier qu'il n'y a pas par ailleurs le cas précédent qui se présente. Sinon il y a un échec en perspective. Ce deuxième test s'apparente à la méthode d'exclusion décrite dans ce site.
Cette méthode est en général trés efficace. On trouve souvent la solution du premier coup, sans "backtracking". Pour la grille 7218 il faut 79 essais soit 27 de trop. Pour le Al Escargot il faut 2.844 essais.
Par contre elle est souvent trés mauvaise pour les grilles qui n'ont pas de solution.
Méthode M2 - Choisir d'abord le chiffre et ensuite la case.
Cette fois on essaye de placer les chiffres. On choisit le chiffre le plus utilisé ce qui limite les calculs futurs. On choisit ensuite la case comme précédemment.
Cette méthode est efficace pour trouver les cas d'insolvabilité. Par contre cette méthode est souvent 3,5 fois plus lente que M1 pour trouver une solution et elle échoue le plus souvent à trouver une solution en un temps raisonnable.
Je suis arrivé à la conclusion qu'un bon programme passe par l'exécution de deux processus sur M1 et M2. Le premier qui trouve ou prouve qu'il n'y a pas de solution arrête la partie. Visiblement le site utilise aussi deux méthodes distinctes pour les boutons «Solution de la grille» et «Vérifier/Solvabilité».
La grille suivante, qui n'a pas de solution, n'est pas résolue en moins de 5 minutes par le bouton «Solution de la grille», par contre elle est rapidement vérifiée.
120 000 000
000 210 000
000 000 021
200 000 010
000 021 000
001 000 002
012 000 000
000 102 000
000 000 100
---------------------
N'ayant pas écrit de programme de test du programme de résolution du Sudoku, l'appréciation que je fais du comportement des deux méthodes n'est pas trés scientifique. Est-ce que les auteurs de ce site connaissent une heuristique dont on a pu prouver l'efficacité ou est-ce qu'eux aussi ont programmé à l'intuition? J'aimerais savoir en combien d'essais ils résolvent Al Escargot.