人工智能之AlphaBeta剪枝算法

article/2025/9/28 22:44:09

任务描述

本关任务:学习人工智能博弈算法中的 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即可做这个作业


http://chatgpt.dhexx.cn/article/Z7GFdg7J.shtml

相关文章

α-β剪枝算法

在写之前首先感谢&#xff1a;https://blog.csdn.net/wenjianmuran/article/details/90633418 这里主要介绍minmax算法和α-β剪枝,相当于对一下文章的翻译&#xff1a; α-β剪枝 Minmax算法 正文&#xff1a; 看了很多关于α-β剪枝算法&#xff0c;大致明白了其中的含义…

α-β剪枝算法简单原理说明

看了一大堆文章实在看不懂&#xff0c;看视频也看不懂&#xff0c;但是看着看着突然顿悟了。这篇文章只讲大概的原理&#xff0c;不讲具体过程。 好了既然会搜这个算法&#xff0c;想必已经知道最大值最小值算法了&#xff08;不知道就去搜吧&#xff09;。这里直接讲例子。 …

alpha-beta剪枝算法

实验报告 alpha-beta剪枝算法 姓名&#xff1a;张楚明 学号&#xff1a;18342125 日期&#xff1a;2021.01.15 摘要 本实验将搜索深度为4的Alpha-Beta剪枝算法应用于中国象棋中黑方走棋&#xff0c;实现了中国象棋的人机博弈。博弈过程中综合考虑了棋力、对敌方棋子的攻击力、…

透析极大极小搜索算法和α-β剪枝算法(有案例和完整代码)

文章目录 前言minimax算法完整代码算法思想代码实现算法优化 α-β剪枝算法完整代码算法思想代码实现算法对比更多案例 结语 前言 先做了一版五子棋的小项目&#xff0c;后面又做了一个功能更强大的中国象棋的项目&#xff0c;但是始终都没有实现一版“智能”AI。 明知道这类博…

决策树后剪枝算法(二)错误率降低剪枝REP

​  ​​ ​决策树后剪枝算法&#xff08;一&#xff09;代价复杂度剪枝CPP  ​​ ​决策树后剪枝算法&#xff08;二&#xff09;错误率降低剪枝REP  ​​ ​决策树后剪枝算法&#xff08;三&#xff09;悲观错误剪枝PEP  ​​ ​决策树后剪枝算法&#xff08;四&…

C++实现的基于αβ剪枝算法五子棋设计

资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/85883881 资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/85883881 基于αβ剪枝算法的五子棋 五子棋介绍 简介&#xff1a; 五子棋是世界智力运动会竞技项目之一&#x…

决策树后剪枝算法(四)最小错误剪枝MEP

​  ​​ ​决策树后剪枝算法&#xff08;一&#xff09;代价复杂度剪枝CPP  ​​ ​决策树后剪枝算法&#xff08;二&#xff09;错误率降低剪枝REP  ​​ ​决策树后剪枝算法&#xff08;三&#xff09;悲观错误剪枝PEP  ​​ ​决策树后剪枝算法&#xff08;四&…

计算机博弈 基础算法 阿尔法-贝塔剪枝算法 α-β剪枝算法

计算机博弈大赛中 α-β剪枝算法剪枝算法是极大极小算法的一种优化&#xff0c;可以更快的搜索博弈树 预备知识&#xff1a; 广度优先搜索(BFS) 深度优先搜索(DFS) 极大极小算法(MaxMin算法) 介绍 剪枝算法来源于极大极小算法&#xff0c;在博弈树分枝过多时可以使用这个方法…

卷积神经网络通道剪枝算法小结

一、剪枝分类 目前常见的模型剪枝算法主要分成两类&#xff0c;即非结构化剪枝与结构化剪枝&#xff1b;在不少的神经网络加速器中已经应用了这些剪枝算法&#xff0c;早期常见的是非结构化剪枝&#xff0c;例如MIT的韩松组的前几年的相关工作中就有此类应用&#xff0c;但是在…

最大最小法及α-β剪枝算法图解

&#xff08;网上讲的都不是很好理解&#xff0c;贡献一下之前听慕课做的笔记&#xff0c;适合初学者比较简洁明了。&#xff09; 要想理解α-β剪枝算法&#xff0c;必须从最大最小法的博弈问题讲起&#xff01;注意不懂的同学不要跳过这一节。 最大最小法 场景&#xff1a;…

剪枝算法实现一字棋-C++

博弈树 alpha & beta剪枝算法实现一字棋 剪枝算法首先就是要理解&#xff0c;把这个算法彻底弄清楚&#xff0c;我觉得这是一件非常有意义的事情&#xff01;为后续书写其它棋类的AI打下了坚实的基础 剪枝操作的实现&#xff0c;遍历下一步所有可能取到的点&#xff0c;…

模型压缩:剪枝算法

过参数化主要是指在训练阶段&#xff0c;在数学上需要进行大量的微分求解&#xff0c;去捕抓数据中的微小变化信息&#xff0c;一旦完成迭代式的训练之后&#xff0c;网络模型推理的时候就不需要这么多参数。而剪枝算法正是基于过参数化的理论基础而提出的。 剪枝算法核心思想…

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

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; (*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &a…

理解Alpha-Beta 剪枝算法

Alpha-beta剪枝是一种搜索算法&#xff0c;用以减少极小化极大算法&#xff08;Minimax算法&#xff09;搜索树的节点数。裁剪搜索树中没有意义的不需要搜索的树枝&#xff0c;提高运算速度。 搜索中传递两个值。 第一个值是Alpha&#xff0c;即搜索到的最好值&#xff0c;任何…

组合总和(剪枝算法)

组合总和&#xff08;剪枝算法&#xff09; 题目 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取 示例 示例 1&#xff1a;输入: candidates [2,…

Alpha-Beta剪枝算法原理

1. 前言 前文&#xff1a;极小化极大&#xff08;Minimax&#xff09;算法原理 极小化极大算法在完全信息零和博弈中&#xff0c;基于己方努力使得在N步后优势最大化&#xff08;即评估函数输出值最大化&#xff09;和对方努力使得N步后己方优势最小化这两个出发点&#xff0c…

GRNN广义回归神经网络

广义回归神经网络 GRNN &#xff08;General Regression Neural Network&#xff09; 广义回归神经网络是基于径向基函数神经网络的一种改进。 结构分析&#xff1a; 可以看出&#xff0c;这个结构与之前我们所讲过的径向基神经网络非常相似&#xff0c;区别就在于多了一层加和…

m分别使用BP神经网络和GRNN网络进行时间序列预测matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 广义回归神经网络是径向基神经网络的一种&#xff0c;GRNN具有很强的非线性映射能力和学习速度&#xff0c;比RBF具有更强的优势&#xff0c;网络最后普收敛于样本量集聚较多的优化回归&#xff…

广义回归神经网络(GRNN)

广义回归神经网络&#xff08;GRNN&#xff09; 一、GRNN神经网络概述 二、GRNN神经网络理论基础&#xff08;如果对理论不感兴趣可直接看GRNN网络结构&#xff0c;网络结构理解更直观&#xff09; 三、GRNN的网络结构 注意&#xff1a;一定要理解第三个求和层的概念&#xff0…

【GRNN情绪识别】基于GRNN神经网络的情绪识别算法matlab仿真

1.软件版本 matlab2021a 2.本算法理论知识 GRNN&#xff0c;即General Regression Neural Network&#xff0c;中文全称为广义回归神经网络&#xff0c;是由The Lockheed Palo Alto研究实验室在1991年提出的。GRNN是一种新型的基于非线性回归理论的神经网络模型[43,44]。GRN…