索引到模式数据库-Korf的Optimal Rubik's Cube解决方案


11

作为一个有趣的项目,我一直在研究Richard Korf的C#实现-使用模式数据库找到Rubik立方体的最佳解决方案。

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

实际上,它确实有效,我只是在尝试改善解决方案。

Korf在他的论文中提到的一件事是他如何存储和索引到模式数据库。理想情况下,我认为我们想使用一个魔方的实例来生成数组的索引。

我的问题是有关生成此索引的最佳方法。

我的解决方案是生成最小的完美哈希。这涉及将所有多维数据集保留在内存中,直到我发现整个模式数据库,然后基于此生成最小的完美哈希。根据模式数据库的大小,MPH需要花费几个小时才能运行,但由于将其保存到磁盘,因此只需要执行一次。最后,我可以丢弃仅存储MPH的多维数据集本身。这样,我可以采用随机的魔方,应用模式,然后在MPH中查找数组索引以获取估计的解决方案长度。

我相信Korf和Shultz在他们2005年发表的名为“大规模广度优先搜索”的论文中描述了一种确定多维数据集索引的更好方法。

https://www.aaai.org/Papers/AAAI/2005/AAAI05-219.pdf

本文描述了一种算法,该算法根据排列的字典顺序生成索引。基本上,您可以采用排列{1,2,3}并确定它是最小的,索引为0。接下来是{1,3,2},索引为1,依此类推。

我觉得我应该能够将此算法应用于魔方,以在模式数据库中获取其索引,但是我很难弄清楚它在实践中如何工作。

例如,“仅角落”模式数据库包含所有已去除其边缘贴纸的魔方。此集中正好有88,179,840个多维数据集。魔方上的任何角都可以处于24种不同状态之一。可以根据其他7个角来计算第8个角形立方体的状态,因此,只有角形图案数据库中的每个立方体具有0到23之间的7个值

例如{0、3、6、9、12、15、18、21}定义“已解决”的多维数据集,其中所有边缘贴纸均被删除。

如果我将正面旋转90度,则排列可能是:{0、3、11、23、12、15、8、20}

有没有办法从这些排列中获取索引?


您可能会发现很有趣。
Tom van der

有趣!您说他“擦过”纸上的东西。最好对没有“完善”的部分进行更具体的说明。你也说你有工作。您最初的索引实现是什么?这是学校的项目吗?建议进一步的计算机科学聊天。同样,例如,通过博客撰写博客或开源代码可能对他人有帮助并导致更多细节。也该论文似乎没有提到任何哈希函数...
vzn

我实现了Korf的算法:github.com/benbotto/rubiks-cube-cracker。我也发现索引是困难的,所以我对中写了一篇关于它的文章:medium.com/@benjamin.botto/...
avejidah

Answers:


6

(pi,oi)(p0,,p7)(0,,7)oi{0,1,2}o7o0,,o68!37=88179840{0,,23}(pi,oi)(p0,,p7)o0,,o637p+o8!o+p


嘿尤瓦尔,感谢您的评论。对我来说,0到23是我确定角corner可处于的唯一位置/方向的方法。8个位置乘以每个位置的3个方向=24。幸运的是,我可以轻松地将此值拆分为单独的位置/方向元组。您的回答使我找到了这段代码,它是您所描述的算法的实现。 github.com/brownan/Rubiks-Cube-Solver/blob/master/cornertable.c 我需要做一些工作以使其更加通用(以便我可以处理不同于“仅角”的模式),但现在我在正确的轨道上!
Cosmosis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.