【问题标题】:Dots and boxes solving algorithm点和框求解算法
【发布时间】:2014-01-25 03:51:11
【问题描述】:

我目前正在开发一个“dots and boxes”程序,该程序的输入是由计算机自动生成的,我们的输出就是我们将要采取的行动。我将与另一位玩家(他们的算法)竞争。

我将点和框板表​​示为 Python 中的矩阵。赢得比赛是重中之重:算法效率并不重要。

在给定棋盘的情况下,是否有一种最好的、不复杂的算法可以自动计算出我们应该采取的行动?

附: - 如果你愿意,你不需要在代码中给我任何东西......英文算法是完全可以接受的。

【问题讨论】:

    标签: python algorithm


    【解决方案1】:

    我认为极小极大不是点盒算法的最佳选择。关于这个游戏的完整故事你真的需要阅读这本书The Dots and Boxes Game: Sophisticated Child's Play by Elwyn R. Berlekamp,但我会在这里给你一个简短的总结。

    Berlekamp 提出了许多有力的意见。第一个是双交叉策略,我假设你知道(在Wikipedia page on the game 中有描述)。

    第二个是长链奇偶校验规则。这源于大多数出色游戏的三个事实:

    1. 长链将在游戏结束时上演。
    2. 除最后一条外,每条链中都会有一个双叉。
    3. 首先必须参与任何长链的玩家将输掉游戏。

    加上你开始的点数加上双叉的数量等于游戏中的回合数的限制。所以如果开始有十六个点,并且有一个双十字,那么就会有十七个回合。 (在大多数游戏中,这意味着第一个玩家将获胜。)

    这极大地简化了对游戏中期位置的分析。例如,考虑这个有 16 个点和 11 步棋的局面(Berlekamp 书中的问题 3.3)。这里最好的做法是什么?

    好吧,如果有两条长链,就会有一个双叉,游戏将在另外六步后结束(16 + 1 = 11 + 6),走棋的玩家会输。但如果只有一条长链,就不会出现双叉,游戏将在另外五步(16 + 0 = 11 + 5)后结束,走棋的玩家获胜。那么玩家移动如何保证只有一条长链呢?唯一获胜的举动牺牲了两个盒子:

    Minimax 会发现这个动作,但需要做更多的工作。

    第三个也是最有力的观察是点和框是impartial game:无论轮到谁玩,以及在游戏过程中出现的典型位置(即,那些包含 长链 的盒子)它也是normal game:最后移动的玩家获胜。这些属性的组合意味着可以使用Sprague–Grundy theory 静态分析位置。

    这是一个使用 Berlekamp 书中的图 25 来说明这种方法的强大功能的示例。

    在这个位置有 33 种可能的走法,一个玩得好的游戏会持续大约 20 多步,所以如果极小极大在合理的时间内完成分析是可行的,我会感到惊讶。但是该位置有一个长链(上半部分的六个正方形链),因此可以对其进行静态分析。该位置分为三块,其值为nimbers

    可以通过动态规划在 O(2n) 时间内计算剩余 n 步的位置,您将无论如何,可能想要缓存许多常见小位置的结果。

    Nimbers 使用异或相加:*1 + *4 + *2 = *7。因此,唯一获胜的举动(将 nim-sum 减少到 *0 的举动)是将 *4 更改为 *3(因此头寸总和为 *1 + *3 + *2 = *0)。三个红色虚线中的任何一个都获胜:


    编辑补充:我知道这个总结并没有真正构成一个算法,并且留下了很多没有答案的问题。对于一些答案,您可以阅读 Berlekamp 的书。但在开局时有一点差距:链数和斯普拉格-格兰迪理论实际上只在中局和残局中实用。对于开幕式,你需要尝试一些新的东西:如果是我,我会很想尝试Monte Carlo tree search,直到可以数出链条。这种技术为围棋游戏创造了奇迹,在这里也可能很有成效。

    【讨论】:

    • +1 用于回答问题。可爱的答案。我只是在我表弟和我小时候玩的时候遇到过双重交叉。
    • 这个答案是黄金。很多很多很多东西让我学习。维基百科,我来了宝贝。
    • 不错。在这个网站上还有一些关于点和框策略以及与组合博弈论的关系的有用资料:http://wccanard.wetpaint.com/
    • Sprague-Grundy 理论在此不适用,因为玩家在点数和盒子中赢得最高分。如果他的分数低于对手的分数,最后移动的玩家将失败。
    • @angelvet:请参阅我的回答中的“第三个观察结果”,它解释了 Dots 和 Boxes 的大多数位置都有长链,因此“正常”意味着最后一个玩家获胜。这就是为什么 Sprague-Grundy 理论适用于这些职位的原因。
    【解决方案2】:

    我认为Gareth 上面的回答非常好,但只是补充(我没有任何添加 cmets 的声誉)点和框已显示(至少通过草图)是 np-hard 根据对此:arxiv.org/pdf/cs/0106019v2.pdf

    我编写了一个 javascript 版本的点和框,试图结合上面提到的策略dotsandboxes.org。它不是最好的(尚未包含 Gareth 提到的所有技术),但图形很好,它击败了大多数人类和其他实现 :) 随意查看代码,还有其他一些其他链接人版游戏,您可以在上面训练自己的游戏。

    【讨论】:

      【解决方案3】:

      这个游戏是zero sum game,所以我建议使用min-max algorithmdeep-blue 使用该算法在国际象棋中赢得卡斯帕罗夫。

      创建您的启发式函数,它评估游戏的每个状态,并将其用作 min-max 算法的评估函数。

      您还可以通过使用alpha-beta prunning 来提高 min-max。

      min-max 的想法是彻底搜索所有可能的移动 [通常到一定深度,因为你需要遍历的状态在深度的数量上是指数级的],并选择了最好的一步,假设你的对手也将做出他最好的一步。

      附言

      赢得比赛是重中之重:算法效率不是那个 很重要。

      它们紧密相连,因为您的算法越高效,您就可以更深入地检查可能的解决方案,您获胜的机会就越大。请注意,在无限时间的情况下,您可以探索整个游戏树并从每个游戏状态中提出获胜策略。但是 - 探索整个游戏树可能是不现实的。

      【讨论】:

      • 这是一个很好的建议,但对我的项目来说似乎太复杂了。
      • @CaseyPatton:那么您将有 100% 的可能性输给执行此操作的程序,除非该游戏有一个已知的启发式算法可以完美地指示最佳游戏。即使是蛮力搜索也意味着这样做。
      • @CaseyPatton:这实际上是所有零和游戏中最好和最常用的算法。 当今代理之间的区别在于使用的启发式方法,而不是是否使用它。另外,我相信你可以在 python 上在线找到它的现有实现,并且实现 min-max 算法并不难。
      • @CaseyPatton 听起来很复杂,但其实很简单。您只需要一个函数来评估您在给定游戏配置中的位置。它可以是您拥有的盒子数量减去对手盒子的数量。然后从您的位置构建可能的移动并计算最大化您的位置质量的路径。然后走这条路。一旦你有一个简单的实现,你应该尝试改进状态评估函数,并尝试优化你的树以避免计算无用的路径。
      • 这个答案不包含任何代码让我复制粘贴为什么它在顶部
      猜你喜欢
      • 2016-01-26
      • 2011-06-12
      • 1970-01-01
      • 2013-04-16
      • 2014-09-25
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      相关资源
      最近更新 更多