TicTacToe战略性减少

时间:2010-06-07 12:06:34

标签: search artificial-intelligence tic-tac-toe

我决定编写一个解决TicTacToe的小程序,以便尝试一些修剪技术对琐碎游戏的影响。使用minimax解决它的完整游戏树最终只有549,946个可能的游戏。通过alpha-beta修剪,评估所需的状态数量减少到18,297。然后我应用了一个转换表,将数字降至2,592。现在我想知道这个数字有多低。

我想申请的下一项改进措施是减少战略。基本思想是结合具有同等战略价值的国家。例如,在第一步中,如果X首先出场,那么在选择一个角落而不是另一个角落时,没有任何战略上的差异(假设你的对手发挥得最佳)。在相同的情况下,板的中心也是如此,中心也很重要。通过仅减少到显着状态,最终只有3个状态用于第一步而不是9的评估。这种技术应该非常有用,因为它修剪了游戏树顶部附近的状态。这个想法来自CMU小组创建的GameShrink方法,只是我试图避免编写一般形式,只是做了将技术应用到TicTacToe所需的东西。

为了实现这一点,我修改了我的哈希函数(对于转置表)来枚举所有策略上等效的位置(使用旋转和翻转函数),并且仅返回每个板的最低值。不幸的是,现在我的计划认为X可以在第一次出局时从空板上强行取胜5次。经过一段漫长的调试会议之后,对我来说很明显,程序总是返回最低战略意义的移动(我将最后一步移动到转换表中作为我的状态的一部分)。有没有更好的方法可以添加此功能,或者使用我已经完成的确定适用于当前情况的正确移动的简单方法?

7 个答案:

答案 0 :(得分:5)

我的直觉是你使用太大的锤子来解决这个问题。 9个斑点中的每一个都只能有两个标签中的一个:X或O或空。那么你最多有3 ^ 9 = 19,683个独特的板。由于每个电路板有3个等效反射,因此实际上只有3 ^ 9 / 4~5k电路板。您可以通过丢弃无效的板来减少这种情况(如果它们同时有一行X和一行O)。

因此,通过紧凑的表示,您需要少于10kb的内存来枚举所有内容。我会评估整个游戏图并将其存储在内存中。

我们可以通过自上而下计算最小极大值而不是自上而下(如树搜索方法),为每个单板标记其真正的极小极大值。这是一个概括:我们计算所有独特电路板的最小值,并在游戏开始前将它们全部标记。为了使极小极大值移动,您只需查看当前状态之后的电路板,并选择具有最佳极小极大值的移动。

以下是执行初始标记的方法。生成所有有效的独特电路板,抛出反射。现在我们开始用最多的移动标记板(9),并以最少的移动(0)向下迭代到板。用胜利,亏损和平局标记任何残局牌。对于X轮到之后的任何非终局董事会:1)如果存在一个X的胜利的继任董事会,则将该董事会标记为胜利; 2)如果在继任委员会中没有胜利但是有平局,则将该委员会标记为平局; 3)如果在后继董事会中没有胜利而没有抽奖,则将该董事会标记为亏损。标记O转弯时逻辑相似。

就实现而言,由于状态空间的小尺寸,我会将“if there exists”逻辑编码为所有5k状态的简单循环。但是如果你真的想要为渐近运行时调整这个,那么你将构建一个有向图,其中哪个电路板状态导致其他电路板状态,并通过遍历相反方向执行最小极大标记。边缘。

答案 1 :(得分:2)

当你在考虑反射和旋转时,你正走在正确的轨道上。但是,您将它应用到了错误的位置。不要将它添加到转置表或转置表代码中 - 将它放在移动生成函数中,以便从一开始就消除逻辑上等效的状态。

让您的转置表和相关代码尽可能小巧高效。

答案 2 :(得分:2)

出于好奇,我编写了一个程序来构建完整的换位表来玩游戏,而无需任何其他逻辑。考虑到8个对称性,并假设计算机(X)启动并具有确定性,那么只需要49个表项!

1个空板条目

2个条目中有5个条目

21个条目,共4件

18个条目,共6件

4个条目,共8件

答案 3 :(得分:1)

您需要返回(反向)转置以及最低值位置。这样,您可以将反向移调应用于预期移动,以获得下一个位置。

答案 4 :(得分:0)

为什么需要使转置表变为可变?最好的举动并不取决于历史。

答案 5 :(得分:0)

关于这一点有很多可以说的,但我会在这里给出一个减少你的树大小的提示:Matt Ginsberg开发了一种名为Partition Search的方法,它可以减少板上的等效性。它在Bridge中运作良好,他以tic-tac-toe为例。

答案 6 :(得分:0)

您可能想尝试使用蒙特卡罗模拟解决井字游戏。如果一个(或两个)玩家是机器玩家,它可以简单地使用以下步骤(这个想法来自 coursera 课程中的一个迷你项目计算原理1 ,这是由RICE大学教授的计算机专业化基础的一部分。):

每个机器播放器都应使用蒙特卡罗模拟从给定的TicTacToe板位置选择下一步移动。一般的想法是从位置开始随机移动来玩一系列游戏,然后使用这些游戏的结果来计算一个好的举动。

当一个paritular机器玩家赢得其中一个随机游戏时,它想要支持它所玩的方格(希望选择一个获胜的动作)并避开对手所玩的方格。相反,当它失去这些随机游戏中的一个时,它想要支持对手所玩的方块(阻挡其对手)并避开它所扮演的方格。

简而言之,在这些随机游戏中胜出的玩家应该优先于失败玩家所玩的广场。在这种情况下,两个玩家都将是机器玩家。

以下动画显示了在2个机器玩家之间玩游戏(以平局结束),在每个棋盘状态下使用10个MC试验确定下一个动作。

它显示了每个机器玩家如何通过使用蒙特卡罗模拟在每个状态下进行10次试验(少量试验)来学习玩游戏,分数显示在右下角每个网格方格由每个玩家在其相应的转弯处使用,以选择其下一步移动(根据模拟结果,较亮的单元格表示当前玩家的更好移动)。

enter image description here

有关详细信息,请参阅此blog