【问题标题】:Solving Rubik's cube programmatically以编程方式求解魔方
【发布时间】:2011-04-06 08:44:42
【问题描述】:

我正在尝试开发一个程序来解决 C 中的魔方问题。为此我使用了回溯技术。这是一个很长的过程,需要很多迭代,所以我无法解决。

请就如何更有效地解决这个问题给我一些建议 - 例如其他技术或采用回溯本身。在 Google 我发现了很多解决这个问题的捷径,但我不想通过使用捷径来解决这个问题。

【问题讨论】:

  • “快捷方式”是什么意思?
  • chessandpoker.com/rubiks-cube-solution.html 看到这个链接.. 他们会在 5 分钟内解决这个问题。
  • 您介意编辑您的问题以包含更清楚地说明您当前方法的代码吗?为了清楚起见,我对您的问题进行了一些编辑。
  • 查看,例如 Hofstadter 的 Metamagical themas,讨论魔方的数学特性。通过使用一些群论,您可以定义交换两个方格的复杂移动模式,从而提高搜索效率。

标签: c algorithm rubiks-cube


【解决方案1】:

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

您需要一些模式匹配,但这并不难。 (另外还有解决1000x1000x1000的程序)。

基本思路是分阶段工作:

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

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

这种方法的乐趣在于,您可以根据需要添加新算法并测试它们的使用频率。所以你可以测试每个算法的有用性。

如果您真的想获得这些极客点数,请创建一种单独的语言来描述算法及其解决的模式。

【讨论】:

  • 对于较大的立方体,比逐层求解更好的方法是先求解中心,然后求解边缘,最后求解得到的 3x3x3
  • @pranavk 这取决于what DP means
  • @AndersonGreen,下次我用迪斯尼公主来解魔方;-)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我不确定我是否理解您的问题以及您所说的快捷方式是什么意思。 如果您正在使用某种动态编程方法来解决魔方问题,您需要确保您正在查看足够多的步骤以达到解决方案。 我相信,如果您只支持 2 种类型的移动(向右旋转、向上旋转),您需要在决定每个移动之前提前 12 步(不确定)以确保解决方案。

    如果您正在做这样的事情并且发现内存空间不足,请记住,您只需要保留正在遍历的路径即可决定正确的解决方案(而不是整个树)。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果您不关心所涉及的移动次数,这里有一种拆分状态空间的方法,以便您的暴力破解方法起作用。

        为傻瓜寻找魔方解决方案

        • 首先暴力破解所有 rubix 刻面,但将角落放入位置
        • 然后找到让不变的那些方面的移动(例如(f.g.f-1.g-1)^3)。其实两步就够了。要找到它们,请考虑角和非角子立方体所涉及的排列,然后迭代角循环长度的 ppcm 以获得角上的不变性)
        • 使用您的回溯算法将角点定位(但它们仍需要旋转以对齐颜色)
        • 找出使同一段上的立方体一起旋转的魔法动作。 没有什么动作

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-21
          • 2015-06-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多