人工智能之AlphaBeta剪枝算法
任务描述
本关任务:学习人工智能博弈算法中的 AlphaBeta 剪枝技巧,并基于 MinMax 算法编程实现如下图博弈树最优值问题的求解。
博弈树的输入形式为字符串:[A, [B, (E, 3), (F, 12), (G, 8)], [C, (H, 2), (I, 4), (J, 6)], [D, (K, 14), (L, 5), (M, 2)]],其中 [] 里的第一项为结点名称,后面的 [] 或 () 为子结点,而 () 里边则为叶子结点名称及其值。通过 Python 中的 ast.literal_eval 模块可以将该字符串数据解析为数据在 Python 数据类型里本应该存在的形式,在本例子中即为列表和元组,使用方法可见文件目录中的 testAlphaBeta.py 文件。
学员需要将列表和元组组成的数据构建成一棵如上图所示的博弈树,然后求解最优值,该博弈树的根结点为 Max 层,上图所示的最优结点为 B ,最优值为 3 。
相关知识
为了完成本关任务,你需要掌握:1. alpha-beta 剪枝原理,2.问题求解思路。
alpha-beta 剪枝原理
极小极大值算法必须检查博弈树的全部结点,也就是游戏的全部状态,显然,搜索时间是指数级增长的。虽然我们无法消除指数级的运算规模,但是可以通过一些剪枝策略有效地将其减半,换言之,可能不需要遍历博弈树中每一个结点就可以计算出正确的极小极大值,αβ剪枝 Alpha-Beta 就是其中的一种。
αβ剪枝会减掉那些不可能影响决策的分支,最后返回和极小极大值算法同样的结果。上图的博弈树用αβ剪枝过程表达如下,每个结点上面标出了可能的取值范围,B下面的第一个叶子结点为3,剩余两个结点分别为12和8,因此B的取值范围更新为[3,3],现在由此可以推断根结点A的取值范围为[3,+∞)。然后结点C下面的第一个叶子结点为2,因此C这个 MIN 结点的值最多为2,而又已知根结点A的最低取值为3,所以结点C的余下后继结点无需再考虑,这就是αβ剪枝的一个具体实例。余下的博弈树按照之前的思想逐步更新结点的取值范围,减掉不可能影响根结点取值的分支。
将上述过程用 MINMAX 公式化表达如下:
其中结点C的两个没有计算的结点的值分别为x和y,即可以得出根结点的值以及因此做出的极小极大决策与被减掉的叶节点x和y无关。
极小极大搜索时深度优先的,所以在任何时候都只需考虑树中某一路径上的结点,αβ剪枝的名称取自描述这条路径上的回传值的两个的参数:
α:到目前为止路径上发现的 MAX 的最佳选择(即极大值)
β:到目前为止路径上发现的 MIN 的最佳选择(即极小值)
αβ剪枝策略在搜索中不断更新α和β的值,并且当某个结点的值分别比目前的 MAX 的α或者 MIN 的β值更差的时候,减掉此结点剩下的分支(即终止递归搜索),完整算法的伪代码如下图所示:
问题求解思路
详细分析输入数据与博弈树的对应关系,使用递归的方法创建一棵博弈树,然后按照以上描述的剪枝过程完成以下各个函数功能,最终完成博弈树的最优值求解问题。
编程要求
本关的编程任务是补全右侧代码片段 buildTree 、minmax_with_alphabeta 、max_value 、min_value 、get_value 和 isTerminal 中 Begin 至 End 中间的代码,具体要求如下:
在 buildTree 中,以递归的方式创建一棵博弈树,初始传入参数为博弈树的根结点 root ,以及解析后的列表与元组的组合数据 data_list;
在 minmax_with_alphabeta 中,基于 AlphaBeta 剪枝思想实现 MinMax 算法主体部分,初始传入参数为博弈树的根结点,函数最后返回根结点的最优决策结点;
在 max_value 中,计算该博弈树结点的子结点中的最大的评估值,并返回,传入参数为结点以及 Alpha 和 Beta 区间上下限;
在 min_value 中,计算该博弈树结点的子结点中的最小的评估值,并返回,传入参数为结点以及 Alpha 和 Beta 区间上下限;
在 get_value 中,返回结点 node 的值,即为 node.val;
在 isTerminal 中,判断某结点是否为最终结点(叶子结点),也就是说是否有子结点。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入:
[A, [B, (E, 3), (F, 12), (G, 8)], [C, (H, 2), (I, 4), (J, 6)], [D, (K, 14), (L, 5), (M, 2)]]
预期输出:
B 3
代码
# -*- coding:utf-8 -*-import copy # 注意对象的深拷贝和浅拷贝的使用!!!
from ast import literal_evalclass GameNode:'''博弈树结点数据结构成员变量:name - string 结点名字val - int 结点值children - list[GameNode] 子结点列表'''def __init__(self, name='', val=0):self.name = name # charself.val = val # intself.children = [] # list of nodesclass GameTree:'''博弈树结点数据结构成员变量:root - GameNode 博弈树根结点成员函数:buildTree - 创建博弈树'''def __init__(self):self.root = None # GameNode 博弈树根结点def buildTree(self, data_list, root):'''递归法创建博弈树参数:data_list - list[] like this ['A', ['B', ('E', 3), ('F', 12)], ['C', ('H', 2)], ['D', ('K', 14)]]root - GameNode'''#请在这里补充代码,完成本关任务#********** Begin **********#for i in range(1,len(data_list)):if type(data_list[i]) == list:root.children.append(GameNode(data_list[i][0]))self.buildTree(data_list[i],root.children[i-1])else:root.children.append(GameNode(data_list[i][0],data_list[i][1]))#********** End **********#class AlphaBeta:'''博弈树结点数据结构成员变量:game_tree - GameTree 博弈树成员函数:minmax_with_alphabeta - 带AlphaBeta剪枝的极大极小值算法,计算最优行动max_value - 计算最大值min_value - 计算最小值get_value - 返回结点的值isTerminal - 判断某结点是否为最终结点'''def __init__(self, game_tree):self.game_tree = game_tree # GameTree 博弈树def minmax_with_alphabeta(self, node):'''带AlphaBeta剪枝的极大极小值算法,计算最优行动参数:node - GameNode 博弈树结点返回值:clf - GameNode 最优行动的结点'''#请在这里补充代码,完成本关任务#********** Begin **********#clf = self.max_value(node,-10000,10000)for child in node.children:if child.val == clf:return child;#********** End **********#def max_value(self, node, alpha, beta):'''计算最大值参数:node - GameNode 博弈树结点alpha - int 剪枝区间下限值beta - int 剪枝区间上限值返回值:clf - int 子结点中的最大的评估值'''#请在这里补充代码,完成本关任务#********** Begin **********#if self.isTerminal(node):return self.get_value(node)clf = -10000for child in node.children:clf = max(clf,self.min_value(child,alpha,beta))if clf >= beta:return clfalpha = max(alpha,clf)node.val = clf;return clf#********** End **********#def min_value(self, node, alpha, beta):'''计算最小值参数:node - GameNode 博弈树结点alpha - int 剪枝区间下限值beta - int 剪枝区间上限值返回值:clf - int 子结点中的最小的评估值'''#请在这里补充代码,完成本关任务#********** Begin **********#if self.isTerminal(node):return self.get_value(node)clf = 10000for child in node.children:clf = min(clf,self.max_value(child,alpha,beta))if clf <= alpha:return clfbeta = min(clf,beta)node.val = clf;return clf;#********** End **********#def get_value(self, node):'''返回结点的值参数:node - GameNode 博弈树结点返回值:clf - int 结点的值,即 node.val'''#请在这里补充代码,完成本关任务#********** Begin **********#return node.val;#********** End **********#def isTerminal(self, node):'''判断某结点是否为最终结点(无子结点)参数:node - GameNode 博弈树结点返回值:clf - bool 是最终状态,返回True,否则返回False'''#请在这里补充代码,完成本关任务#********** Begin **********#if node.val == 0:return Falseelse:return True#********** End **********#
总结
去廖雪峰网站看python基础语法,了解list和tuple即可做这个作业
人工智能之AlphaBeta剪枝算法相关推荐
- python井字棋ai_实现AI下井字棋的alpha-beta剪枝算法(python实现)
代码参考自中国大学mooc上人工智能与信息社会陈斌老师的算法,我在原来的基础上增加了玩家输入的异常捕获 AlphaBeta剪枝算法是对Minimax方法的优化,能够极大提高搜索树的效率,如果对这个算法 ...
- AlphaBeta剪枝算法求解博弈树最优选择 头歌实验平台
AlphaBeta剪枝算法求解博弈树最优选择 头歌实验平台 前言 一.AlphaBeta剪枝是什么? 1.由来, 最大最小决策树 2.发展 3. AlphaBeta剪枝 二.实验算法伪代码 三.实验算 ...
- Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)
前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...
- python alpha beta 剪枝_一看就懂的 Alpha-Beta 剪枝算法详解
Alpha-Beta剪枝用于裁剪搜索树中没有意义的不需要搜索的树枝,以提高运算速度. 假设α为下界,β为上界,对于α ≤ N ≤ β: 若 α ≤ β 则N有解. 若 α > β 则N无解. ...
- 极大极小算法和AlphaBeta剪枝算法
作为菜鸟,先贴上参考博文: 1.极小极大算法 2.<<CS 161 Recitation Notes - The Minimax Algorithm>> 3.<PC游戏编 ...
- Alpha-Beta剪枝算法在直棋中的运用
游戏说明 详见本人的项目描述页面:https://gitee.com/liuweilhy/NineChess/blob/master/Readme.md 我做了个简单的GUI如下图. 点击这里可以下载 ...
- 四国军棋引擎开发(6)alpha-beta剪枝算法
在讲alpha-beta剪枝算法之前先要了解最大最小算法,在棋类游戏中,给每一个局面打一个分数,轮到自己下时会选择有利于自己的下法,即选择局面分数高的,而对手会选择更加不利于自己的局面,即分数最低的. ...
- 一看就懂的Alpha-Beta剪枝算法详解
原贴:http://blog.csdn.net/tangchenyi/article/details/22925957 Alpha-Beta剪枝算法(Alpha Beta Pruning) [说明] ...
- 对抗搜索之Alpha-Beta剪枝算法
什么是对抗算法 为了解决信息确定.全局可观察.竞争对手轮流行动.输赢收益零和假设下的两人博弈问题而提出的一种算法.即零和博弈,所谓零和博弈是博弈论的一个概念,属非合作博弈.指参与博弈的各方,在严格竞争 ...
- 象棋ai算法(极小-极大值搜索、负极大值函数、Alpha-Beta剪枝算法、渴望算法)
ai的思考过程是怎样的?自然就是遍历所有的可能,找出相对最好的一种着法.我们首先要实现这个功能,之后再优化算法,使得效率更高. 本文介绍的算法: 极小-极大值搜索 负极大值函数 Alpha-Beta剪 ...
最新文章
- codeforces 711B - Chris and Magic Square(矩阵0位置填数)
- OpenGL小试牛刀第一季
- 散文绘画集《心欢喜,灵快乐》研讨会在京举行
- C和汇编混合编程--------函数调用后ebp、esp值问题
- tesseract win 训练
- C程序100例 第二题
- c语言作业与实验报告,c语言实验报告
- linux中firewalld之direct rules和rich rules(转发,伪装)
- 组织变革-时代发展的产物
- 01-快速入门webpack模块化打包工具
- 当android调试遇到ADB server didn't ACK以及顽固的sjk_daemon进程
- error C2533: “XXX::{ctor}”: 构造函数不能有返回类型
- 信号与系统知识点记录(P4-P5)
- python(re 模块-正则表达式)
- SAP---安装方法
- django 缓存cache配置注意事项
- A3Mall开源商城系统
- ffmpeg、ffplay、ffprobe 常用命令详解(音视频必备)
- COMSOL封闭腔内流固耦合-固体运动(个人学习记录)
- 常用电子元器件的特性及使用办法
热门文章
- java获取当前周数_java获取周数的方法
- Aliplayer直播截图+水印
- linux 检查网卡命令,linux shell查看网卡命令详解
- cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-q3d_8t8e\opencv\modul
- Python 筛法求素数
- oracle---SQLPlus命令操作用法详解
- Java Swing中国象棋AI(人机和人人对战)
- 01、CentOS 7 镜像文件各个版本区别及介绍
- jQuery获取表单数据
- 互联网名词解释(通用、运营、广告、APP推广、移动推广、APP运营、商务模式、职位、客户管理)