Comme projet amusant, j'ai travaillé sur une implémentation C # de Richard Korf - Trouver des solutions optimales pour le cube de Rubik en utilisant des bases de données de modèles.
https://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf
Je le fais fonctionner, j'essaie juste d'améliorer ma solution.
Une chose que Korf glaçure dans son article est la façon dont il stocke et indexe dans les bases de données de modèles. Idéalement, je pense que nous voulons utiliser une instance d'un cube rubik pour générer un index dans un tableau.
Ma question porte sur la meilleure façon de générer cet index.
Ma solution est de générer un hachage parfait minimal. Cela implique de garder TOUS les cubes en mémoire jusqu'à ce que j'aie découvert la base de données de motifs entière, puis de générer un hachage parfait minimal basé sur cela. Le MPH prend quelques heures à fonctionner en fonction de la taille de la base de données de modèles, mais je n'ai besoin de le faire qu'une seule fois depuis que je l'ai enregistré sur le disque. En fin de compte, je peux jeter les cubes eux-mêmes en ne stockant que le MPH. De cette façon, je peux prendre un cube de Rubik aléatoire, appliquer le modèle, puis rechercher l'index du tableau dans le MPH pour obtenir une longueur de solution estimée.
Je crois que Korf et Shultz décrivent une meilleure façon de déterminer l'indice du cube dans leur article de 2005 intitulé "Large Scale Breadth-First Search"
https://www.aaai.org/Papers/AAAI/2005/AAAI05-219.pdf
Cet article décrit un algorithme pour générer un indice basé sur l'ordre lexicographique d'une permutation. Fondamentalement, vous pouvez prendre la permutation {1, 2, 3} et comprendre que c'est la plus petite avec un indice de 0. {1, 3, 2} est ensuite avec un indice de 1 et ainsi de suite.
Je pense que je devrais être en mesure d'appliquer cet algorithme à un cube rubik pour obtenir son index dans une base de données de modèles, mais j'ai du mal à comprendre comment cela fonctionnerait dans la pratique.
Par exemple, la base de données des coins uniquement contient tous les cubes de rubik dont les autocollants de bord ont été enlevés. Il y a exactement 88 179 840 cubes dans cet ensemble. Tout coin cubie sur un cube rubiks peut être dans l'un des 24 états différents. L'état du 8e coin peut être calculé sur la base des 7 autres, donc les cubes dans la base de données des motifs uniquement des coins ont chacun 7 valeurs comprises entre 0 et 23
Par exemple {0, 3, 6, 9, 12, 15, 18, 21} définit le cube "résolu" avec tous les autocollants de bord supprimés.
si je fais pivoter la face avant de 90 degrés, la permutation pourrait être: {0, 3, 11, 23, 12, 15, 8, 20}
Existe-t-il un moyen d'extraire un indice de ce type de permutations?