J'ai travaillé sur ce sujet, et après avoir fait fonctionner mon solveur, j'ai jeté un coup d'œil aux approches adoptées par les autres.
La plupart des solveurs existants sont heuristiques et ne garantissent pas l'optimalité. Les heuristiques s'intéressent au nombre de cases et à la distribution des couleurs non choisies, ou à la distance jusqu'à la case la plus éloignée. La combinaison d'une bonne heuristique avec la DFS bornée (ou la BFS avec lookahead) permet d'obtenir des solutions assez rapides pour la grille standard de 14x14.
J'ai adopté une approche légèrement différente car je souhaitais trouver le chemin optimal prouvé, et pas seulement un "bon" chemin. J'ai observé que l'espace de recherche croît en fait beaucoup plus lentement que le facteur de branchement de l'arbre de recherche, car il y a beaucoup de positions en double. (Avec une stratégie de recherche en profondeur, il est donc important de maintenir un historique pour éviter un travail redondant). Le facteur de branchement effectif semble plus proche de 3 que de 5.
La stratégie de recherche que j'ai adoptée consiste à effectuer une BFS jusqu'à une profondeur "médiane" où le nombre d'états devient infaisable, quelque part entre 11 et 13 mouvements. Ensuite, j'examine chaque état à la profondeur du point médian et j'effectue une nouvelle BFS en commençant par cet état comme racine. Ces deux recherches BFS peuvent être élaguées en éliminant les états trouvés dans les profondeurs précédentes, et la dernière recherche peut être limitée par la profondeur de la solution la mieux connue. (Une heuristique appliquée à l'ordre des sous-arbres examinés dans la deuxième étape serait probablement utile, elle aussi).
L'autre technique d'élagage qui s'est avérée être la clé d'un solveur rapide consiste simplement à vérifier s'il reste plus de N couleurs, si vous êtes à N pas ou moins de la meilleure solution actuelle.
Une fois que nous connaissons l'état du point médian qui se trouve sur le chemin d'une solution optimale, le programme peut effectuer une DFS en utilisant cet état médian comme objectif (et en élaguant tout chemin qui sélectionne un carré qui n'est pas dans le point médian.) Ou, il pourrait être possible de simplement construire les chemins dans les étapes de la BFS, au prix d'un peu de mémoire supplémentaire.
Mon solveur n'est pas super rapide, mais il peut trouver une solution optimale garantie en quelques minutes au maximum. (Voir http://markgritter.livejournal.com/673948.html ou le code à http://pastebin.com/ZcrS286b .)
1 votes
Le problème semble être NP-hard : Lien vers l'université de Bristol