求解无流量游戏的算法

时间:2014-05-13 02:52:33

标签: algorithm graph artificial-intelligence

我最近开始玩Flow Free Game

  

     

将匹配的颜色与管道连接以创建流程。配对所有颜色,并覆盖整个板以解决Flow Free中的每个难题。但请注意,如果管道交叉或重叠,管道会断裂!

我意识到这只是给定点对之间的路径寻找游戏,条件是没有两条路径重叠。我有兴趣为游戏编写解决方案,但不知道从哪里开始。我想过使用回溯,但对于非常大的电路板尺寸,它会有很高的时间复杂度。

是否有合适的算法可以有效地解决游戏问题。可以用启发式方法解决问题有帮助吗?请告诉我从哪里开始,我将从那里开始。

我在大多数通常

的电路板上观察到了
  1. 对于最远点,您需要沿着边缘沿着路径行进。
  2. 对于彼此最近的点,如果有,请按照直接路径。
  3. 这是正确的观察,是否可以用它来有效地解决它?

6 个答案:

答案 0 :(得分:7)

减少到SAT

基本理念

  1. 将问题减少到SAT
  2. 使用现代SAT解算器解决问题
  3. 利润
  4. 复杂性

    问题显然在于NP:如果你猜测一个棋盘星座,那么检查它是否能解决这个问题很容易(多时间)。

    是否NP难(意味着与NP中的所有其他问题一样难,例如SAT),目前尚不清楚。当然,现代SAT求解器无论如何都不会轻易关心并解决大型实例(我估计高达100x100)。

    关于号码链接的文献

    在这里,我只是将核心人的评论复制到OP:

      

    搜索“数字链接的SAT表达”和“数字链接的NP完整性”会导致一些参考。不出所料,最有趣的两个是日语。 first是NP完全性的实际纸质证明。 second描述了如何使用SAT求解器Sugar解决NumberLink问题。 -

    提示减少到SAT

    有几种可能性来编码问题。我会给你一个我能快速弥补的。

    备注

    j_random_hacker指出不允许独立循环。以下编码允许它们。此问题使SAT编码的吸引力降低。我能想到的最简单的禁止独立循环的方法会引入O(n ^ 2)个新变量,其中n是电路板上的瓦片数量(计算每个瓦片下一个接收器的距离),除非一个对此使用日志编码,这会将其降低到O(n*log n),这可能会使求解器更难解决问题。

    变量

    每个瓷砖,零件类型和颜色一个变量。例如,如果某个变量X-Y-T-C为真,则会对位于X / Y的图块的类型为T且颜色为C的图像进行编码。您不需要空的磁贴类型,因为这不会在解决方案中发生。

    设置初始变量

    设置接收器/源的变量,并说没有其他的接收器可以是接收器/源。

    约束

    1. 对于每个位置,只有一个颜色/件组合是真的(基数约束)。
    2. 对于每个变量(位置,类型,颜色),四个相邻的瓷砖必须兼容(如果颜色匹配)。
    3. 我可能错过了什么。但它应该很容易修复。

答案 1 :(得分:3)

我怀疑没有多项式时间算法可以保证解决这个问题的每个实例。但是,由于其中一个要求是每个方格必须由管道覆盖,因此人们和计算机用于解决 Sudoku 的方法类似于此处应该很有效:

  1. 对于每个空方块,为该方块形成一组可能的颜色,然后在每个方块上重复执行逻辑推理以缩小该方块的允许颜色集。
  2. 每当正方形的一组可能的颜色缩小到1号时,就会确定该正方形的颜色。
  3. 如果我们达到的状态不再能进行逻辑演绎而且拼图还没有完全解决(即至少有一个正方形有多种颜色的正方形),请选择其中一个未定的正方形并对其进行递归,依次尝试每种可能的颜色。每次尝试都会导致解决方案或矛盾;后者消除了那种颜色作为那个方格的可能性。
  4. 当选择一个正方形进行分支时,选择一个尽可能少的允许颜色的正方形通常是一个好主意。

    [编辑:避免形成无效"循环的重要性"管道。一种方法是通过为每个方形x的每个允许颜色i保持2位信息:方形x是否通过明确的i色瓦片的路径连接到第一个i色端点,并且相同第二个i-colored端点的东西。然后在递归时,不要选择一个有两个具有相同位设置(或没有设置位)的邻居的方块用于任何允许的颜色。]

    你实际上根本不需要使用任何逻辑演绎,但是你使用的扣除越多越好,程序运行得越快,因为它们(可能会显着地)减少递归量。一些有用的推论包括:

    1. 如果方形是扩展某种特定颜色的路径的唯一可能方法,那么必须分配该颜色。
    2. 如果一个正方形在其允许的颜色集合中具有颜色i,但它没有至少2个相邻的正方形,它们在其允许的颜色集合中也具有颜色i,则它不能是"达到"通过任何颜色路径i,颜色可以作为一种可能性消除。
    3. 基于路径连接的更高级推断可能会有所帮助 - 例如如果你能确定连接某对连接器的每个路径必须通过一个特定的方块,你可以立即将该颜色分配给方块。

      这个简单的方法在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)为蓝色,红色和蓝色路径完全被确定,并且#34;强迫彼此"他们走了。

