人工智能 α-β剪枝

​ α-β剪枝相当于是对极大极小法的优化,通过剪枝减少某些结点的访问,它的搜索结果与极小极大法一致。

α:极大结点的估值下界;随着子结点的生成,α只可能上升。
β:极小结点的估值上界;随着子结点的生成,β只可能下降。
α剪支:当某极小结点的β值 ≤ 其先辈的极大结点的α值,则终止该极小结点之下的搜索,并令其估值为β,这种剪支称α剪支。(被剪枝子的子结点若是Max结点,则称此次剪枝为α剪枝)
β剪支:当某极大结点的值α ≥ 其先辈的极小结点的β值,则终止该极大结点之下的搜索,令其估值为α,这种剪支称β剪支。

例题:

输入说明:

​ 第一行是一个数字n,后面跟着n行,每行3个数字,用空格分开每行的3个数字分别代表树的结点的id,估值,和父结点id。根结点的父结点id为-1。

输出说明:

​ 第一行是搜索得到的走步及其估值,用三个空格分隔的数字表示。如1 3 1;表示从结点1到3的走步,其估值为1。 后面若干行,代表剪掉的枝子。每行前面两个数字分别代表被剪掉的枝子的父结点和子结点,如果是α剪枝,则两个数字后面是字符串alpha(被剪枝子的子结点若是Max结点,则称此次剪枝为α剪枝),否则是beta。数字和字符串之间都用空格分隔。

输入样例:(篇幅原因,换行省略了)

39

1 0 -1 2 0 1 3 0 1 4 0 2 5 0 2 6 0 3 7 0 3 8 0 4 9 0 4 10 0 5 11 0 5 12 0 5 13 0 5 14 0 6 15 0 6 16 0 7 17 0 7 18 0 8 19 5 8 20 -3 9 21 3 9 22 3 10 23 3 11 24 0 11 25 2 11 26 2 12 27 -3 12 28 0 12 29 -2 13 30 3 13 31 5 14 32 4 14 33 1 14 34 -3 15 35 0 15 36 6 16 37 8 16 38 9 17 39 -3 17

输出样例:

1 3 1

9 21 alpha

5 11 beta

5 12 beta

5 13 beta

15 35 alpha

7 17 beta

​ 一开始不是很懂什么时候更新哪一层的 α α α 和 β β β,实际上它是在回溯回去的时候得到估值然后进行更新,且max层只更新 α α α,min层只更新 β β β,max层返回的是 α α α,min层返回的是 β β β(因为只有β被改变了,且这一层其实就是要确定的是这个值,这一层的α只是用来辅助判断剪枝的,因此不是返回α)。首先初值 α = − ∞ , β = + ∞ α=-∞,β=+∞ α=−∞,β=+∞,每次深搜的时候都将这一层的α和β传递给下面一层,在访问邻接点的时候之前就可以根据两者大小决定是否还需要访问其他的邻接点(即是否剪枝)。

​ 剪枝的条件都是当前结点的 α ≥ β α≥β α≥β,就不用递归访问它的邻接点了,概念上被剪枝子的子结点若是Max结点,则称此次剪枝为α剪枝。

​ 搜索过程是:进行dfs后,首先到达最左下面的叶子结点18,到达递归终止条件(18没有邻接点了),返回估值0到第四层min层,0比β的初值∞小,更新β为0(蓝色),此时 α = − ∞ α=-∞ α=−∞,不剪枝而接着访问8号结点的另一个邻接点19,返回值5,5比0大不更新,8号结点的所有邻接点访问结束,β估值确定为0(红色),因为8是min层结点,所以向上传递β到第三层4号结点,max层更新α,0比α初值-∞大,更新α为0(蓝色),此层的β是∞(黑色),不剪枝,接着递归访问4号结点的邻接点9,同时也把α=0,β等于∞传递给了第四层的结点9,此时也不满足剪枝条件,访问9的邻接点20,20是叶子返回了估值-3,结点9处β取 m i n ( − 3 , ∞ ) min(-3,∞) min(−3,∞)的-3,此时如果不剪枝的话将会访问结点21,但是此处已经有 α = 0 ≥ β = − 3 α=0≥β=-3 α=0≥β=−3,满足剪枝条件,所以无需访问21号结点,结点9的邻接点访问完了返回 β = − 3 β=-3 β=−3到第三层,此时α取 m a x ( 0 , − 3 ) = 0 max(0,-3)=0 max(0,−3)=0,结点4的所有邻接点访问结束,估值α确定为0(红色),返回α=0到上层结点2,2处 β = m i n ( 0 , ∞ ) = 0 β=min(0,∞)=0 β=min(0,∞)=0(蓝色),不满足剪枝条件,将 α = − ∞ , β = 0 α=-∞,β=0 α=−∞,β=0传递给5,不满足剪枝条件,将 α = − ∞ , β = 0 α=-∞,β=0 α=−∞,β=0传递给结点10,结点10访问邻接点22得到返回值3, β = m i n ( 0 , 3 ) = 0 β=min(0,3)=0 β=min(0,3)=0(蓝色),结点10没有其他邻接点,故β确定为0(红色),然后传递到结点5处, α = m a x ( − ∞ , 0 ) = 0 α=max(-∞,0)=0 α=max(−∞,0)=0(蓝色),此时满足 α = 0 ≥ β = 0 α=0≥β=0 α=0≥β=0的剪枝条件,结点5的邻接点11,12,13无需再被访问,因为访问111213只会让结点5的α更大,但是结点2的β不可能大于0了,所以剪枝,最终结点5的α确定为0(红色),并返回到结点2,结点2处 β = m i n ( 0 , 0 ) = 0 β=min(0,0)=0 β=min(0,0)=0,β确定值为0(红色),并返回到第一层的结点1处, α = m a x ( − ∞ , 0 ) = 0 α=max(-∞,0)=0 α=max(−∞,0)=0,结点1的左子树访问完毕,接着递归访问右子树。

