В качестве забавного проекта я работал над реализацией 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}
Есть ли способ получить индекс из таких перестановок?