泡泡破坏者游戏解决者比贪心更好?

时间:2009-10-08 23:29:19

标签: python algorithm language-agnostic

对于心理锻炼,我决定尝试解决许多手机上的泡泡破坏者游戏以及这里的一个例子:Bubble Break Game

  • 随机(N,M,C)板包括具有C颜色
  • 的N行×M列
  • 目标是通过选择最终导致最高分数的气泡组序列来获得最高分
  • <气泡组>气泡组是在x或y方向上彼此相邻的2个或更多个相同颜色的气泡。对角线不计算
  • 当一个团队被挑选时,气泡消失,任何洞首先从上面填充气泡,即向下移动,然后通过右移填充任何​​孔
  • 气泡组得分= n *(n - 1)其中n是气泡组中的气泡数

第一种算法是一种简单的穷举递归算法,它可以逐行和逐列选择气泡组来探索逐行扫描。一旦选择了泡泡组,我们就会创建一个新的电路板并尝试解决该电路板,递归下行

我使用的一些想法包括规范化的记忆。一旦电路板解决了,我们将电路板和最佳分数存储在记忆表中。

我创建一个prototype in python,显示(2,15,5)板需要8859个板才能在大约3秒内解决。一台(3,15,5)板在50分钟内在服务器上占用12,384,726块板。求解速率约为3k-4k板/秒,随着记忆搜索需要更长时间逐渐减少。记忆表增加到5,692,482个板,达到6,713,566次。

除了详尽的搜索外,还有哪些方法可以获得高分?

我没有看到任何明显的分裂和征服方式。但趋向于越来越大的泡沫团体似乎是一种方法

感谢David Locke发布了一个纸质链接,该链接在一个使用恒定深度前瞻启发式的窗口求解器上方进行讨论。

7 个答案:

答案 0 :(得分:7)

根据this paper,确定是否可以清空电路板(与您要解决的问题相关)是NP-Complete。这并不意味着你将无法找到一个好的算法,它只是意味着你可能找不到一个有效的算法。

答案 1 :(得分:1)

我想你可以尝试使用以下想法进行分支和绑定搜索:

  1. 鉴于游戏S的状态,你通过在m组中分解S,其中每个Si是在给出状态S的所有m个合法移动的合法移动之后的状态S

  2. 您需要两个函数U(S)和L(S)来分别计算给定状态S的下限和上限。

    对于U(S)函数,我正在考虑计算你能够在棋盘上自由洗牌K气泡(每次移动)得到的分数,并以这样的方式排列块,这将导致最高分,其中K是您自己选择的值。当您计算给定S的U(S)时,如果您选择更高的K(条件是放松的),它应该更快,因此选择K的值将是快速找到U(S)和质量(如何紧密)的交易上限U(S)是。)

    对于L(S)函数计算如果您只是随机保持点击直到达到无法再解决的状态所得到的分数。您可以多次执行此操作,获取最高下限。

  3. 一旦有了这两个功能,就可以应用标准的Bound和Branch搜索。请注意,搜索的速度将在很大程度上取决于上限的紧密程度以及下限的紧密程度。

答案 2 :(得分:1)

为了获得比穷举搜索更快的解决方案,我认为您想要的可能是动态编程。在动态编程中,您可以找到某种“步骤”,使您可以更接近解决方案,并在大矩阵中跟踪每个步骤的结果。然后,一旦填充了矩阵,就可以找到最佳结果,然后向后工作以获得通过矩阵的路径,从而获得最佳结果。矩阵实际上是一种记忆形式。

动态编程在The Algorithm Design Manual中讨论,但在网上也有很多讨论。这是一个很好的介绍: http://20bits.com/articles/introduction-to-dynamic-programming/

我不确定这个问题的“步骤”究竟是什么。也许你可以为一个简单地计算每个气泡组的积分的电路板制定评分指标,然后在尝试弹出气球时记录这个分数?好的步骤往往会导致泡沫团体合并,提高分数,而糟糕的步骤会破坏泡沫团体,使得分更差。

答案 3 :(得分:1)

您可以将此问题转换为在图表上搜索最短路径的问题。 http://en.wikipedia.org/wiki/Shortest_path_problem

我会尝试使用A *,启发式算法会包括岛屿数量。

答案 4 :(得分:1)

在我的国际象棋程序中,我使用了一些可能适应这个问题的想法。

  • 移动订购。首先找到所有 可能的移动,将它们存储在列表中, 并根据一些人对它们进行排序 启发式。先“好”的, 最后的“坏”。例如, 这可能是尺寸的函数 小组(喜欢中等大小 组),或相邻的数量 颜色,群体等

  • 迭代深化。代替 运行纯粹的深度优先搜索, 一定后切了搜索 深入并使用一些启发式来评估 结果。现在研究树 首先是“更好”的举动。

  • 修剪。不要搜索哪些动作 据说,“看起来很糟糕” 一些,再一次,启发式。这涉及到 你找不到的风险 最佳解决方案,但是 根据你的启发式,你会 很可能很早就找到它。

  • 哈希表。无需存储每一个 你会来的,只要记住 一定数量并覆盖旧版本 的。

答案 5 :(得分:1)

我差不多用Java编写了我的“解算器”版本。它既可以进行详尽的搜索,也可以选择较大的电路板尺寸,以及基于可能路径的“池”的定向搜索,这些搜索在每一代之后被修剪,并且用于修剪池的健身功能。我现在只是想调整健身功能......

更新 - 现在可以在http://bubblesolver.sourceforge.net/

获取

答案 6 :(得分:0)

这不是我的专业领域,但我想向您推荐一本书。获取Steven Skiena的The Algorithm Design Manual副本。这有一个完整的不同算法列表,一旦你读完它,你可以用它作为参考。如果没有别的,它会帮助你考虑你的选择。