【问题标题】:Calculate minimum moves to solve a puzzle计算解决难题的最小步数
【发布时间】:2011-03-02 19:13:03
【问题描述】:

我正在创建一个游戏,用户将看到 2 组彩色图块。为了确保拼图可以解决,我从一组开始,将其复制到第二组,然后将瓷砖从一组交换到另一组。目前,(这就是我的问题所在)交换次数由用户正在玩的级别决定 - 1 级交换为 1 级,2 次交换为 2 级等。相同数量的交换用作目标游戏。用户必须通过将瓷砖从一组交换到另一组来完成拼图,以使两组匹配(按颜色)。只要 2 组匹配,(用户)已解决的拼图中的图块顺序无关紧要。

我遇到的问题是,当我用来生成拼图的交换次数接近每组中的瓷砖数量时,拼图变得更容易解决。基本上,您可以按照第二组所需的任何顺序从一组中拖动,然后用大量的动作解决难题。我要做的是在完成拼图后,计算解决拼图所需的最小移动次数。同样,这几乎总是少于用于创建拼图的交换次数,尤其是当交换次数接近每组中的瓷砖数量时。

我的目标是计算最好的情况,然后给用户一个“捏造因素”(即最小移动次数的 1.2 倍)。在此数量的移动下解决难题将导致通过关卡。

关于我目前如何配置游戏的一些背景知识:

级别 1 到 10:每组 9 个图块。 5 种不同颜色的瓷砖。 11 到 20 级:每组 12 个图块。 7 种不同颜色的瓷砖。 21 至 25 级:每组 15 张牌。 10 种不同颜色的瓷砖。

不允许在集合内交换。

对于每个级别,至少有 2 个给定颜色的图块(已解决的谜题中每组一个)。

有没有任何人可以推荐的算法来计算解决给定谜题的最小移动数?

【问题讨论】:

  • Bart K,我对“set”这个词的使用不符合这个定义。 “集合”实际上是用于指示图块颜色的潜在非唯一值的数组。通过将一组图块(以前称为“组”)中的图块与另一组交换图块来执行交换。瓷砖 A 将移动到瓷砖 B 的位置,反之亦然。我创建了一个游戏板图表,但我无法正确粘贴它以使其可读。
  • 我不确定您指定了您的游戏/拼图是什么,或者它背后的规则。您是否打算将您的答案与此相关,或者作为一般难题的一般案例?
  • mstksg,我对这个特定难题的解决方案很感兴趣。您能告诉我哪些信息可以帮助您了解游戏玩法吗?
  • 让我试试看我是否明白。你有两组不同颜色的瓷砖,按一定的顺序排列,目标是试图让两组彼此相同?所以这些是可能的“给定”起始位置:RGB|BRG、RRB|BGG。所以这些是期望的最终状态:RGR|RGR,RBG|RBG。我说的对吗?

标签: algorithm math


【解决方案1】:

解决难题的最小移动基本上是shortest path 从未解决状态到已解决状态。您的游戏隐含地定义了一个图,其中顶点是合法状态,如果有一个合法的移动可以实现这种转换,那么两个状态之间就有一条边。

根据您的搜索空间的大小,一个简单的breadth-first search 是可行的,并且会为您提供达到任何给定状态的最少步骤数。事实上,你也可以这样产生问题:与其随机移动到达一个状态并检查它与初始状态的“距离”,不如简单地探索广度优先/level-order中的搜索空间,然后选择一个在给定的“距离”处为你的谜题陈述。

相关问题


另类

如果搜索空间对于 BFS 来说太大了(我还不相信是这样),您可以改用 iterative deepening depth-first search。它像 DFS 一样节省空间,但(累积地)像 BFS 一样的级别顺序。即使节点会被多次访问,它仍然与 BFS 渐近相同,但需要的空间要小得多。

【讨论】:

    【解决方案2】:

    我不太了解您描述的难题,但在解决此类难题时通常有用的两个一般概念是 backtrackingbranch and bound

    【讨论】:

      【解决方案3】:

      A* search algorithm。这个想法是你可以衡量一个位置与解决方案的接近程度。然后,A* 是“最佳优先”搜索,因为它在每一步都考虑从目前找到的最佳位置移动。您可以提出某种衡量标准来衡量您与解决方案的接近程度。 (它不一定要准确,它只是指导搜索的启发式方法。)在实践中,它的性能通常比纯广度优先搜索要好得多,因为它总是由您的接近度评分函数指导。但是如果不了解您的问题描述,就很难说。 (经验法则是,如果在做一个谜题时有一种“进步”的感觉,而不是最后突然聚在一起,那么 A* 是一个不错的选择。)

      【讨论】:

      • 虽然 A* 似乎是个好主意,但什么是一个好的可接受的启发式方法?也许如果您将一组中的瓷砖数量减去已经可以匹配的瓷砖数量,然后将其减半?
      • 好吧,规则并没有以我能理解的方式指定。但听起来你正试图让一组匹配另一组。一个明显的衡量标准就是计算两个集合之间共有元素的数量。使用 A* 的回报可能非常大,即使您的启发式方法不是那么好,因为它可以阻止您陷入一连串完全无用的动作。
      猜你喜欢
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 2023-03-15
      • 2023-02-02
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多