以编程方式解决Rubik的立方体

我正在尝试开发一个用C解决Rubik立方体的程序。我使用了回溯技术。 这是一个非常漫长的过程,需要大量的迭代,所以我无法解决它。

请给我关于如何更有效地解决这个问题的建议 – 例如其他技术或采用回溯本身。 在谷歌我找到了很多解决这个问题的捷径,但我不想通过使用快捷方式来解决这个问题。

为什么不使用面向人的解决方案并对此进行编程。

你需要一些模式匹配,但它不会那么难。 (除了有解决1000x1000x1000的程序)。

基本想法是分阶段工作:

  • 第一层
  • 第二层
  • 第三层

对于每一层,您实现了几种将模式X转换为模式X’的算法。 阶段中的每一步都应该使立方体接近解决。 您可以通过向每个模式添加一个值来实现此目的(其中更高的值被赋予更多未解决的多维数据集)。 您还可以添加难度(例如转数),以便您可以根据每个难度的最佳值增益选择算法(或以最小的转弯达到最佳结果)。

这种方法的乐趣在于,如果您愿意,可以添加新算法并测试它们的使用频率。 因此,您可以测试每种算法的有用性。

如果您真的想要获得那些极客点,请创建一个单独的语言来描述他们正在解决的算法和模式。

有很多算法可以解决rubik问题,但是,你可以参考这个最优的算法http://en.wikipedia.org/wiki/Optimal_solutions_for_Rubik’s_Cube

我不确定我理解你的问题以及你的捷径是什么意思。 如果您使用一些动态编程方法来解决rubik的立方体,您需要确保您正在寻找足够的步骤以获得解决方案。 我相信如果你只支持两种类型的动作(向右旋转,向上旋转),你需要在决定每次动作之前先看12步(不确定),以确保解决方案。

如果您正在执行此类操作并且发现内存中的空间不足,请记住,您只需要保留正在遍历的路径,以便确定正确的解决方案(而不是整个树)。

我成功地使用这种方法在Java中解决了rubik的多维数据集,因此C应该没有问题(就内存占用而言)。

Rubik的立方体的状态空间大小约为2 65 。 盲目搜索状态空间的回溯算法可能需要在找到解决方案之前检查状态空间的大部分,因此很明显,简单的回溯算法不能很好地工作。 但是,这个问题已经解决了很多次。 参见例如http://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf

如果你不关心涉及的移动次数,这里有一种分割状态空间的方法,以便你的强制方法工作。

为假人找到一个rubix立方体解决方案

  • 首先powershell所有的rubix刻面,但角落到位
  • 然后找到让不变的方面的移动(例如(fgf-1.g-1)^ 3)。 两个动作实际上就足够了。 要找到它们,请考虑角点和非角点子立方体所涉及的置换,然后迭代角点周期长度的ppcm以获得并且在角上不变)
  • 使用您的回溯算法来到角落(但它们仍然需要旋转,以对齐颜色)
  • 找到使同一段上的立方体一起旋转的魔术移动。 没有举动