Quel serait un algorithme relativement facile à coder en Java pour résoudre un cube de Rubik. L'efficacité est également importante mais une considération secondaire.
L'algorithme non-trivial le plus simple que j'ai trouvé est celui-ci:
http://www.chessandpoker.com/rubiks-cube-solution.html
Il ne semble pas trop difficile de coder. Le lien mentionné dans La réponse de Yannick M. a l'air bien aussi, mais la solution de ' la croix ' semble être un peu plus complexe pour moi.
Il existe un certain nombre d’implémentations de solutions open source que vous voudrez peut-être examiner. Voici une implémentation Python . Cet applet Java inclut également un solveur et le code source est disponible. Il y a aussi un javascript Javascript , également avec le code source téléchargeable.
La réponse d'Anthony Gatlin fait une excellente remarque sur la pertinence de Prolog pour cette tâche. Voici un article détaillé sur la façon d’écrire votre propre solveur Prolog . Les heuristiques utilisées sont particulièrement intéressantes.
Effectuer des opérations aléatoires jusqu'à ce que vous obteniez la bonne solution. L'algorithme le plus simple et le moins efficace.
Peut-être voudrez-vous vérifier: http://peter.stillhq.com/jasmine/rubikscubesolution.html
A une représentation graphique d'un algorithme pour résoudre un cube de Rubik 3x3x3
Je comprends que votre question concerne Java, mais sur le plan pratique, les langages comme Prolog conviennent beaucoup mieux aux problèmes comme la résolution d’un cube de Rubik. J'imagine que c'est probablement pour une classe et que vous n'avez peut-être aucune marge de manœuvre quant au choix de l'outil.
Une solution consiste à exécuter simultanément tous les itinéraires possibles. Cela semble stupide, mais voici la logique: plus de 99% des embrouillements possibles seront résolus en moins de 20 coups. Cela signifie que même si vous parcourez un très grand nombre de possibilités, vous finirez toujours par le faire. Cela fonctionnerait essentiellement en ayant votre première étape en tant que cube brouillé. Ensuite, vous auriez de nouveaux cubes stockés dans des variables pour chaque déplacement possible sur ce premier cube. Pour chacun de ces nouveaux cubes, vous faites la même chose. Après chaque déplacement possible, vérifiez s'il est complet et si c'est le cas, c'est la solution. Ici, pour vous assurer que vous avez la solution, vous auriez besoin d’un peu plus de données sur chaque cube Rubiks indiquant les mesures prises pour atteindre ce stade.
Vous pouvez le faire en faisant BFS (largeur-première recherche). Je pense que l'implémentation n'est pas si difficile (c'est l'un des algorithmes les plus simples de la catégorie du graphique). En effectuant cette opération avec la structure de données appelée file d'attente, vous travaillerez réellement à la création d'une arborescence BFS et à la recherche d'un chemin appelé le plus court chemin entre la condition donnée et la condition souhaitée. L'inconvénient de cet algorithme est qu'il n'est pas assez efficace (sans aucune modification, même pour résoudre un cube 2x2x2, le temps nécessaire est d'environ 5 minutes). Mais vous pouvez toujours trouver des astuces pour augmenter la vitesse.
Pour être honnête, c’est l’un des devoirs du cours intitulé " Introduction à l’algorithme " du MIT. Voici le lien du devoir: http://ocw.mit.edu/courses/electric- engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/assignments/MIT6_006F11_ps6.pdf . Ils ont quelques bibliothèques pour vous aider à le visualiser et vous éviter des efforts inutiles.
Pour votre information, vous pouvez certainement regarder cette implémentation Java. -> Utilise un algorithme à deux phases pour résoudre le cube de rubik . Et j'ai essayé ce code et ça marche aussi.