​ 总结来说α和β的值的传递,先左子树,后返回父节点,再右子树,递归返回的时候即可更新估值,遍历完所有邻接点之后该结点的估值就最终确定了,进而返回上层,更新上层的估值。

import java.util.ArrayList;
import java.util.Scanner;
class Node{public int getEval() {return eval;}public int getId() {return id;}public void setEval(int eval) {this.eval = eval;}public void setId(int id) {this.id = id;}public Node(int id, int eval) {this.id = id;this.eval = eval;}private int id;//序号private int eval;//估值}public class Main {public static ArrayList<Node>[] tree;public static int next;public static ArrayList<String> ans;public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n,id,eval,root;tree = new ArrayList[1000];for(int i=0;i<1000;i++){tree[i]=new ArrayList<>();//对象需要提前new出来才能进行往列表里面添加}ans=new ArrayList<>();//储存答案字符串n=sc.nextInt();for(int i=0;i<n;i++){//采用邻接表的方式构建图id= sc.nextInt();eval=sc.nextInt();root=sc.nextInt();if(root==-1){//根节点Node temp=new Node(id,eval);//tree[0]=new ArrayList<>();tree[0].add(temp);}else{Node temp=new Node(id,eval);//tree[root]=new ArrayList<>();tree[root].add(temp);//将root的邻接点添加到下标为root处的ArrayList中}}int a=-0x3f3f3f3f,b=0x3f3f3f3f;//System.out.println(tree[0].get(0).getId() + " " + tree[0].get(0).getEval());int res=minmax(tree[0].get(0),1,a,b);//进行搜索//输出结果System.out.println(tree[0].get(0).getId() + " " + next + " "+ res);for(int i=0;i<ans.size();i++){System.out.print(ans.get(i));if(i+1!=ans.size()){System.out.println();}}sc.close();}//层数是奇数表示max层, 层数是偶数表示min层public static int minmax(Node node,int depth,int a,int b){int len=tree[node.getId()].size();if(len==0){//已经没有邻接点了,是叶子节点,直接返回估值return node.getEval();}for(int i=0;i<tree[node.getId()].size();i++){//对该节点的每一个邻接点进行dfsint temp;if(depth%2==1)//max层{if(a>=b){//符合剪枝条件,进行beta剪枝String s=String.valueOf(node.getId())+" " + String.valueOf(tree[node.getId()].get(i).getId()) + " beta";ans.add(s);//System.out.println(node.getId()+ " " +tree[node.getId()].get(i).getId() +" beta");}else{//不进行剪枝的话接着访问该结点的其他邻接点temp=minmax(tree[node.getId()].get(i),depth+1,a,b);if(temp>a){//得到返回值之后max层则更新a,next变量用于记录最终选择了哪个分支的走步a=temp;next=tree[node.getId()].get(i).getId();}}}else{//min层if(a>=b){String s=String.valueOf(node.getId())+" " + String.valueOf(tree[node.getId()].get(i).getId()) + " alpha";ans.add(s);//System.out.println(node.getId()+ " " +tree[node.getId()].get(i).getId() +" alpha");}else{temp=minmax(tree[node.getId()].get(i),depth+1,a,b);b=temp<b?temp:b;}}}if(depth %2==0) return b;//min层返回belse return a;//max层返回a}
}

