Le problème du cavalier

Compétence associé : Optimiser des applications informatiques

Dans ce projet, je me suis intéressé au problème du cavalier. On dispose d’un échiquier, et on souhaite savoir s’il est possible qu’un cavalier passe par toutes les cases de l’échiquier sans passer deux fois par la même case, tout en respectant les règles des échecs concernant les déplacements du cavalier. J’ai donc réalisé un programme en python pour trouver une solution à ce problème, et comparer différents algorithmes.

Écran principal du jeu
Écrans de selection du niveau Début du niveau

La première stratégie que j’ai utilisé est un parcours en profondeur, en marquant les cases visitées, et de retourner en arrière si le chemin emprunté conduit à une impasse. On parle alors d’algorithme de type "retour sur trace" ou "retour arrière" (backtracking en anglais).
L’avantage de cette approche est qu’on est sûr de trouver une solution s’il en existe une. Cependant, cet algorithme a aussi un très gros point faible. Comme il consiste à tester toutes les possibilités, il est donc extrêmement lent.

Ma seconde stratégie à été d’utiliser l’algorithme de Warnsdorf. Le cavalier est déplacé de façon à toujours se rendre sur la case à partir de laquelle il aura le moins de déplacements ultérieurs.

Début du niveau Un ennemi
Une échelle Une échelle

Lorsqu’on met les résultats des deux algorithmes côte à côte, la différence de temps d’exécution est significative. Sur cet échiquier de 5×5, l’algorithme de backtracking (à gauche) met 0.059 secondes, alors que celui de Warnsdorf (à droite) ne met que 0.001 secondes.

Sur un échiquier de taille 8×8, la différence de temps d’exécution est encore plus frappante. 33 secondes d’un côté, 0.003 de l’autre. La différence est d’un facteur 10 000.

Une échelle Une échelle
Tester le programme