例析Alpha-Beta剪枝

来源:互联网 发布:mac midi软件 编辑:程序博客网 时间:2024/06/03 00:39

本文使用三子棋问题简单描述Alpha-Beta剪枝的原理。顺序是:先描述三子棋问题,接着描述三子棋问题的极小极大算法,最后描述三子棋问题的Alpha-Beta剪枝算法。


对三子棋问题描述如下:

下棋的一方是计算机(记为“MAX",执棋子“X”),另一方是人(记为”MIN“,执棋子“O”);

机器先手,双方轮流在九宫格中落子;

先取得三子一线的一方胜,可以是横向、竖向、主对角线方向或次对角线方向;

要求设计一个算法,为计算机找到最佳的走法。


评分函数(静态估计函数):

为了选出最佳的走法,须要量化棋局对于我方的优势,以便对可能的走法产生的后续棋局进行分析比较。为此,定义一个对棋局p的评分函数 f(p):

若p对于任何一方都不是获胜的棋局,则

f(p) = (将p中所有空格都放上MAX的棋子后,MAX三子成线的总数) — (将p中所有空格都放上MIN的棋子后,MIN三子成线的总数)。


极小极大算法描述如下:

1. 以空棋局为根节点,以某个棋局1步后的棋局的该棋局节点的子节点,广度优先生成一棵博弈树。然后从树根开始轮流给每层结点赋予MAX和MIN的称号。(本文限定博弈树的深度为3,即只分析双方各下一子的情况。)

2. 使用评分函数 f(p) 计算各个叶子节点分值。

3. 当叶子节点的分值计算出来后,再逆层向推算出各层非叶子节点的得分。推算的方法是:对于处于MAX层的节点,选其子节点中一个最大的得分作为该节点的得分,这是为了使自己在可供选择的方案中选一个对自己最有利的方案;对处于MIN层的节点,选其子节点中一个最小的得分作为该节点的得分,这是为了立足于最坏的情况,这样计算出的父节点的得分为倒推值。

4. 如此反推至根节点下的第一层孩子,如果其中某个孩子能获得在其兄弟节点中最大的倒推值,则它就是当前棋局最佳的走法。

下图描述了三子棋问题第一阶段的极小极大算法。节点右上角的值为其非叶子节点的倒推得分。



这样的极小极大算法,能够求出最佳走法,但在效率上不够理想。计算机每次走步都得估计往下N层棋局的所有情况并估值,层数虽然可以控制,但在大棋局(如五子棋,象棋等)游戏中如此生成的博弈树分支叶子相当庞大,由此有了在此基础上进行“剪枝”的改进算法–Alpha-Beta剪枝算法。此算法主要优点在于其在边生成博弈树时候边计算评估各节点的倒推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节点,即相当于剪去了博弈树上的一些分枝,从而节约了机器开销,提高了搜索效率。


Alpha-Beta剪枝算法:(再次强调此算法是建立在极小极大算法之上的)

1. 对于一个MIN层节点,若能估计出其倒推值的上确界Beta,并且这个Beta值不大于其的父节点(MAX层节点)的估计倒推值的下确界Alpha,即Alpha≥Beta,则就不必再扩展该MIN节点的其余子节点了,因为这些节点的估值对MIN父节点的倒推值已无任何影响了,这一过程称为Alpha剪枝。

下图描述了三子棋的Alpha剪枝。节点左上角符号为节点编号。


2. 对于一个MAX层节点,若能估计出其倒推值的下确界Alpha,并且这个Alpha值不小于其父节点(MIN层节点)的估计倒推值的上确界Beta,即Alpha≥Beta,则就不必再扩展该MAX节点的其余子节点了,因为这些节点的估值对MAX父节点的倒推值已无任何影响了。这一过程称为Beta剪枝。

3. 在实际的修剪过程中,Alpha、Beta的值根据当前可用的知识随时修正,但MAX层节点的倒推值下界Alpha永不下降,且总是等于当前已确定的其子节点倒推值(估值)中最大的值;MIN层节点的倒推值上界Beta永不上升,且总是等于其子节点当前最小的最终倒推值。

下图描述了Alpha值的更新。图左上角标识为节点编号。极小层节点⑨估值下界Beta值为1,极大层初始节点s的估值上界Alpha随即更新为1。



Alpha-Beta剪枝算法与极小极大算法的区别

极小极大算法通过计算所有子节点的分值后得出当前节点的分值,而Alpha-Beta剪枝算法使用某种方法估计Alpha、Beta的值,比较估得的对应Alpha、Beta值进行剪枝,减小计算量。


参考文献:

[1]. 林尧瑞,马少平.人工智能导论[M].北京:清华大学出版社, 1989:118-119;

[2]. http://blog.csdn.net/bxftyt/article/details/6227327