人工智能 α-β剪枝相关推荐

  1. 人工智能AI实战100讲(五)-基于强化学习的自动化剪枝模型

    1介绍 文中涉及代码请参见: 人工智能AI-图像处理cv-基于强化学习的自动化裁剪 目前的强化学习工作很多集中在利用外部环境的反馈训练agent,忽略了模型本身就是一种能够获得反馈的环境.本项目的核心 ...

  2. 人工智能导论实训 第五章 AlphaBeta剪枝算法求解博弈树最优选择

    任务描述 本关任务:学习人工智能博弈算法中的 AlphaBeta 剪枝技巧,并基于 MinMax 算法编程实现如下图博弈树最优值问题的求解. 博弈树的输入形式为字符串:[A, [B, (E, 3), ...

  3. 人工智能博弈树极大极小搜索算法alpha-beta剪枝实现五子棋,带禁手

    由于2020的特殊情况,导致了一个被拖了挺久的大作业.... 五子棋其实大家很多时候会在闲暇时刻和朋友随便玩玩,这不仅让我回忆起了高中时候摸鱼休息就喜欢和同学在自己打的格子中用铅笔来一盘五子棋,回想起 ...

  4. 【人工智能】—局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法

    Local search algorithms (局部搜索算法) 局部搜索算法 内存限制 局部搜索算法 示例:n-皇后 爬山算法 随机重启爬山 模拟退火算法 局部剪枝搜索 遗传算法 小结 局部搜索算法 ...

  5. 人工智能算法模型--Alpha-Beta剪枝算法学习笔记

    ⬜⬜⬜ 

  6. [程序设计]基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。

    ⬜⬜⬜ 

  7. 工具箱支持汽车质量人工智能

    工具箱支持汽车质量人工智能 Toolkit supports automotive-quality AI NXP半导体公司推出了一个新的深度学习工具包,叫做eIQ Auto.NXP正在寻求通过使其工具 ...

  8. 人工智能和区块链的融合

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. AI与区块链结合,可能性有多大? 人工智能和区块链是促进各行业创新和转型的主要技术,对这一点各行业已达成共识.每种技术都 ...

  9. 深度学习发展下的“摩尔困境”,人工智能又将如何破局?

    前不久,微软和英伟达推出包含5300亿参数的语言模型MT-NLG,这是一款基于 Transformer 的模型被誉为"世界上最大.最强的生成语言模型". 毫无疑问,这是一场令人印象 ...

最新文章

  1. operate XML file (Open,Insert)
  2. omct问题之-webapps下多出的ROOT目录
  3. Safair css hack
  4. JVM调优总结(二)
  5. html页面按钮删除一条数据库,需要添加一个删除按钮到一个HTML表格从数据库中删除记录与消息...
  6. macbook历代_苹果MacBook Pro为什么越来越贵?历代回顾与新MBP简评
  7. linux ps命令使用详解
  8. 一款由css3和jquery实现的卡面折叠式菜单
  9. win10右键卡顿原因_个个都能惊呆你WIN10小技巧分享(无需安装第三方软件)
  10. Redis集群原理详解
  11. ArchSummit 北京 2016之lookalike主题
  12. 多个端口指定多个目录。花生壳多个域名多个网站
  13. CityEngine + Python自动化建模原理【系列文章之三】
  14. 编译《视觉SLAM十四讲》ch5里joinmap出现 ***/anaconda3/lib/libpng16.so.16:‘inflateValidate@ZLIB_1.2.9’未定义的引用
  15. Selection dont contain a main type
  16. 考研题目 第二章线性表
  17. 鸿蒙系统首批机型,鸿蒙系统名单确认,麒麟9000机型首批,众多机型要说再见!...
  18. Java实现之普利姆(Prim)算法
  19. 解决Spark窗口统计函数rank()、row_number()、percent_rank()的OOM问题
  20. linux下tar.gz、tar、bz2、zip等命令小结

热门文章

  1. 大话设计模式(php版)第五章——依赖倒装原则
  2. 4.3 期货每日早盘操作建议
  3. jsp:关于ArrayList
  4. 罗克韦尔(AB)PLC与MySQL/SQLServer/PostgreSQL数据库对接
  5. 罗克韦尔PLC编程软件ControlLogix平台
  6. idea启动后项目启动报错,必须得记录一下
  7. 70 Three.js 导入STL格式的模型
  8. 微信小程序-数据库操作
  9. CAD图纸转为PDF格式打开或打印格式改变怎么办?
  10. 说一下浏览器垃圾回收机制?