作为一个有趣的项目,我一直在研究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}
有没有办法从这些排列中获取索引?