用于解决游戏“Globs”/ flood fill /“FloodIt”的算法和数据结构

时间:2009-12-28 17:08:00

标签: data-structures graph artificial-intelligence time-complexity

建议用于解决游戏Globs(http://www.deadwhale.com/play.php?game=131)的算法和数据结构。以一种令人讨厌的方式非常有趣。

根据N (网格的大小(N> = 14))说明您的方法的时空复杂度(大O)。 首选的是低效率的高效算法。

(MatrixFrog正确地指出这个游戏也被称为FloodIt,Smashery在3个月之前在他引用的链接中给出了一个解决方案。你所有的人都建议修剪/贪婪只有1个前瞻,这给出了不理想的解决方案。)< / p>

游戏生成nxn节点的随机方格,其中每个节点的颜色为六种颜色之一(Grn = 1,Ylw = 2,红色= 3,蓝色= 4,Pur = 5,Orn = 6)。 1级具有9x9网格,然后n增加每个级别,最多14级。 每个级别你最多可以使用25个回合,否则你会失败。 在每个回合中,您可以选择将左上角节点更改为哪种颜色,例如Grn-> Red,使得新颜色的任何连接的相邻(水平/垂直)节点被同化为一个形状,并且每个节点被同化的1 pt被添加到您的分数。 评分目标是尽可能少地完成每个网格,例如,如果你在16回合中完成,那么你的9个未使用的动作=&gt; 2 * 9 MULTIPLIER乘以您的总累积分数。

显然有很多方法可以解析这个问题,并且使用14x14网格进行递归回溯的默认选择是一个可行的竞争者; 这适用于哪些其他类型的数据结构?一个* ? 不要挂在最优性上,我想知道是否有一个“足够好”的算法。

(我认为编写一个机器人并获得愚蠢的高分可能是一个有趣的项目。 虽然我的肉体自我得到3.5E + 12全部。)

7 个答案:

答案 0 :(得分:5)

这场比赛真的引起了我的兴趣,所以我花了几天时间研究它。

我注意到的第一件事是,很容易证明在第一块板之后(在某些情况下可能是2块),提高分数的最快方法是使用乘数。因此,我建立了一个系统,其目标是以最少的步骤解决每个板。我开始想要使用A *,因为它通常只针对这些类型的搜索问题而构建......但是,这个问题仍然是一个doozie。

在谈论A *时,它的有效性实际上归结了您对启发式估算的选择。越接近猜测实际距离,为了达到目标就必须扩展的节点越少。对于这个问题,我经历了一些估计的想法,但是大多数都打破了A *规则,即你不能过度估计实际距离,否则就会打破A *的最优性。

然而,有一些有用。这个帖子中的其他人发布了关于只剩下剩余颜色的数量作为估计,这是可以接受的,因为它不能过度估计(你必须为每个剩余颜色至少改变一次颜色,而不是主要“泛滥”区域的一部分。这种启发式的问题在于它很难估计实际距离。例如,第一步,通常估计颜色的数量,6。它通常扩展为2个移动,每个移动通常估计为7如此深度为5级,对于10x10的板大小,大多数叶子的估计值为11.这种启发式基本上是广度优先搜索的实现,直到你从你的4或5个移动到达目标。这不是很有效,在我自己的测试中,指数大约在9号板上运行,解决方案通常需要大约14个步骤。应该注意我的解决方案是非常高的水平然而并没有太多的关注spe事情发展。

问题在于,当每个步骤对整个解决方案的实际距离进行重大改进时,A *才真正有用。直接看问题,你可能不会找到一个比这更好的启发式,而不会过度估算成本。但是,如果您将问题转换为另一个问题,那么更好的启发式方法会突然出现。启发式“剩余颜色数”正在回答问题,剩下的可能移动的最小数量是多少。对于这个问题的答案,我问自己“董事会中哪个位置需要最多步骤才能到达”?对于我的启发式,我最终解决了“右下角有多少步骤”的答案。通过运行另一个更像是查找地图方向然后计算解决方案中的步骤数的A *搜索,这很容易实现。我意识到这是选择板上的一个任意点,但它在测试中运行良好并且在每个剩余点上运行A *在我的单处理器测试机上花了相当多的时间。

这种启发式单独在右下角成为洪水区域的一部分之后有崩溃的倾向,因此最终结果是MAX(右下角最小步骤,颜色的数量不是主要洪水的一部分)。最终,我的高级实现能够在不到一秒的时间内实现一些非常大的电路板尺寸。

我会把记录设置留给你。

答案 1 :(得分:2)

另一种方法是使用遗传算法。 由于任何(部分)解决方案都包含一系列颜色,因此它可以很好地转换为基因。适应度函数可以是连通分量的4倍减去总使用的颜色数量(基因长度)。

我在Mathematica的10x10主板上尝试了这个,并且使用了非优化的算法, 并很快得到一个简短的解决方案。 我并不认为它是最佳的,但如果有足够的时间,变异基因过程中的随机性将确保您最终得到最佳解决方案。

答案 2 :(得分:1)

鉴于固定的起始状态和有限的移动次数,我认为您可以充分探索决策树。对于每一轮,只有5个可能的移动和浪费的移动(选择一种颜色,不会'浮动'任何相邻的任何邻居)可以在树构建时消除。构建决策树之后,我认为您可以探索每条路径的点值,但如果您需要更多优化,A *肯定会让您接近。

对于每一轮,我将基本状态作为位数组的矩阵,用于未经过处理的位置的状态(因为颜色在全局位置不再重要,您可以通过省略状态数据结构来节省内存颜色位)和每个决定的点值可能。然后你的A *或广度优先算法可以正常地最大化路径值。保存路径,分析完成后,进行所有确定的移动。

答案 3 :(得分:0)

  1. 如果可以的话,消除一种颜色。
  2. 选择了为您生成更多新邻居的颜色!
  3. 转到第1步。

答案 4 :(得分:0)

蛮力递归搜索会找到最高分。您最多需要考虑5 ^ 25个结束状态。许多中间国家将是等同的;识别这些并修剪重复的搜索空间可能会更快。跟踪搜索到的最高分,以及到达目的地的路径(移动顺序)。

答案 5 :(得分:0)

一个好的启发式方法是生成颜色连接的距离图。例如。目前的洪水位于零距离。一组颜色连接到远处的正方形&#39; i&#39;是在距离&#39; i + 1&#39;。

接下来,观察最大距离处的颜色数量。我们需要最大距离移动以消除最大距离处的一种颜色,我们需要额外移动以消除最大距离处的每种附加颜色。如果所有颜色都不在最大距离,请考虑之前距离尚未消除的颜色。我们可以在制作“最大距离”时消除其中一种颜色。移动,但我们需要采取措施消除每种额外的颜色。

这提供了相当不错的估计。在最初的14x14板位置,我倾向于估计17到18,同时需要20到22个移动才能获得最佳解决方案。通常可以通过此下限来解决14x14电路板,同时查看大约10,000个电路板位置。 (如果可以进行此类移动,则使用优化移动消除颜色。)

答案 6 :(得分:0)

另一个优化是,有一些颜色斑点不需要立即采取。网络距离图中可能存在叶子,其中一个颜色斑点没有另一个邻居。在相同颜色的最远斑点之前,不需要采用这种颜色斑点。使用这种方法,我们可以调整距离图以获得必须采用颜色斑点的最短时间。

对于某些董事会职位,我们将能够证明在下一回合不需要采用符合条件的颜色。我们可以避免这种颜色并降低分支因子。