AlphaBeta剪枝算法求解博弈树最优选择 头歌实验平台

article/2025/10/8 18:14:44

AlphaBeta剪枝算法求解博弈树最优选择 头歌实验平台

  • 前言
  • 一、AlphaBeta剪枝是什么?
    • 1.由来, 最大最小决策树
    • 2.发展
    • 3. AlphaBeta剪枝
  • 二、实验算法伪代码
  • 三、实验算法代码
  • 四、实验结果
    • 在这里插入图片描述
  • 五、感谢


前言

产生本文的缘由

人工智能原理课程 可选实验 “AlphaBeta剪枝算法求解博弈树最优选择”,
以及去年在数据结构导论没有看明白的博弈论.
记录自己的学习过程.

注:本文适合有一定基础的读者阅读.


以下是本篇文章正文内容

一、AlphaBeta剪枝是什么?

1.由来, 最大最小决策树

矩形一层的节点 选择较大值
圆形一层的节点 选择较小值
深度搜索 比较节点值 加上回溯即可.
在这里插入图片描述
在这里插入图片描述

2.发展

人们发现这些节点的比较过程很多是无意义的, 比如说对于上图的H节点
当C节点的正无穷大和H节点的2比较时, C节点值更新为2, 此时, 由于C是圆形一层的节点,
只能选择较小值.

那么C节点的取值只能小于等于2了

但是矩形节点A是在 圆形节点B, C, D中选择一个最大的值

然而B节点的值已经为3 , 那么A不可能考虑C了

,所以对于C的子节点 H, I , 都没有必要继续进行访问 并且比较更新C的节点值了

3. AlphaBeta剪枝

在这里插入图片描述

有图有真相 , 橙色画叉的就是剪枝的部分了, 根据该节点是矩形和圆形来判断是Alpha还是Beta剪枝 , 比如说C节点 划掉了I 和 J , 而C节点是圆形的, 所以是Alpha剪枝.

其实更准确的定义是, 当时是因为v<=alpha 还是 v>=beta 剪枝来判断的, 比如说C节点进行剪枝的时候, v<=alpha

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


二、实验算法伪代码

读者可以对照下面的实验源码部分 ,下面的三个函数 (从上到下) 分别对应于源码中的 minmax_with_alphabeta
max_value
min_value

如果要真正搞懂, 请一定要去debug啊啊啊

在这里插入图片描述


三、实验算法代码

注意: 这个代码在python3.7.9下 (除了python3.10以上的 python3应该都可以) 可以直接运行, 输出的是路径

# -*- coding:utf-8 -*-import copy     # 注意对象的深拷贝和浅拷贝的使用!!! #这个没有用到class 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 **********#if self.root == None:self.root = rootif type(data_list) == list:for listItem in data_list[1:]:root.children.append(GameNode(listItem[0]))else:  # 如果是元组,则进行节点赋值root.val = data_list[1]returnfor index in range(len(data_list[1:])):self.buildTree(data_list[1:][index], root.children[index])#********** 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 博弈树self.Alpha = -float('inf')self.Beta = float('inf')self.inf = float('inf')def minmax_with_alphabeta(self, node):'''带AlphaBeta剪枝的极大极小值算法,计算最优行动参数:node - GameNode 博弈树结点返回值:clf - GameNode 最优行动的结点'''# 请在这里补充代码,完成本关任务#********** Begin **********#res = self.max_value(node, self.Alpha, self.Beta)path = []path.append(node)# 利用节点树已经保存的节点信息,找到最佳决策路线# 其实这个 get_clfnode 函数有点问题,留给读者解决吧def get_clfnode(nodeTemp):for node in nodeTemp.children:if node.val == res and (node not in path):path.append(node)get_clfnode(node)get_clfnode(node)# 返回最好的决策路线return path#********** End **********#def max_value(self, node, alpha, beta):'''计算最大值参数:node - GameNode 博弈树结点alpha - int 剪枝区间下限值beta - int 剪枝区间上限值返回值:子结点中的最大的评估值'''# 请在这里补充代码,完成本关任务#********** Begin **********#if self.isTerminal(node):return node.valnode.val = -self.inffor child in node.children:node.val = max(node.val, self.min_value(child, alpha, beta))if node.val >= beta:return node.valalpha = max(alpha, node.val)return node.val#********** End **********#def min_value(self, node, alpha, beta):'''计算最小值参数:node - GameNode 博弈树结点alpha - int 剪枝区间下限值beta - int 剪枝区间上限值返回值:int 子结点中的最小的评估值'''# 请在这里补充代码,完成本关任务#********** Begin **********#if self.isTerminal(node):return node.valnode.val = self.inffor child in node.children:node.val = min(node.val, self.max_value(child, alpha, beta))if node.val <= alpha:return node.valbeta = min(beta, node.val)return node.val#********** 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 len(node.children) != 0:return Falsereturn True#********** End **********## x = ['A', ['B', ('E', 3), ('F', 12)], ['C', ('H', 2)], ['D', ('K', 14)]]
x = ['A', ['B', ('E', 3), ('F', 12), ('G', 8)], ['C', ('H', 2), ('I', 4), ('J', 6)],['D', ('K', 14), ('L', 5), ['M', ('N', 7), ('O', 2)]]]# x = ['A', ['B', ('E', 3), ('F', 12), ('G', 8)], ['C', ('H', 2), ('I', 100), ('J', 100)], ['D', ('K', 14), ('L', 5), ('M', 2)]]
Tree = GameTree()
Tree.buildTree(x, GameNode(x[0]))AB = AlphaBeta(Tree)path = AB.minmax_with_alphabeta(AB.game_tree.root)print("最佳决策路线")
for node in path:print(node.name)

