算法的乐趣 · 第七十四节
《算法的乐趣》第七十四节
本节讲五子棋AI的棋型识别、估值与搜索算法。SearchPatterns()遍历四个方向上的所有线,交给AnalysisLine()统一识别:先找连续棋子的起止位置……
本节讲五子棋AI的棋型识别、估值与搜索算法。SearchPatterns()遍历四个方向上的所有线,交给AnalysisLine()统一识别:先找连续棋子的起止位置,再向两端数空位,连子数加空位数不足5的忽略;够5的,两端都有空位且一端空位足够则判为"活",否则判为"冲"。
估值时给不同棋型打分,并为棋盘每个点设位置分(边界为0,越靠中间越高),避免开局时计算机乱落在边上;评估分超过9000视为必胜局面直接返回。
搜索沿用带α-β剪枝的负极大值算法。走法生成即遍历所有空位并排除"禁手"。禁手用数据模型描述:记录相关棋子个数和相对落子位置的方向步进偏移,预先整理成禁手表,逐一匹配判断。
以上代码接入棋类框架即得到控制台五子棋程序,改几个常量即可换成15×15标准棋盘,但计算量会大增。
本章总结指出博弈树搜索是棋类AI的基础,改进方向包括位棋盘数据模型、PVS或MTD(f)等搜索算法、开局库与估值函数优化。作者强调复杂神秘的东西往往有简单的理论支撑,棋力差距主要在细节处理。