Як цікавий проект, я працював над реалізацією C # Річарда Корфа - Пошук оптимальних рішень для куба Рубіка за допомогою баз даних шаблонів.
https://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf
Насправді я працюю, я просто намагаюся вдосконалити своє рішення.
Одне, що Корф глазурує у своїй роботі, - це те, як він зберігає та індексує бази даних шаблонів. В ідеалі, я думаю, ми хочемо використовувати екземпляр куба рубіка для генерації індексу в масив.
Моє запитання про найкращий спосіб генерування цього індексу.
Моє рішення - генерувати мінімально ідеальний хеш. Це передбачає збереження ВСІХ кубів в пам'яті, поки я не знайду всю базу даних шаблонів, а потім генерую мінімальний ідеальний хеш на основі цього. MPH займає кілька годин для запуску залежно від розміру бази даних шаблону, але мені потрібно це зробити лише один раз, оскільки я зберігаю його на диску. Зрештою, я можу викинути кубики, які зберігають тільки ГДЧ. Таким чином я можу взяти рандомізований кубик рубіка, застосувати шаблон, а потім шукати індекс масиву в MPH, щоб отримати розрахункову довжину рішення.
Я вважаю, що Корф і Шульц описують кращий спосіб визначення індексу куба у своїй роботі 2005 року під назвою "Широкий пошук в масштабі першого масштабу".
https://www.aaai.org/Papers/AAAI/2005/AAAI05-219.pdf
У цій роботі описаний алгоритм для генерування індексу на основі лексикографічного впорядкування перестановки. В основному, ви можете взяти перестановку {1, 2, 3} і порахувати, що вона найменша з індексом 0. {1, 3, 2} далі з індексом 1 тощо.
Я відчуваю, що я повинен мати можливість застосувати цей алгоритм до куба рубіка, щоб отримати його індекс у базі даних шаблонів, але мені важко зрозуміти, як це буде працювати на практиці.
Наприклад, база даних шаблонів тільки для кутів містить усі кубики рубіка, у яких були зняті крайові наклейки. В цьому наборі рівно 88 179 840 кубів. Будь-який кутовий кубі на кубі рубіка може знаходитися в одному з 24 різних станів. Стан кубика 8-го кута можна обчислити, виходячи з інших 7, тому в кутах лише у базі даних шаблонів шаблонів кожен має 7 значень від 0 до 23
наприклад, {0, 3, 6, 9, 12, 15, 18, 21} визначає "вирішений" куб із вилученими усіма наклейками.
якщо я обертаю лицьову поверхню на 90 градусів, перестановка може бути: {0, 3, 11, 23, 12, 15, 8, 20}
Чи є спосіб отримати індекс з таких перестановок?