四、实验结果

在这里插入图片描述

五、感谢

哔哩哔哩 up
https://www.bilibili.com/video/BV1Bf4y11758/?t=2&vd_source=9a635cad743683b8f6be81a0587e2864

头歌实验平台
https://www.educoder.net


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

相关文章

并行博弈树搜索算法-第3篇 优秀的园丁:Alpha-Beta算法

3.1 Alpha-Beta算法 虽然博弈树的状态是有限的,但是状态个数却非常多.假设博弈树的深度为d,每个结点有b个分支,即分支因子&#xff08;branchingfactor&#xff09;为b,那么使用Min-Max方法搜索这个博弈树需要搜索个结点. 然而幸运的是,Min-Max方法的一些搜索是没有必要的,…

利用α-β搜索的博弈树算法编写一字棋游戏 python

游戏规则 “一字棋"游戏&#xff08;又叫"三子棋"或"井字棋”&#xff09;&#xff0c;是一款十分经典的益智小游戏。“井字棋"的棋盘很简单&#xff0c;是一个 33 的格子&#xff0c;很像中国文字中的"井"字&#xff0c;所以得名"井字…

博弈树 极小极大分析法

一、博弈概述 博弈特点&#xff1a; &#xff08;1&#xff09;博弈的初始格局是初始节点 &#xff08;2&#xff09;在博弈树中&#xff0c;“或”和“与”是交替出现的。自己一方的扩展节点是“或”关系&#xff0c;对方扩展的节点是“与”关系。双方轮流扩展节点。 &…

第6-2课:决策树、博弈树和行为树

在以各种“XX学习”为代表的人工智能技术普及之前,游戏里常见的角色 AI 都是各种预设的行为逻辑,比如博弈树和行为树,当然也会用到各种专家知识库。当这些预设的行为逻辑足够复杂的时候,往往会让游戏玩家觉得游戏里的人物很“智能”。从本质上来说,这些都还不算是真正的 A…

并行博弈树搜索算法-第4篇 更上一层楼:Alpha-Beta算法的改进

在Alpha-Beta算法被广泛运用后,对该算法的很多改进算法也相继被提出.这些改进算法主要在以下几个方面对Alpha-Beta算法进行改进[7]: 1. 择序&#xff08;ordering&#xff09;.在搜索博弈树时,内部结点有多个可能的移动.择序指的是搜索这些分支的顺序.择序影响着搜索叶结点的个…

博弈树的启发式搜索

什么是博弈树 在博弈过程中, 任何一方都希望自己取得胜利。因此,当某一方当前有多个行动方案可供选择时, 他总是挑选对自己最为有利而对对方最为不利的那个行动方案。 此时,如果我们站在A方的立场上,则可供A方选择的若干行动方案之间是“或”关系, 因为主动权操在A方手里,他或…

博弈树 α-β剪枝

由于搜索的复杂度有点高&#xff0c;所以在树上减少计算量肯定是剪枝了&#xff0c;这里我们把剪枝的办法称作的&#xff1a;α-β剪枝 我们在前面的文章中谈到&#xff0c;当第一次运作的是A&#xff0c;则所有的奇数深度的节点都是A做的选择&#xff0c;所有偶数深度的节点都…

博弈树优化

前言:   对弈类游戏的智能算法, 网上资料颇多, 大同小异. 然而书上得来终觉浅, 绝知此事要躬行. 结合了自己的工程实践, 简单汇总整理下. 一方面是对当年的经典<<PC游戏编程(人机博弈)>>表达敬意, 另一方面, 也想对自己当年的游戏编程人生做下回顾.   承接上两…

博弈树中关于α-β剪枝树要点

