alpha-beta pruning

来源:互联网 发布:罗马2全面战争修改数据 编辑:程序博客网 时间:2024/06/05 07:33
  1. alpha-beta pruning 基于 min-max 算法;
  2. min-max 算法将游戏中对立的双方分别作为min方和max方(比如编写人机对抗象棋游戏软件时, 将计算机作为max方,人作为min方)。max节点的值等于其所有子节点中的最大值, min节点的值等于其所有子节点的最小值;
  3. 以树的形式将游戏的状态集表示出来,一般根节点为max节点,下一层为min节点,依次排列,即树的层次结构为max,min,max,min...(在多对手游戏中,可以将计算机视为max节点,其他对手均为min节点,树结构为max,min,min..., max, min, min, ...);
  4. 树的遍历采用深度优先搜索的形式(depth first search);
  5. alpha-beta pruning算法可以加快搜索,优化程序,因为它减少一些不必要的节点展开;
  6. alpha-beta pruning原理:
    • alpha是一个lower bound值(下确值),alpha值与max 节点联系在一起,即针对一个max node,它的值总是大于等于alpha;
    • beta 是一个upper bound值(上确值),alpha值与min 节点联系在一起,即针对一个min node,它的值总是小于等于alpha;
    • alpha的值总是增加的,beta的值总是减小的;
    • 对于根节点,alpha= -infinity, beta= infinity;
    • 从根节点开始,将alpha, beta的值向下传递, 先传递给最左边的子节点,依次向下,直到叶节点,此时叶节点的父节点为min节点, 因此beta值更新,beta=叶节点的值。如果该叶节点有兄弟节点,且兄弟节点的值小于该节点,则以兄弟节点的值更新beta。alpha值仍为 -infinity。接着将alpha,beta的值向上传递;遇到max节点时,更新alpha值, alpha=beta。检查max节点的其它子节点(min节点),如果子节点的值小于alpha,则进行修剪,该子节点的右分支不需要展开;若遇到min节点,检查它的子节点(max节点),若子节点的值大于beta,则进行修剪,该子节点的右分支不需要展开;
    • 简而言之,alpha的更新只会出现在max节点处,beta的更新只会出现在min节点处;树的最左边的一条分支是一定会展开的,对于其他的非根非叶节点,在进行判断时, 初始的alpha,beta值是从它们的父节点继承来的, 如果该节点是max节点,且它的值大于beta,则进行修剪,无需展开它的右分支,因为,它的父节点是min节点,值小于等于beta,这个父节点只会在子节点中寻找一个小于当前beta值的节点来更新beta。(这就是beta pruning)同理,如果该节点是min节点,且它的值小于alpha,则进行修剪,无需展开它的右分支。(alpha pruning);
    • 对于min节点的某一子节点,若它不可以进行修剪,则说明,它的值小于等于当前beta,应该用它的值对beta进行更新;对于max节点的某一子节点,若它不可以行修剪,则说明,它的值大于等于当前alpha,应该用它的值对alpha进行更新;
  • 该算法的伪代码如下图所示:


  • 对于一种特殊的情况:

此时,右边蓝色的min节点的值错误(应为0),返回的路径错误,对于这种临界情况的处理,可以将伪代码中,v与alpha,beta比较时的等于号去掉,即,if v>b/ if v<a; 这样就不会对最右边的节点(值为0)进行修剪。

0 0
原创粉丝点击