答案 2 :(得分:3)

我在Needlessly Complex上发现了一篇博文,完整地解释了如何使用SAT来解决这个问题。

The code也是开源的,因此您可以查看它(并了解它)。

我将在此提供一条引文,描述您需要在SAT中实施的规则:

  • 每个单元格都分配了一种颜色。

  • 每个端点单元格的颜色都是已知并指定的。

  • 每个端点单元格都只有一个与其颜色匹配的邻居。
  • 每个非端点单元格的流量恰好与六种方向类型中的一种匹配。
  • 由其方向类型指定的单元格的邻居必须与其颜色匹配。
  • 未按其方向类型指定的单元格的邻居不得与其颜色匹配。

感谢@Matt Zucker创建此内容!

答案 3 :(得分:0)

我喜欢与人类思维相似的解决方案。你可以(很容易)通过蛮力获得数独游戏的答案,但是获得一条你可以用来解决难题的路径会更有用。

  

我通常在大多数董事会中观察到   1.对于最远点,你需要沿着边缘走路。   2.对于彼此最近的点,如果有的话,请遵循直接路径。   这是正确的观察,是否可以用它来有效地解决它?

这些都是“大多数时候”,但并非总是如此。

我会用这个替换你的第一个规则:如果两个接收器沿着边缘,你需要沿着边缘跟随路径。 (你可以建立一个反例,但大部分时间都是如此)。沿边缘创建路径后,沿边缘的块应被视为边缘的一部分,因此您的算法将尝试遵循前一个管道所做的新边缘。我希望这句话有道理......

当然,在使用那些“大部分时间”规则之前,你需要遵循绝对规则(参见j_random_hacker帖子中的两个推论)。

另一件事是试图消除无法解决问题的电路板。让我们称一条未完成的管道(一个从水槽开始,但尚未到达另一个水槽)一条蛇,未完成的管道的最后一个方块将被称为蛇的头部。如果在相同颜色的两个磁头之间找不到空白方块的路径,则意味着您的电路板无法找到解决方案并且应该被丢弃(或者您需要回溯,具体取决于您的实现)。

自由流动游戏(和其他类似的游戏)接受作为有效解决方案的板子,其中有两条相同颜色的线并排,但我相信总是存在一个没有并排的解决方案线。这意味着任何不是水槽的方格都会有两个相同颜色的邻居,而水槽只有一个。如果规则总是如此(我相信它是,但不能证明它),那将是减少可能性数量的额外约束。我使用并排线解决了一些Free Flow的谜题,但大多数时候我发现了没有它们的另一种解决方案。我没有在Free Flow的解决方案网站上看到并排的线路。

答案 4 :(得分:0)

一些规则导致了一种解决流量级别的算法,基于Big Duck Games的IOS转换,该公司似乎生成了规范版本。这个答案的其余部分假设没有墙壁,桥梁或经线。

即使你的不可思议的好,巨大的15x18方板也是一个很好的例子,说明如何以一种可能让你在结束前一次又一次地卡住的方式,并且几乎不得不从头开始。这可能与一般情况下已经提到的指数时间复杂度有关。但这并不意味着简单的策略对大多数电路板来说都不是非常有效。

  1. 块永远不会留空,因此孤立的块意味着你做错了。

  2. 必须连接相同颜色的基本相邻细胞。这排除了相同颜色的2x2块和3个相邻单元的六边形网格三角形。

  3. 您可以通过确定颜色从某个方块中消失或被排除在某个方块之外来取得卓越的进展。

  4. 由于第1点和第2点,在六边形网格上的六边形网格上,沿着边缘的管道通常沿着它一直向前移动到出口,有效地移动外边缘并使电路板更小,以便可以重复该过程。可以预测的是,哪种类型的邻近条件能够保证什么样的种类可以打破这种类型的电网循环。

  5. 我发现大多数(如果不是全部)第三方变体缺少1到4,但考虑到这些限制,生成有效的电路板可能是一项艰巨的任务。

    答案:

    第3点建议为每个单元格存储一个值,该值可以是一种颜色,也可以是一组错误/不确定的值,每种颜色都有一个值。

    解算器可以重复使用第1点和第2点以及在管道末端周围的小路径上为点3存储的数据,以逐渐设置颜色或将不确定值设置为false。

答案 5 :(得分:0)

我们中的一些人已经花了很多时间思考这个问题。我在此处的中型文章中总结了我们的工作:https://towardsdatascience.com/deep-learning-vs-puzzle-games-e996feb76162

扰流器:到目前为止,好的老式SAT似乎胜过了花哨的AI算法!