Индексирование в базу данных шаблонов - решение Korf's Optimal Rubik's Cube

11

В качестве забавного проекта я работал над реализацией C # Ричарда Корфа - Поиск оптимальных решений для кубика Рубика с использованием шаблонных баз данных.

https://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf

У меня действительно это работает, я просто пытаюсь улучшить свое решение.

Одна вещь, о которой говорит Корф в своей статье, это то, как он хранит и индексирует базы данных шаблонов. В идеале я думаю, что мы хотим использовать экземпляр кубика Рубика для генерации индекса в массив.

Мой вопрос о том, как лучше всего создать этот индекс.

Мое решение - создать минимальный идеальный хеш. Это включает хранение ВСЕХ кубов в памяти до тех пор, пока я не обнаружу всю базу данных шаблонов, а затем сгенерирую минимальный идеальный хеш на основе этого. Работа MPH занимает пару часов в зависимости от размера базы данных шаблона, но мне нужно сделать это только один раз, так как я сохраняю его на диск. В конце концов, я могу выбросить сами кубы, хранящие только 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}

Есть ли способ получить индекс из таких перестановок?

Cosmosis
источник
Вы , вероятно, найти это интересно.
Том ван дер Зандену
интересный! вы говорите , что он «глазурь над» что - то в газете. было бы лучше быть более конкретным в отношении раздела, который не «конкретизирован». Вы также говорите , что он работает. что ваша первоначальная реализация индексации? это школьный проект? предложить далее Computer Science чат на нем. также, например, ведение блога об этом или открытый код может быть полезным для других и привести к более подробной информации. также бумага , кажется, не ссылается ни на какие функции хеширования ...
ВЗН
Я реализовал алгоритм Корфа: github.com/benbotto/rubiks-cube-cracker . Я тоже нашел индексирование будет трудно, поэтому я написал статью об этом на Medium: medium.com/@benjamin.botto/...
avejidah

Ответы:

6

(пя,оя)(п0,...,п7)(0,...,7)оя{0,1,2}о7о0,...,о68!37знак равно88179840{0,...,23}(пя,оя)(п0,...,п7)о0,...,о637п+о8!о+п

Юваль Фильмус
источник
Эй, Юваль, спасибо за комментарий. Для меня от 0 до 23 - это то, как я определяю уникальную позицию / ориентацию, в которой может находиться угловой куб. 8 позиций на 3 ориентации на позицию = 24. К счастью, я могу легко разделить это значение на отдельные кортежи позиции / ориентации. Ваш ответ привел меня к этому коду, который является реализацией алгоритма, который вы описываете. github.com/brownan/Rubiks-Cube-Solver/blob/master/cornertable.c Мне нужно немного поработать, чтобы сделать это более универсальным (чтобы я мог обрабатывать шаблоны, отличные от «только углов»), но сейчас Я на правильном пути, спасибо!
Космос