我正在尝试开发一个程序来解决一个魔方在c中,我使用了回溯技术。这是一个很长的过程,需要多次迭代,所以我不能解决它。
请给我建议如何更有效地解决这个问题-例如其他技术或采用回溯本身。我在谷歌上找到了很多解决这个问题的快捷方式,但我不想用快捷方式来解决这个问题。
为什么不使用一个面向人的解决方案来编程呢?
你需要一些模式匹配,但这并不难。(另外还有解决1000x1000x1000的程序)
基本思想是分阶段工作:
- 第一层
- 第二层 第三层
对于每一层,你实现了一对将模式X转换为模式X的算法。阶段中的每一步都应该使立方体接近解。可以通过向每个模式添加一个值来实现这一点(未解决的多维数据集越多,值越高)。你也可以添加难度(例如回合数),这样你就可以根据每个难度的最佳收益值选择算法(或以最少的回合数获得最佳结果)。
这种方法的有趣之处在于,如果你喜欢,你可以添加新的算法,并测试它们的使用频率。因此,您可以测试每个算法的有用性。
如果你真的想获得这些极点,创建一个单独的语言来描述算法和它们正在解决的模式。
解决魔方问题的算法有很多,但您可以参考这个最优算法http://en.wikipedia.org/wiki/Optimal_solutions_for_Rubik 's_Cube
我不太明白你的问题和你所说的快捷方式是什么意思。如果你正在使用一些动态规划方法来解决魔方,你需要确保你提前看了足够的步骤才能得到解决方案。我认为,如果你只支持两种移动(向右旋转,向上旋转),你需要在决定每一种移动之前提前看12步(不确定),以确保解决方案。
如果你正在做这样的事情,你发现你已经耗尽了内存空间,那么请记住,你只需要保留你正在遍历的路径,以便决定正确的解决方案(而不是整个树)
我用这种方法成功地在Java中解决了一个魔方,所以C应该没有问题(就内存占用而言)。
魔方的状态空间大小为265。盲目搜索状态空间的回溯算法可能需要在找到解决方案之前检查大部分状态空间,因此很明显,简单的回溯算法不会很好地工作。但是,这个问题已经被解决过很多次了。参见http://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf
如果你不关心所涉及的移动次数,这里有一种方法来分割状态空间,使你的暴力方法工作。
寻找假人的魔方解决方案
- 首先对所有的红宝石切面进行暴力处理,但将角落放入位置
- 然后找到让这些面不变的移动(例如(fg - f-1 - g-1)^3)。实际上两招就足够了。为了找到它们,考虑角和非角子立方体所涉及的排列,然后迭代角循环长度的ppcm,以得到角上的和不变)
- 使用你的回溯算法得到角落的位置(但他们仍然需要旋转,对齐颜色)
- 找到使同一段上的立方体一起旋转的魔法动作。没有移动