alpha-beta pruning
来源:互联网 发布:罗马2全面战争修改数据 编辑:程序博客网 时间:2024/06/05 07:33
- alpha-beta pruning 基于 min-max 算法;
- min-max 算法将游戏中对立的双方分别作为min方和max方(比如编写人机对抗象棋游戏软件时, 将计算机作为max方,人作为min方)。max节点的值等于其所有子节点中的最大值, min节点的值等于其所有子节点的最小值;
- 以树的形式将游戏的状态集表示出来,一般根节点为max节点,下一层为min节点,依次排列,即树的层次结构为max,min,max,min...(在多对手游戏中,可以将计算机视为max节点,其他对手均为min节点,树结构为max,min,min..., max, min, min, ...);
- 树的遍历采用深度优先搜索的形式(depth first search);
- alpha-beta pruning算法可以加快搜索,优化程序,因为它减少一些不必要的节点展开;
- 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
- alpha-beta pruning
- alpha-beta pruning
- Alpha-Beta剪枝(Alpha Beta Pruning)
- Alpha-Beta剪枝算法(Alpha Beta Pruning)
- 【论文概述】analysis of alpha-beta pruning
- Alpha-Beta
- 什么是beta,alpha测试
- alpha-beta剪枝搜索
- 重读Alpha-Beta算法
- Alpha-Beta搜索
- alpha, beta, RC含义
- Alpha测试Beta测试
- Alpha 与 Beta
- 例析Alpha-Beta剪枝
- Alpha-Beta 剪枝算法
- 详解alpha-beta算法
- Alpha-Beta搜索
- Alpha-beta Search
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!
- http://photowoo.com/read/4093885
- 正则表达式的回溯数和嵌套数
- VC消息映射机制小结
- codeforces 222B Cosmic Tables
- alpha-beta pruning
- 关于WinCE6.0 应用程序中直接访问物理地址
- win7+ vs2010+opencv2.4.7的安装及基本配置
- SQL Server 2008突然无法正常启动
- 在js中取出对象中的值
- 多文件上传
- java连接AD域
- Java封装
- java线程中的yield