我正在尝试开发一个用C解决Rubik立方体的程序。我使用了回溯技术。这是一个非常漫长的过程,需要大量的迭代,所以我无法解决它。
请给我关于如何更有效地解决这个问题的建议 - 例如其他技术或采用回溯本身。在谷歌我找到了许多解决这个问题的捷径,但我不想通过使用快捷方式来解决这个问题。
答案 0 :(得分:7)
为什么不使用面向人的解决方案并对此进行编程。
你需要一些模式匹配,但不会那么难。 (除了有解决1000x1000x1000的程序)。
基本思想是分阶段工作:
对于每一层,您都实现了几种将模式X转换为模式X'的算法。 一个阶段的每一步都应该使立方体接近解决。您可以通过为每个模式添加一个值来实现此目的(其中更高的值被赋予更多未解决的多维数据集)。您还可以添加难度(例如转弯次数),这样您就可以根据每次难度的最佳值增益选择算法(或以最小的转弯达到最佳结果)。
这种方法的乐趣在于,如果您愿意,可以添加新算法并测试它们的使用频率。因此,您可以测试每种算法的有用性。
如果您真的想要获得这些极客点,请创建一个单独的语言来描述他们正在解决的算法和模式。
答案 1 :(得分:3)
有很多算法可以解决rubik问题,但是,你可以参考这个最优的算法 http://en.wikipedia.org/wiki/Optimal_solutions_for_Rubik's_Cube
答案 2 :(得分:1)
我不确定我是否了解您的问题以及快捷方式的含义。 如果您使用一些动态编程方法来解决rubik的立方体,您需要确保您正在寻找足够的步骤以达到解决方案。 我相信如果你只支持两种类型的动作(向右旋转,向上旋转),你需要在决定每次动作之前先看12步(不确定),以确保解决方案。
如果您正在执行此类操作并且发现内存中的空间不足,请记住,您只需要保留正在遍历的路径以确定正确的解决方案(而不是整个树) )。
我成功地使用这种方法在Java中解决rubik的多维数据集,因此C应该没有问题(就内存占用而言)。
答案 3 :(得分:0)
Rubik的立方体的状态空间大小为2 65 。盲目搜索状态空间的回溯算法可能需要在找到解决方案之前检查状态空间的大部分,因此很明显,简单的回溯算法不能很好地工作。但是,这个问题已经解决了很多次。参见例如http://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf
答案 4 :(得分:0)
如果你不关心涉及的移动次数,这里有一种分割状态空间的方法,以便你的强制方法有效。