[英]Algorithm for solving Flow Free Game
我最近开始玩Flow Free Game 。
用管道连接匹配的颜色以创建流动。 配对所有颜色,并覆盖整个板以解决 Flow Free 中的每个难题。 但要小心,如果它们交叉或重叠,管道会破裂!
我意识到这只是给定点对之间的寻路游戏,条件是没有两条路径重叠。 我有兴趣为游戏编写解决方案,但不知道从哪里开始。 我想过使用回溯,但对于非常大的电路板尺寸,它的时间复杂度很高。
是否有任何合适的算法可以有效地解决游戏。 使用启发式方法来解决问题有帮助吗? 给我一个从哪里开始的提示,我会从那里开始。
我在大多数董事会中观察到,通常
这是正确的观察,可以用来有效地解决它吗?
问题显然出在 NP 中:如果你猜出一个棋盘星座,很容易(poly-time)检查它是否解决了问题。
它是否是 NP-hard(意味着与 NP 中的所有其他问题一样难,例如 SAT)尚不清楚。 当然,现代 SAT 求解器无论如何都不会关心和解决大型实例(我猜高达 100x100)。
在这里,我只是将核子的评论复制到 OP:
搜索“数字链接的 SAT 公式”和“数字链接的 NP 完整性”会找到一些参考资料。 不出所料,最有趣的两个是日语。 第一个是 NP 完备性的实际纸质证明。 第二部分描述了如何使用 SAT 求解器 Sugar 求解 NumberLink。 ——
有几种可能性可以对问题进行编码。 我会给一个我可以很快弥补的。
j_random_hacker 指出不允许独立循环。 以下编码确实允许它们。 这个问题使 SAT 编码的吸引力降低了一些。 我能想到的禁止独立循环的最简单方法是引入 O(n^2) 新变量,其中n
是板上的瓷砖数量(计算每个瓷砖与下一个水槽的距离),除非使用日志编码这会将其降低到O(n*log n)
,这可能会使求解器更难解决问题。
每块瓷砖、一块类型和颜色一个变量。 例如,如果某个变量XYTC
为真,则它编码 X/Y 位置的图块类型为T
且颜色为C
。 您不需要空磁贴类型,因为这不会在解决方案中发生。
设置接收器/源的变量并说没有其他图块可以是接收器/源。
我可能错过了一些东西。 但它应该很容易修复。
我怀疑没有多项式时间算法可以保证解决这个问题的每个实例。 但由于其中一个要求是每个方格都必须被管道覆盖,因此人们和计算机用于解决数独的类似方法在这里应该很有效:
在分支方面挑选方块时,一般是一个好主意,可以选择一个尽可能少的允许颜色。
[编辑:避免形成无效的管道“循环”的可能性很重要。 一种方法是通过为每个方块 x 的每种允许颜色 i 维护 2 位信息:方块 x 是否通过确定的 i 色瓷砖路径连接到第一个 i 色端点,以及相同的第二个 i 色端点的事情。 然后在递归时,对于任何允许的颜色,永远不要选择具有相同位设置(或都没有设置)的两个邻居的正方形。]
您实际上根本不需要使用任何逻辑推导,但是您使用的推导越多越好,程序运行得越快,因为它们(可能会显着)减少递归量。 一些有用的扣除包括:
基于路径连通性的更高级推论可能会进一步提供帮助——例如,如果您可以确定连接某对连接器的每条路径都必须通过特定方格,则可以立即将该颜色分配给该方格。
这种简单的方法在您的 5x5 示例中推断出一个没有任何递归的完整解决方案: (5, 2)、(5, 3)、(4, 3) 和 (4, 4) 处的正方形被强制为橙色; (4, 5) 被强制为绿色; (5, 5) 也被强制为绿色,因为没有其他颜色可以到达这个方块然后又回来; 现在结束于 (4, 4) 的橙色路径无处可去,只能完成 (3, 4) 处的橙色路径。 并且 (3, 1) 也被强制为红色; (3, 2) 被强制为黄色,依次强制 (2, 1) 和 (2, 2) 为红色,最终强制黄色路径在 (3, 3) 处结束。 (2, 2) 处的红色管道迫使 (1, 2) 变为蓝色,并且红色和蓝色路径最终完全确定,“相互强制”。
我在Needless Complex上找到了一篇博客文章,它完整地解释了如何使用 SAT 来解决这个问题。
该代码也是开源的,因此您可以在实际操作中查看(并理解)它。
我将在这里引用它描述您需要在 SAT 中实施的规则:
每个单元格都分配了一种颜色。
每个端点单元格的颜色都是已知和指定的。
谢谢@Matt Zucker创造这个!
我喜欢类似于人类思维的解决方案。 您可以(很容易)通过蛮力获得数独的答案,但获得一条您可以遵循的路径来解决难题更有用。
我在大多数板子中观察到,通常 1.对于最远的点,您需要沿着边沿路径走。 2.对于彼此最近的点,如果有,则遵循直接路径。 这是正确的观察,可以用来有效地解决它吗?
这些都是“大多数时候”,但并非总是如此。
我会用这个替换你的第一条规则:如果两个水槽都沿着边缘,你需要沿着边缘沿着路径走。 (您可以构建一个反例,但大多数情况下都是如此)。 沿边创建路径后,沿边的块应被视为边的一部分,因此您的算法将尝试遵循前一个管道形成的新边。 我希望这句话是有道理的...
当然,在使用那些“大多数时候”规则之前,您需要遵循绝对规则(请参阅 j_random_hacker 帖子中的两个推论)。
另一件事是尝试消除无法找到解决方案的电路板。 让我们称未完成的管道(从一个水槽开始但尚未到达另一个水槽的管道)为蛇,未完成管道的最后一个方格将称为蛇头。 如果您在两个相同颜色的头之间找不到空白方块的路径,则意味着您的电路板无法找到解决方案,应该丢弃(或者您需要回溯,具体取决于您的实现)。
自由流动游戏(和其他类似游戏)接受将两条相同颜色的线并排的棋盘作为有效解决方案,但我相信总是存在没有并排线的解决方案。 这意味着任何不是水槽的正方形都会有两个相同颜色的邻居,而水槽只有一个。 如果规则碰巧总是正确的(我相信它是,但不能证明它),那将是减少可能性数量的额外约束。 我使用并排线解决了 Free Flow 的一些难题,但大多数时候我找到了另一种没有它们的解决方案。 我还没有在 Free Flow 的解决方案网站上看到并排的线条。
基于 Big Duck Games 的 IOS 版本,一些规则导致了一种算法来解决流程中的关卡,这家公司似乎生产了规范版本。 这个答案的其余部分假设没有墙壁、桥梁或扭曲。
即使你出奇地好,巨大的 15x18 方板也是一个很好的例子,说明如何以似乎可能让你在结束前一遍又一遍地卡住,实际上不得不从头开始的方式进行。 这可能与一般情况下已经提到的指数时间复杂度有关。 但这并不意味着简单的策略对大多数董事会来说不是绝对有效的。
块永远不会留空,因此孤立块意味着您做错了什么。
必须连接相同颜色的基本相邻单元格。 这排除了相同颜色的 2x2 块和 3 个相邻单元格的六边形网格三角形。
您通常可以通过确定某种颜色进入或排除在某个方块中来取得持久的进展。
由于第 1 点和第 2 点,在六边形板上的六边形网格上,沿边缘延伸的管道通常被卡住,一直绕到出口,有效地将外边缘移入并使板变小,因此该过程可以重复。 可以预测什么样的相邻条件可以保证以及什么样的条件可以打破这两种网格的这种循环。
我发现的大多数(如果不是全部)第 3 方变体都缺少 1 到 4 个,但鉴于这些限制,生成有效板可能是一项艰巨的任务。
回答:
第 3 点建议为每个单元格存储一个值,该值可以是一种颜色,也可以是一组错误/不确定值,每种颜色都有一个值。
求解器可以重复使用点 1 和点 2 以及在管道末端周围路径的小邻域上为点 3 存储的数据,以逐渐设置颜色或将不确定值设置为 false。
我们中的一些人花了很多时间思考这个问题。 我在这里的一篇 Medium 文章中总结了我们的工作: https : //towardsdatascience.com/deep-learning-vs-puzzle-games-e996feb76162
剧透:到目前为止,好老的 SAT 似乎击败了花哨的 AI 算法!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.