点和框解算算法

时间:2012-04-07 18:53:58

标签: python algorithm

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

我将点和盒子板表示为Python中的矩阵。赢得游戏是首要任务:算法效率并不重要。

在给定电路板的情况下,是否有最好的,不复杂的算法来自动确定我们应该采取什么措施?

P.S。 - 如果你想要的话,你不需要给我任何代码......英语算法是完全可以接受的。

3 个答案:

答案 0 :(得分:20)

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

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

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

  1. 长链将在游戏结束时播放。
  2. 除了最后一个链外,每个链中都会有一个双十字。
  3. 首先必须在任何长链中进行比赛的球员都会输掉比赛。
  4. 加上你开始的点数加上双十字数的约束,等于游戏中的回合数。因此,如果有十六个点开始,并且有一个双十字,则将有十七个回合。 (在大多数游戏中,这意味着第一个玩家将获胜。)

    这极大地简化了对游戏中期位置的分析。例如,考虑这个位置有16个点和11个移动(问题3.3来自Berlekamp的书)。什么是最好的举措?

    Berlekamp problem 3.3

    好吧,如果有两个长链,则会有一个双十字架,游戏将在另外六个动作(16 + 1 = 11 + 6)之后结束,并且移动的玩家将会失败。但是如果只有一条长链,则不会有双交叉,并且游戏将在另外五次移动后结束(16 + 0 = 11 + 5)并且移动的玩家将获胜。那么玩家怎样才能确保只有一条长链呢?唯一获胜的举动牺牲了两个盒子:

    The winning move

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

    第三个也是最有力的观察是点和方框是impartial game:无论轮到谁发挥,可用的动作都是相同的,并且在比赛过程中出现的典型位置(是,包含长链盒子的那些)它也是normal game:最后一个移动获胜者。这些属性的组合意味着可以使用Sprague–Grundy theory静态分析位置。

    以下是使用Berlekamp的书中的图25来说明这种方法有多强大的例子。

    Dots-and-boxes position with a long chain

    这个位置有33个可能的动作,一个精心打造的游戏持续大约20个动作,所以如果minimax在合理的时间内完成分析是可行的,我会感到惊讶。但该位置有一个长链(上半部分的六个方块链),因此可以静态分析。该位置分为三个部分,其值为nimbers

    Position analyzed into nimbers

    这些nimbers可以通过动态编程在时间O(2 n )中计算出 n 剩余的位置,你将会可能想要缓存许多常见小位置的结果。

    Nimbers使用exclusive或:* * 1 + * 4 + * 2 = * 7添加。因此,唯一的获胜动作(将nim-sum减少到* 0的动作)是将* 4改变为* 3(使得位置sum为* 1 + * 3 + * 2 = * 0)。三个虚线红色动作中的任何一个都获胜:

    Winning moves


    编辑添加:我知道这个摘要并不真正构成算法,并留下了许多未回答的问题。对于一些答案,你可以阅读Berlekamp的书。但是在开幕式方面存在一些差距:链计数和Sprague-Grundy理论实际上只适用于中期和末期。对于开场你需要尝试新的东西:如果是我,我会试着尝试Monte Carlo tree search直到可以计算链。这项技术为Go游戏创造了奇迹,也可能在这里很有效率。

答案 1 :(得分:5)

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

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

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

min-max的想法是彻底搜索所有可能的移动 [通常达到某个深度,因为你需要过去的状态是深度数量的指数],并选择了最好的举动,假设你的对手也会做出最好的举动。

P.S。

  

赢得游戏是首要任务:算法效率不是这样   重要的。

它们紧密连接在一起,因为您的算法效率越高,您就能够检查可能的解决方案,直到更好的深度,并且您将获得更好的机会。请注意,在无限时间内,您可以浏览整个游戏树,并从每个游戏状态中获得一个获胜策略。然而 - 探索整个游戏树可能是不现实的。

答案 2 :(得分:3)

我认为Gareth上面的回答非常好,但只是添加(我没有任何声誉来添加评论)已经显示了点和框(至少有一个草图)是np-很难根据这个:arxiv.org/pdf/cs/0106019v2.pdf

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