求剧情
算法的乐趣 · 第七十一节

《算法的乐趣》第七十一节

井字棋的估值函数需综合考虑空行数与双连子两个因素:一方在某行、列或斜线上只含己方棋子或空格即算空行,空行越多越可能连成三子……

井字棋的估值函数需综合考虑空行数与双连子两个因素:一方在某行、列或斜线上只含己方棋子或空格即算空行,空行越多越可能连成三子;但若某方已形成双连子(一行上有两个己方棋子且无对方棋子),即便空行数较少也更占优。据此设计的FeEvaluator算子给出X方的评估值,胜负局分别为正负无穷,平局为0,另有WzEvaluator算子,二者棋力相当。走法产生在井字棋中只需依次试探未落子的空格,被嵌入MiniMax极大极小搜索的循环中;书还实现了带α-β剪枝的AlphaBetaSearcher和负极大值的NegamaxSearcher,测试显示搜索深度为6时,普通搜索需遍历六万五千余局,剪枝后仅六千五百余次。结合附录B的棋类框架可做出人机对战程序,深度设为6时计算机多能下成平局。

奥赛罗棋(黑白棋)在8×8棋盘上轮流落子,落子若能在横、竖、斜方向夹住对方棋子则将其翻转;一方无处落子则让对方下,双方皆不能落子时棋子多者胜。因一次落子可翻转多子,前期更看重位置而非子数:中间位置四向受敌,边缘仅一向,四角不可被夹击,即“金角银边草肚皮”。C位(A2、A7、B1、B8、G1、G8、H2、H7)与星位(B2、B7、G2、G7)易被对手借作桥梁抢占相邻角,星位危害更大,应尽量避免占据;边位置E较安全可优先落子,与边相邻的S位置则易资敌。另有内部子、边缘子、稳定子(不会被翻转的棋子,四角天然稳定,开局前20手一般不出现)和行动力(合法落子位置数)等评估概念。

棋盘建模沿用一维数组而非二维数组,以规避多方向搜索的算法不一致。采用WarrenSmith模型:长度91的数组中64个为棋盘位置,27个为标志位——首尾各10个,中间每8个棋盘位置插一个标志位,标志位取特殊值DUMMY,棋子状态用PLAYER_A、PLAYER_B、PLAYER_NULL表示。借助方向步进数组(如右移+1、上移-9等),向任意方向步进都会遇到标志位自然结束,无需二维下标。模型下标与行列坐标存在固定换算关系。空位另用双向链表组织成空位表,供搜索直接使用,中局空位减少后效率提升明显。最后以“沿某方向搜索能否翻转对方棋子”的落子合法性判断算法为例演示该模型的用法:从空位出发沿方向连续跳过对方棋子,若终止于己方棋子则该方向可翻转,遇空位或标志位则不可。

‹ 上一章目录下一章 ›

全部 76 章