我目前正在开发一个 "dots and boxes" 程序,其中输入由计算机自动生成,我们的输出是我们将要采取的动作。我将与另一个玩家(他们的算法)竞争。
我在 Python 中使用矩阵表示点和框棋盘。赢得比赛是最重要的:算法效率并不那么重要。
是否有一种最佳、不复杂的算法,可以自动找出给定棋盘应该采取的动作?
P.S. - 如果你愿意,你不需要用代码给我任何东西...英文算法完全可以接受。
我目前正在开发一个 "dots and boxes" 程序,其中输入由计算机自动生成,我们的输出是我们将要采取的动作。我将与另一个玩家(他们的算法)竞争。
我在 Python 中使用矩阵表示点和框棋盘。赢得比赛是最重要的:算法效率并不那么重要。
是否有一种最佳、不复杂的算法,可以自动找出给定棋盘应该采取的动作?
P.S. - 如果你愿意,你不需要用代码给我任何东西...英文算法完全可以接受。
我认为极小化极大算法不是点格棋游戏的最佳选择。如果你真的想了解这个游戏的全部故事,你需要阅读 Elwyn R. Berlekamp 的书 The Dots and Boxes Game: Sophisticated Child's Play,但我会在这里给你一个简要的概述。
Berlekamp 提出了一些有力的观察结果。第一个是 双重交叉策略,我假设你已经知道了(它在 Wikipedia 上的游戏页面 中有描述)。
第二个是关于长链的 奇偶规则。这是从关于绝大多数精彩比赛的三个事实中得出的:
Minimax会找到这个移动,但需要更多的工作。
第三个也是最强大的观察是点和框是一种公正的游戏:无论轮到谁玩,可用的移动都是相同的,在游戏过程中出现的典型位置(即包含长链的框)也是正常的游戏:最后一个移动的玩家获胜。这些属性的组合意味着可以使用Sprague-Grundy理论静态地分析位置。
以下是使用Berlekamp书中的图25演示此方法有多强大的示例。
在这个局面中有33种可能的走法,一场精彩的比赛通常会持续20多步,因此如果minimax要在合理的时间内完成分析,我会感到惊讶。但是这个局面有一个长链(顶半部分的六个方块组成的链),因此可以进行静态分析。该位置分为三个部分,其值为nimbers: 这些数字可以通过动态规划在剩下n步的时间O(2n)内计算出来,您可能希望为许多常见的小位置缓存结果。编辑补充:我知道这个总结并不真正构成一个算法,并且留下了很多问题。对于其中的一些答案,您可以阅读Berlekamp的书。但是在开局时有点困难:链计数和Sprague-Grundy理论在中盘和结束时才实际可行。对于开局,您需要尝试一些新的东西:如果是我,我会尝试使用蒙特卡罗树搜索直到可以计算出链的数量。这种技术在围棋游戏中效果非常好,这里也可能会有所收获。
我认为Gareth在上面的回答非常好,但是补充一下(我没有足够的声望来添加评论),点与盒子已经被证明是np-hard的(至少有一个草图), 参考这篇文章: arxiv.org/pdf/cs/0106019v2.pdf
我编写了一个JavaScript版本的点与盒子游戏,试图将上面提到的策略结合起来 dotsandboxes.org。虽然它不是可用的最佳版本(尚未包含Gareth提到的所有技巧),但图形很好,而且它可以打败大多数人类和其他实现 :) 欢迎查看代码,也有一些其他人版本的游戏,你可以用来训练自己的技能。
赢得比赛是最重要的:算法效率并不那么重要。
它们彼此紧密相连,因为算法越有效率,您将能够检查可能的解决方案并达到更好的深度,并且您获胜的机会也会更大。请注意,在没有时间限制的情况下,您可以探索整个游戏树,并从每个游戏状态中提出获胜策略。然而-探索整个游戏树可能是不现实的。