Індексація в базі даних шаблонів - оптимальне рішення Куб Корбі Корбі


11

Як цікавий проект, я працював над реалізацією 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}

Чи є спосіб отримати індекс з таких перестановок?


Напевно, вам це буде цікаво.
Том ван дер Занден

цікаво! ви кажете, що він «засклює» щось на папері. було б краще бути більш конкретним щодо розділу, який не "чіткий". ви також говорите, що у вас це працює. яка ваша початкова реалізація індексації? це шкільний проект? запропонуйте додатковий чат з інформатики . наприклад, блоги про нього або відкритий пошук коду може бути корисним для інших та призвести до більш детальної інформації. також, здається, в статті не йдеться про якісь функції хешування ...
vzn

Я реалізував алгоритм Корфа: github.com/benbotto/rubiks-cube-cracker . Я теж вважав, що індексація є складною, тому я написав статтю про це на Medium: medium.com/@benjamin.botto/…
avejidah

Відповіді:


6

Ви не пояснюєте, що означають числа від 0 до 23, але відповідно до цієї відповіді ви можете представити стан кутів за допомогою восьми пар , де перестановка , , і (скажіть) визначається . Загалом це дає градусів свободи. Якщо припустити, що ви можете розкласти ваші на пари , ви можете легко перетворити позицію в індекс, кодуючи окремо перестановку(pi,oi)(p0,,p7)(0,,7)oi{0,1,2}o7o0,,o68!37=88179840{0,,23}( p 0 , , p 7 ) o 0 , , o 6 3 7 p + o 8 ! о + р(pi,oi)(p0,,p7)(що в документі AAAI пояснює, як це зробити) та значення , які ви можете кодувати в базі 3. Склавши два значення разом очевидним чином (наприклад, або ), отримуємо індекс.o0,,o637p+o8!o+p


Гей Ювал, дякую за коментар. Для мене від 0 до 23 - це те, як я визначаю унікальну позицію / орієнтацію, якою може бути кутовий куб. 8 позицій, 3 рази орієнтації на позицію = 24. На щастя, я можу легко розділити це значення на окремі кортежі положення / орієнтації. Ваша відповідь привела мене до цього коду, який є реалізацією алгоритму, який ви описуєте. github.com/brownan/Rubiks-Cube-Solver/blob/master/cornertable.c Мені потрібно зробити трохи роботи, щоб зробити це більш загальним (щоб я міг обробляти інші шаблони, ніж "лише кути"), але тепер Я на правильному шляху THX!
Космос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.