评估函数指的用来评估研究对象整体以及局部性能的一种数学函数模型。
实现方法就评价方法而言主要有两个类型。第一个是“终点评价”(End-Point Evaluation),即用你擅长的评价算法,简单地评价每个局面,而不受其他局面的影响。这通常会给出好的结果,但是非常慢。因此一些程序设计师用了下面的诀窍,称为预先计算(Pre-Computation),一阶评价(First-Order Evaluation),或棋子-格子数组(Piece-Square Tables)。
在我们对一个局面搜索最佳着法之前,我们认真检查棋局本身,在数组格子,棋子类型中保存计算值。在搜索过程中评价任何局面,只要简单地把棋子在数组中的值加起来就行了。我们不必每一步都重新计算它们的和,在把棋子从一个格子移到另一个格子时,可以用下面的公式更新评价值。1
评估函数的内容典型的评估函数,要把下列不同类型的知识整理成代码,并组合起来:
(1)子力(Material):在国际象棋中,它是子力价值的和,在围棋或黑白棋中,它是双方棋盘上棋子的数量。这种评价通常是有效的,但是黑白棋有个有趣的反例:棋局只由最后的子数决定,而在中局里,根据子力来评价却是很差的思路,因为好的局势下子数通常很少。其他像五子棋一样的游戏,子力是没有作用的,因为好坏仅仅取决于棋子在棋盘上的位置,看它是否能发挥作用。
(2)空间(Space):在某些棋类中,棋盘可以分为一方控制的区域,另一方控制的区域,以及有争议的区域。例如在围棋中,这个思想被充分体现。而包括国际象棋在内的一些棋类也具有这种概念,某一方的区域包括一些格子,这些格子被那一方的棋子所攻击或保护,并且不被对方棋子所攻击或保护。在黑白棋中,如果一块相连的棋子占居一个角,那么这些棋子就不吃不掉了,成为该棋手的领地。空间的评价就是简单地把这些区域加起来,如果有说法表明某个格子比其他格子重要的话,那么就用稍复杂点的办法,增加区域重要性的因素。
(3)机动(Mobility):每个棋手有多少不同的着法?有一个思想,即你有越多可以选择的着法,越有可能至少有一个着法能取得好的局势。这个思想在黑白棋中非常有效,国际象棋中并不那么有用。(它也曾被使用,但现在国际象棋程序设计师们把它从程序中去掉了,因为它看起来对整个局面的评价质量没什么提高。)
(4)着法(Tempo):这和机动性有着密切的联系,它指的是在黑白棋或连四子棋中(以及某些国际象棋残局中),某方被迫作出使局面变得不利的着法。和机动性不同的是,起决定作用的是着法数的奇偶而不是数量。
如何组合评价要素把评价要素组合起来,通常就和上面所说的一阶评价一样,评估函数是很多项的和,每一项是一个函数,它负责找到局面中的某个特定因素。为什么要用加法呢?因为这种简单的组合信息的方法在实践中非常好用。棋类程序应该充分尝试各种可能的评估函数:把各种胜利的可能性结合起来,包括很快获胜(考虑进攻手段),很多回合以后能获胜,以及在残局中获胜(国际象棋中就必须考虑通路兵的优势)的可能性,然后把这些可能性以适当的方式结合起来。2
本词条内容贡献者为:
李斌 - 副教授 - 西南大学