玩家希望搜索程序能够最大化从指定位置开始走,获得胜利的概率(或者至少要保平)。程序不会仅仅考虑当时的局面状态以及当时的可行走法,还需要考虑对手会采取的任何对策。程序需要假设对手会采取最完美的走法,并且不会犯错。程序假设存在一个评估函数score(state,player),返回一个整数,表示局面状态的得分,分数越小(可以为负)表示状态越差。
扩展博弈树时也需要考虑n步之后的局面状态。树的每一级轮流标注为MAX层级(目标是最大化局面状态的得分,使得对玩家有利)和MIN层级(目标是最小化局面状态的得分,使得对对手有利)。在每一级,如果是玩家走,那么程序选择最大化score(state,initial)的走法,如果是对手走的话,那么程序将会假设对手足够聪明,所以选择最小化score(state,initial)的走法。Minimax算法如图7-15所示。
图 7-15 Minimax详解输入/输出
输入
算法从博弈树中的一个初始位置开始,假设它能够(a)选择某个局面状态的所有可行走法,以及(b)评价某个局面状态,表示从玩家来看这个状态的质量。得分越少则质量越差。算法会预测固定步数,这个数目叫做追寻深度。
输出
返回所有可行走法中最能使得玩家赢得比赛的走法,由评估函数决定。
假设
评估局面状态是非常复杂的,程序员需要依靠评估函数来选择最好的局面状态。事实上,在设计智能程序中,开发一个精确的评估函数,例如象棋、跳棋,或者黑白棋,是一件非常困难的事情。我们假设已经有一些这样的函数。