开局库可以查询到,则提取开局库的对应走法而
不必展开树·可以避免在开局时由于搜索深度的
不足而带来战略上的失误·
评估函数是模式识别和智能算法应用最为广
泛的领域·不管多么复杂的评估函数,都可以表示
为一个多项式·评估函数一般来说必须包括5 个
方面的要素[1 ] ,分别是固定子力值、棋子位置值、
棋子灵活度值、威胁与保护值、动态调整值·每一
方面的值又是由许多参数值构成的,例如固定子
力值就包括7 类棋子的值·即使最简单的评估函
数也有20 多个参数,将这些值线性地组合在一起
得到最终的评估值,通常依赖于编程者的棋类知
识,这就带来很大的局限性,通过手动调整很难达
到全局最优·
为了解决这个参数优化的问题,本文在中国
象棋计算机博弈领域引入了遗传算法·通过离线
自学习训练得到最佳参数组合·
2 基于自适应遗传算法的象棋评估
函数
有学者已经把遗传算法引入了评估函数[5 ] ,
试图学习棋子之间内部的动态联系,但效果不是
很理想·本文仅仅用遗传算法做参数优化,并且为
了加强遗传算法的局部搜索能力,在进化过程中
采用了自适应遗传算法·
2. 1 遗传算法
遗传算法( Genetic Algorithm , GA) 是近些年
发展起来的一种崭新的全局优化算法,由Holland
教授首次提出[6 ]
·它借用了生物遗传学的观点,
通过选择、遗传、变异等作用机制,实现个体适应
性的提高,体现了自然界中“物竞天择、适者生存”
的进化过程·遗传算法吸引了大批的研究者,迅速
推广到优化、搜索、机器学习等方面·
传统的爬山法[7 ] 是通过对参数小范围的试
探来寻求最优解,并且受初始采样值取值范围和
单方向搜索的限制,很容易陷入局部最优·
模拟退火是一种基于蒙特卡罗迭代求解的启
发式随机搜索算法,它试图通过模拟高温物体退
火过程的方法,寻找优化问题的全局最优解或近
似全局最优解·它可以避开局部最优点,但是致命
的缺点是速度太慢,运行时间太长·
遗传算法同时使用多组搜索信息, 具有很好
的全局搜索能力, 将重点集中在性能较高的地
方, 具有很快的搜索速度; 而且遗传算法的鲁棒
性也明显优于前两种算法, 最有可能在象棋中取
得成功·
2. 2 适应度函数的计算锦标赛算法
众所周知,遗传算法在进化搜索中基本不需
要外部信息,仅以适应度函数(fitness function) 为
依据,利用种群中每个个体的适应度函数来进行
搜索·一般而言,适应度函数是由目标函数变换而
成的·但是象棋的评估比较复杂,很难像一般优化
问题那样找到真实准确的目标函数,因此本文设
计了一个专门用于棋类优化问题的适应度函数计
算方法锦标赛算法·
首先,要对自己开发的计算机博弈软件进行
拓展,拓展后的程序包含了两个评估函数,但是搜
索引擎、走法生成都是共用的·两个评估函数通过
读取不同的参数组进行比赛,决出胜负·这样,就
可以通过竞赛来确定下棋双方的适应度:在相同
适应度的初始状态下,赢了对适应度进行加运算
(奖赏) ,输了对适应度进行减运算(惩罚) ,和了则
不操作·这样就解决了适应度函数不好确定的问
题,实现了通过适应度函数来决定个体的优劣程
度,体现了自然进化中的优胜劣汰原则·
遗传算法处理的对象主要是个体[8 ] ,个体包
括一组染色体串,每一个染色体对应于评估函数
中的一个参数值·将染色体串解码到评估函数中
即可求得评估值·染色体则是一个基因数组,基因
的长短决定编码的精度·
至于染色体串的编码方式,本文选用的是通
用的二进制编码方式,由于对解的精度要求不高,
其编码和解码都可以快速简单地实现,而且二进
制编码进行交叉变异操作时也比其他编码更加简
捷方便·
2. 3 加快优化进程的相关举措
(1) 由于加入开局库,会使比赛时间变得很
长;但如果没有开局库,对下棋过程的质量又会有
很大影响,不能真正反映个体的好坏·所以本文对
初始的比赛环境做了改动,初始状态是由包括许
多红黑局面相当的中局数组构成,在进化了规定
数量的代数以后,会自动修改比赛环境·
(2) 由于计算机之间的比赛中经常遇到死循
环,所以本文也对循环加入了一些规则进行判断,
避免了这种情况的出现·
(3) 由于象棋中的胜负是依据将或帅的存在
与否进行判断,所以将和帅的值默认为无穷大,并
不参与进化·
以上这些做法都有利于提高比赛的精彩程度,
更快地选出真正优秀的个体,加快进化的速度·
2. 4 遗传操作过程
(1) 锦标赛选择
遗传算法可采用的选择方法很多,有轮盘赌选
择法、局部选择法、截断选择法和锦标赛选择法,本
文采用了锦标赛选择法和精英选择策略[9 ]
·每两个
个体之间进行先后手互换的两场比赛,取出适应度
最高的一些精英作为下一代的父个体·锦标赛模式
的缺点在于速度过慢·为了加快速度,本文对于标
准锦标赛做了改进·将包含m 个个体的种群随机
分成n 组,在组内进行锦标赛训练,每个组的冠军
为筛选出的最佳,对n 个冠军做交叉和变异操作
产生m - n 个新个体,填满并形成一个新种群·做
了这样的优化后,以包含60 个个体的种群为例,在
保证优胜劣汰原则的基础上,可以节省约75 %的
时间·
(2) 均匀交叉
交叉方法很多, 有单点交叉、多点交叉、顺序
交叉、循环交叉等等,为了使交叉在便于操作的同
时更加广义化,本文选用了均匀交叉,参数之间的
间隔点作为潜在的交叉点·均匀交叉根据交叉率
pc 随机地产生与参数个数等长的0 - 1 掩码, 掩
码中的片断表明了哪个父个体向子个体提供变量
值·通过这个掩码和选择的父个体一起确定了子
个体·
(3) 变异
变异是指以等于变异率pm 的概率改变一个
或几个基因,对于二进制串来说,就是根据变异率
实现基因的0 - 1 翻转·变异是一种局部随机搜
索,与选择/ 交叉算子结合在一起,保证了遗传算
法的有效性,使遗传算法具有局部的随机搜索能
力·同时使得遗传算法保持种群的多样性,以防止
出现非成熟收敛·
2. 5 自适应遗传算法
在整个遗传算法实现的过程中,交叉率pc 和
变异率pm 的选择是影响遗传算法行为和性能的
关键所在,直接影响算法的收敛性·pc 越大,新个
体产生的速度就越快,然而pc 过大时遗传模式被
破坏的可能性也越大, 使得具有高适应度的个体
结构很快就会被破坏;但是如果pc 过小, 会使搜
索过程缓慢,以至停滞不前·对于变异率pm ,如果
pm 过小,就不易产生新的个体结构; 如果pm 取
值过大,那么遗传算法就变成了纯粹的随机搜索
算法·但是, 目前还没有通用的能够一次性确定
pc 和pm 的方法·针对不同的优化问题,需要反复
通过实验来确定pc 和pm , 这是一件非常繁琐的
工作·为此, 本文引进了自适应遗传算法[10 ]
(AdaptiveGA ,AGA) , pc 和pm 能够随着适应度
自动改变·
pc 和pm 的计算公式如下:
式中, pc1 = 019 , pc2 = 016 , pm1 = 011 , pm2 =
01001·f max为群体中最大的适应度值; f avg为每
代群体的平均适应度值; f′为要交叉的两个个体
中较大的适应度值; f 为要变异个体的适应度值·
这种自适应的pc 和pm 能够提供相对某个
解的最佳pc 和pm ,在保持群体多样性的同时,保
证了遗传算法的收敛性·
3 实验结果
为了测试进化的效果,设计了一个测试实验,
实验是由100 代、200 代、300 代、400 代、500 代、
600 代的冠军和两个随机选手组成一个小组, 进
行循环赛,每两个对手之间都要进行互换先后手
的两场比赛·胜者积分加1 ,负者减1·最后的积分
如图1 所示·
如图1 所示,得分随着代数的增加单调增加,
而参加比赛的随机选手基本没有取胜的机会·在
进化到600 代时,本文给出了一部分训练的结果,
此时的固定子力值如表1 所示·
可以看到,固定子力值的大小排列顺序符合
人的经验,车的值略大于马和炮的和,马和炮的值
都约等于象和士的和,这都是象棋高手默认的规
律·
用600 代的参数组和完全用经验设定的参数
组的程序进行了比赛,结果600 代的胜率明显占
优·
4 结 论
在中国象棋的评估函数中,引入了自适应遗
传算法优化参数组合,它加强了传统遗传算法的
局部搜索能力,避免了传统的爬山法容易陷入局
部最优的缺点,而且不像模拟退火那样收敛过慢·
它同时维护一组参数,既可以继承已有参数中的
优良内容,又可以避免因局部振荡而失败,并且具
有很好的收敛速度·
当程序拥有进化参数的评估函数时棋力明显
提高,每当加入了一些新参数,丰富了棋子之间联
系的奖励和惩罚时,都可以用自适应遗传算法进
行优化,而不是传统上的手工调整,可以最大限度
发挥评估函数的作用·这也为开发出高水平的计
算机博弈程序打下了坚实的基础·