目录 一&#xff0c;α-β剪枝树搜索方法&#xff1a;深度优先&#xff08;DFS&#xff09;&#xff0c;一般从博弈树最左边开始一直搜索到最右边。 人工智能导论复习&#xff1a;| 一&#xff0c;α-β剪枝树搜索方法&#xff1a;深度优先&#xff08;DFS&#xff09;&#…

(只此一篇便绝b能懂的)五子棋AI算法原理,博弈树、极大极小搜索、αβ剪枝

我在最近撰写五子棋AI程序设计报告时&#xff0c;翻阅了很多的资料博客&#xff0c;但却发现大佬们的博客&#xff0c;没有一篇是能让我只看它就能理解全部的AI算法。在看了众多博客后&#xff0c;我终于对博弈树、极大极小搜索、αβ剪枝恍然大悟&#xff0c;其实这些看似高大…

五子棋智能算法-博弈树算法思想详解(一)

学习这个算法之前必会链表 关于链表看这两篇博文 https://blog.csdn.net/viafcccy/article/details/84502334 https://blog.csdn.net/viafcccy/article/details/85041942 在五子棋下棋中 我们最容易想到的算法就是对于棋局的推演 从而找到一种最佳的情况去使棋局向这个方向发…

基于博弈树的五子棋 AI 算法及其 C++ 实现

基于博弈树的五子棋 AI 算法及其 C 实现 摘要一 五子棋的游戏规则二 五子棋对弈的算法描述2.1 博弈树搜索算法2.2 α ─ β 剪枝2.3 估价函数 三 五子棋对弈的算法实现3.1 Node类3.1.1 成员变量3.1.2 成员函数 3.2 GameTree类3.2.1 成员变量3.2.2 成员函数 四 五子棋对…

博弈与博弈树

博弈与博弈树 博弈 博弈双方根据事先制定的规则&#xff0c;轮流交替在对应的棋局上做出自己的选择&#xff0c;然后根据规则判定那一方获胜。 博弈树&#xff08;一种特殊的与或树&#xff09; 目标&#xff1a;将当前棋局作为根节点&#xff0c;选出最有利于自己获胜的一步…

博弈树搜索算法

即使满腹经纶&#xff0c;但没有好的口才来授课&#xff0c;也会让学生听得昏昏欲睡、不知所云呢&#xff01;即使满腔热血&#xff0c;没有好的口才来凝聚共识&#xff0c;也会让这份理想温暖黯淡无光。但是&#xff0c;好的说话之道&#xff0c;也要有一颗赤诚的心、诚恳的情…

博弈树-BIT

博弈树-BIT 下棋属于一种博弈游戏&#xff0c;博弈过程可以用树&#xff08;博弈树&#xff09;来表示。假设游戏由两个人&#xff08; A 和 B &#xff09;玩&#xff0c;开始由某个人从根结点开始走&#xff0c;两个人轮流走棋&#xff0c;每次只能走一步&#xff0c; 下一步…

第四章 博弈树game tree

这里写目录标题 perfect-information game从博弈树得到收益表subgamebackward induction 反向推导一个值得思考的例子&#xff1a; 另一个例子umperfect information extensive混合策略和行为策略&#xff08;mexed and behavioral strategies)不完美信息博弈的求解 博弈树用于…

人工智能—— 博弈树的启发式搜索

一、概述 博弈的概念 博弈是一类具有智能行为的竞争活动&#xff0c;如下棋、战争等。 博弈的类型 双人完备信息博弈&#xff1a;两位选手&#xff08;例如MAX和MIN &#xff09;对垒&#xff0c;轮流走步&#xff0c;每一方不仅知道对方已经走过的棋步&#xff0c;而且还能…

博弈树与α-β剪枝

一、评价函数&#xff08;Evaluation function&#xff09; 绝大部分的游戏&#xff0c;决策空间都相当庞大。 即使是最简单的三子棋&#xff08;又叫做“井”字棋&#xff0c;一字棋&#xff09;。它的第一步有9种决策&#xff0c;然后对面有9*872种决策&#xff0c;....&…

博弈树

博弈树的搜索 博弈树定义&#xff1a; 一类特殊的与或图 &#xff08;本次讨论的博弈树都是“与或图”&#xff09; 应用范围&#xff1a; 下棋、故障诊断、风险投资 基本搜索策略&#xff1a; 极小极大搜索&#xff08;min-max&#xff09; 优化的搜索方法&#xff1a; α…

vim的目录树插件NERDtree的安装

下载&#xff1a; https://github.com/preservim/nerdtree 上面是NERDTree插件的下载链接&#xff0c;在github上下载即可将下载的文件的解压&#xff0c;并通过虚拟机的共享文件夹共享到虚拟机 将共享的文件&#xff0c;复制到~./vim/ 目录下&#xff0c;如下图&#xff1a; …