Search 蒂克塔克托战略削减

Search 蒂克塔克托战略削减,search,artificial-intelligence,tic-tac-toe,Search,Artificial Intelligence,Tic Tac Toe,我决定写一个解决Tictatcoe的小程序,以便在一个简单的游戏中尝试一些修剪技术的效果。使用minimax求解的完整博弈树只得到549946个可能的博弈。通过alpha-beta修剪,需要评估的状态数减少到18297。然后我应用了一个换位表,将数字降到2592。现在我想看看这个数字能降到多低 我想应用的下一个增强是战略性减少。其基本思想是合并具有同等战略价值的国家。例如,在第一步中,如果X先打,选择一个角而不是另一个角在战略上没有什么不同(假设你的对手打得最好)。在同样的情况下,板墙的中心也是

我决定写一个解决Tictatcoe的小程序,以便在一个简单的游戏中尝试一些修剪技术的效果。使用minimax求解的完整博弈树只得到549946个可能的博弈。通过alpha-beta修剪,需要评估的状态数减少到18297。然后我应用了一个换位表,将数字降到2592。现在我想看看这个数字能降到多低

我想应用的下一个增强是战略性减少。其基本思想是合并具有同等战略价值的国家。例如,在第一步中,如果X先打,选择一个角而不是另一个角在战略上没有什么不同(假设你的对手打得最好)。在同样的情况下,板墙的中心也是如此,中心也很重要。通过仅减少到有效状态,您在第一次移动时只得到3个状态进行评估,而不是9个。这项技术应该非常有用,因为它会修剪游戏树顶部附近的状态。这个想法来自CMU的一个团队创建的GameShrink方法,只是我试图避免编写一般形式,只是做了必要的工作来将该技术应用到Tictaoe


为了实现这一点,我修改了hash函数(用于转置表),以枚举所有策略上等效的位置(使用旋转和翻转函数),并仅返回每个板的最低值。不幸的是,现在我的程序认为X可以在一个空棋盘上的5个动作中抢先获胜。经过长时间的调试后,我发现程序总是返回策略意义最低的移动(我将最后一个移动作为状态的一部分存储在转置表中)。是否有更好的方法来添加此功能,或者有一种简单的方法来确定适用于当前情况的正确移动方式

为什么需要使换位表可变?最佳移动不取决于历史记录。

您需要返回(反向)换位和最低值位置。这样,你就可以对预期的动作进行反向换位,以获得下一个位置。

当你考虑反射和旋转时,你的思路是正确的。但是,您将其应用于错误的位置。不要将它添加到换位表或换位表代码中——将它放在移动生成函数中,以消除get-go中逻辑上等价的状态


尽量使转置表和相关代码小而高效。

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

因此,使用紧凑表示法,枚举所有内容所需的内存不到10kb。我会计算整个游戏图并将其存储在内存中

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

下面是如何执行初始标记。生成所有有效的唯一板,抛出反射。现在,我们开始标记移动次数最多的板(9),并向下迭代到移动次数最少的板(0)。用赢、输和平局标记任何终局牌。对于任何轮到X移动的非终局板:1)如果存在一个X赢的后续板,则将该板标记为赢;2) 如果在后续董事会中没有获胜但存在平局,则将该董事会标记为平局;3) 如果在后继董事会中没有赢家和平局,则将此董事会标记为输家。当标记O的回合时,逻辑类似


就实现而言,由于状态空间很小,我将“如果存在”逻辑编码为一个覆盖所有5k状态的简单循环。但是,如果你真的想调整这一点以获得渐近运行时间,你可以构造一个有向图,显示哪些电路板状态导致哪些其他电路板状态,并通过沿边的相反方向遍历来执行minimax标记。

关于这一点,可以说很多,但我只想给出一个技巧来减少树的大小:Matt Ginsberg开发了一种方法,称为在电路板上进行等效性减少。它在Bridge中运行良好,他以tic-tac-toe为例。

您可能想尝试使用蒙特卡罗模拟来解决tic-tac-toe问题。如果其中一个(或两个)玩家都是机器玩家,它可以简单地使用以下步骤(这个想法来自于课程中的一个小项目计算原理1,这是莱斯大学教授的计算专业基础的一部分):

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

当一个paritular机器玩家赢了这些随机游戏中的一个时,它希望偏爱它所玩的方块(希望选择一个获胜的动作),并避免在方块中