博弈树

article/2025/10/8 19:59:14

博弈树的搜索

博弈树定义:
一类特殊的与或图
(本次讨论的博弈树都是“与或图”)

应用范围:
下棋、故障诊断、风险投资

基本搜索策略:
极小极大搜索(min-max)

优化的搜索方法:
α-β剪枝搜索
(剪枝)
(搜索与生成同时进行)

了解背景:

(完全博弈问题)博弈问题

特点:
双人对弈:轮流下,一人走一步。
信息完备:双方看到的信息一样
零和:双方利益冲突,对一方有利则对另一方不利。一般对节点N取一个估价函数f(N),一共两类节点:
——叫Max的极大节点追求最大化,有选择时肯定选值最大的;
——叫Min的极小节点追求最小化,有选择时肯定选值最小的。

例子1:下棋

两位选手对垒,轮流走步。这时每一方不仅知道对方过去已经走过的棋步,而且还能估计出对方未来可能的走步。对弈的结果是一方赢(另一方则输),或者双方和局。如象棋,围棋,五子棋,…

例子2:选包拿钱

假设有两个钱包,每个钱包都放2张钱,第一个放了0.5元和100元,第二个放了2元和10元, Max和Min两个人是仇敌。现在Max负责挑出一个包,Min负责从Max选的包里选一张小的钱给Max。
因为Max想让自己的钱越多越好而Min不想让Max钱多,所以Min会选一张相对最小的钱给Max。也即,Max想获得最大利益,而Min只是想承受最小的对手变强程度。在这种情况下Max应该选择包2,Min会给他2元。如果Max选择了包1 ,Min只会给他选0.5元。
图1
完全信息博弈抽象出任务原型:
给出(或逐步生成)一个博弈树,求出在指定搜索深度(层数)下的最佳路径和相应估价分数。比如下象棋,Max先走一步,Min再走一步,再轮到Max走,这时Max遇到的各个局面可以估分,再倒推回去Max的第一步应该选择走哪步最佳
基本搜索策略:极小极大搜索(min-max)
为了提高极小极大搜索方法的速度,所以采用剪枝,最主要的是α-β剪枝

不完全信息博弈情况:
大部分纸牌游戏(如斗地主、拖拉机)
大部分即时策略游戏(如红警、星际、帝国)
——需要探路(即信息不对等)
——游戏还受手速(APM)影响

但是博弈问题常常不能简单穷举,以中国相亲为例:
——一盘棋平均走50步,总状态数约为10的161次方。假如一毫微秒走一步,约需10的145次方。
——结论:不可能穷举

极小极大搜索方法:

极小极大搜索方法是博弈树搜索的基本方法 。
首先假定,有一个评价函数可以对所有的棋局进行评估。当评价函数值大于0时,表示棋局对我方有利,对对方不利。当评价函数小于0时,表示棋局对我方不利,对对方有利。
方法过程:
1、当轮到我方走棋时,首先按照一定的搜索深度生成出给定深度d以内的所有状态,计算所有叶节点的评价函数值。然后从d-1层节点开始逆向计算:
2、对于我方要走的节点(用MAX标记,称为极大节点)取其子节点中的最大值为该节点的值(因为我方总是选择对我方有利的棋)。
3、对于对方要走的节点(用MIN标记,称为极小节点)取其子节点中的最小值为该节点的值(对方总是选择对我方不利的棋)。
4、一直到计算出根节点的值为止。获得根节点取值的那一分枝,即为所选择的最佳走步。
图2 极小极大搜索
因此,极小极大过程是一种假定对手每次回应都正确的情况下,如何从中找出对我方最有利的走步的搜索方法。
值得注意的是,不管设定的搜索深度是多少层,经过一次搜索以后,只决定了我方一步棋的走法。等到对方回应一步棋之后,需要在新的棋局下重新进行搜索,来决定下一步棋如何走。

对于静态估计函数f(x)
一般规定有利于MAX的势态,f§取正值,有利于MIN的势态,f§取负值,势均力敌的势态,f§取0值。若f§=+∞,则表示MAX赢,若f§=-∞,则表示MIN赢。下面的讨论规定:顶节点深度d=0,MAX代表程序方,MIN代表对手方,MAX先走。
当用端节点的静态估计函数f(p)求倒推值时,两位选手应采取不同的策略,从下往上逐层交替使用极小和极大的选值方法,故称极小极大过程。

个人总结:
极小极大搜索——从一个原始状态节点,根据估值函数,对后面出现的可能状态进行估值,在一定深度内通过一个路径选择方式(max层节点从子节点选择最大的值,min层节点从子节点总选择最小的值),选择出最优的路径(该路径为到达最优值所在节点路径)。

α-β剪枝搜索过程:

能否在搜索深度不变的情况下,利用已有的搜索信息减少生成的节点数呢?
MIN-MAX过程是把搜索树的生成和格局估值这两个过程分开来进行,即先生成全部搜索树,然后再进行端节点静态估值和倒推值计算,这显然会导致低效率。
实际上把生成和倒推估值结合起来进行,再根据一定的条件判定,有可能尽早修剪掉一些无用的分枝,同样可获得类似的效果,这就是α-β过程的基本思想。

注意: α-β剪枝搜索和生成扩展子节点是同步的。其得到的最优解结果与Min-Max过程一致
Min-Max过程和α-β剪枝搜索的结果都受生成/搜索策略顺序有关(比如选择广度优先或者深度优先,结果可能不一样)

简单例子:

图3 极小极大搜索方法
由图3可知,对于min-max搜索,得到的最优路径为A1-A11。max得分为3

图4 α-β剪枝方法
而图4是通过α-β剪枝方法得到的,同样得到最优路径为A1-A11。max得分为3。

例子2:

对该搜索树进行左边深度优先α-β剪枝搜索

图5 例子2
左边为原搜索树,右边为α-β剪枝搜索
——极小值节点I的N子树被剪枝了( α剪枝)
——极大值节点G的L子树被剪枝了(β剪枝)

α-β搜索方法定义:
Max节点的下界为α,即Max确保能获得的最小得益。初始化为-inf。
Min节点的上界为β,即Min付出的上界代价保障。初始化为+inf。
对于节点N的估计函数值f(N),初始化α =-inf ≤ f(N) ≤ β=+inf
若 α ≤ β则N有解。若 α > β 则N无解(为什么无解?因为对于上一层,min/max层不会选择该路径的节点了,故而可以放弃搜索),该节点N的其他未访问子树会被剪枝
如图中节点I,从左子树DBE可以获得下界α=3,并传送到右边的极小节点I,此时I的子节点M给了个上界β=1。所以α=3> β=1,下界α大于上界β ,无解。

在这里插入图片描述
理解:
极大节点N,从一个子树获得的α值和β值,可以传送给其子节点
极大节点N 的α值只可能越改越大,否则极大节点N可以还选择原有α值
极小节点M的β值只可能越改越小,否则极小节点M可以还选择原有β值
从单边子节点往父节点推,极大值父节点只更改α值,极小值父节点只更改β值。

在这里插入图片描述
α剪枝(发生在极小层节点,如图中的节点I)
(1)α剪枝:若任一极小值层节点的β值小于或等于它任一先辈极大值层节点的α值,即α(先辈层)≥β(后继层),则可中止该极小值层中这个MIN节点以下的搜索过程。这个MIN节点最终的倒推值就确定为这个β值。
从一个子树获得的极大节点的α值,可以传送给该节点的其他子树,从而选择α剪枝机会(课本说法,和“先辈”节点α值比较,是和所有先辈节点比较,而不是仅仅和父节点比较)。
从单边子节点往父节点推,极大值父节点只更改α值,极小值父节点只更改β值

注意看极小节点I:
极大节点A从左子树获得α值3,从而可以把α=3传播给右子树,在极小节点I点由于子节点M值为1从而可以确认β=1,此时α=3> β=1,从而I的其他节点可以被α剪枝, I点的β=1。

在这里插入图片描述
β剪枝(发生在极大层节点,如图中的节点G)
(2)β剪枝:若任一极大值层节点的α值大于或等于它任一先辈极小值层节点的β值,即α(后继层)≥β(先辈层),则可以中止该极大值层中这个MAX节点以下的搜索过程。这个MAX节点的最终倒推值就确定为这个α值。
从一个子树获得的极小节点的β值,可以传送给该节点的其他子节点,从而选择β剪枝机会(课本说法,和“先辈”节点β值比较,是和所有先辈节点比较,而不是仅仅和父节点比较)。
从单边子节点往父节点推,极大值父节点只更改α值,极小值父节点只更改β值

注意看极大节点G:
极小节点C通过部分计算(A左子树和F子树)获得α=3和β=5 ,从而可以把α=3和β=5传播给极大节点G,在极大节点G点由于子节点K值为6从而可以确认α=6 ,从而G点此时α=6> β=5,从而G的其他节点可以被β剪枝,G点的α=6 。

祭出终极例子3:
在这里插入图片描述

α-β搜索方法总结:

1、α-β剪枝后选得的最好优先走步,其结果与不剪枝的MINIMAX方法所得完全相同,因而α-β过程具有较高的效率。
2、α-β剪枝最理想的情况是,Min节点先扩展最低估值子节点,Max节点先扩展最大估值节点。(这个策略可以用于启发式α-β剪枝搜索)

思考问题:为什么所有α-β剪枝搜索例子都是用深度优先策略?
因为深度优先更有机会发生剪枝。


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

相关文章

vim的目录树插件NERDtree的安装

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

Vim的NerdTree插件

在vundle插件管理的方式,直接在~/.vimrc中的Plugin段落中加入Plugin "scrooloose/nerdtree "然后重启Vim并输入PluginInstall,即可完成安装 然后输入: NERDTreeToggle即可打开文件树。当然,默认是关闭的,需要每次都输入…

分享一个Vim目录树的插件-NERDTree

之前的公司有目录树,方便很多,但是没把代码带过来,这次新找了一个,对于日常工作来说,确实方便很多。NERDTree是github上分享的免费的linux/vim上的目录树插件,有需要的可以参考原来的链接: NER…

java之TreeNode

~ 前言 之前讲的HashMap机制遗漏了一个Tree的操作,我们在这里补上。如果是从头看到这里那么这一章也会非常容易。 后续讲解内容为源码实现,这里使用的是JDK8的版本。 红黑树 HashMap使用的树结构是红黑树,而红黑树是一个平衡二叉树&#xf…

Vim升华之树形目录插件NERDTree安装图解

无意中看到实验室的朋友使用的vim竟然能在左边显示树形目录,感觉很方便,这样子文件夹有什么文件一目了然。她说是一个插件叫NERDTree,安装执行后的效果如下,不是你想要的效果就别安了。我的系统是Ubuntu12.04,版本不同…

gvim安装NERDTree插件

gvim安装NERDTree插件 安装vim plug遇到的问题安装成功 安装NERDTree插件遇到的问题安装成功 安装vim plug 访问网站链接: download vim-plug Linux终端命令敲入: curl -fLo ~/.vim/autoload/plug.vim --create-dirs \https://raw.githubusercontent.com/junegunn…

安装NERDtree

无意中看到实验室的朋友使用的vim竟然能在左边显示树形目录,感觉很方便,这样子文件夹有什么文件一目了然。她说是一个插件叫NERDTree,安装执行后的效果如下,不是你想要的效果就别安了。我的系统是Ubuntu12.04,版本不同…

nerdtree-git-plugin插件

给用 NERDTree 的同学推荐一个很好用的插件 nerdtree-git-plugin,这个插件能显示 git 管理的项目文件变更状态. 配置 这个插件是”开箱即用”的,不过建议大家做如下配置(用zsh的同学是不是很熟悉XD): let g:NERDTreeIndicatorMapCustom {\ "Mod…

NERDTree安装

转自https://blog.csdn.net/qq_33862644/article/details/80545654 安装: 1、下载vundle(管理插件工具) git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 注意:~开始是下载到哪,…

linux下Nerdtree安装方法

目录 1.下载Nerdtree 2. linux下安装 3. 成功享受吧 1.下载Nerdtree 百度网盘下载,地址为链接:百度网盘 请输入提取码 提取码:07e3 --来自百度网盘超级会员V4的分享 github方式下载,地址为 https://github.com/scrooloose/ner…

GVim配置一个漂亮的NerdTree

GVim配置一个漂亮的NerdTree GVim使用也有一段时间了,有空写几个简单的教程帮助新手快速上手,定制一个个性化的编辑器把。以下是我的NerdTree效果展示。 NerdTree插件 NerdTree下载安装 如果你安装了插件管理器的化安装就很简单了,如果没有安…

NERDTree插件安装和使用

如何安装NERDTree插件,该插件显示一个目录树,可以执行一下文件的操作命令,首先添加配置: " 在vim中安装及配置NERDTree插件,放在Plugin gmarik/Vundle.vim 之后 Plugin scrooloose/nerdtree ""-----…

Win系统中GVim8.2配置NerdTree插件

目录 功能说明 NerdTree插件实现效果图: NerdTree安装: NerdTree配置 功能说明 NERDTree是Vim最常用的插件之一,可以在Vim运行时显示目录和文件结构,类似TextMate左侧的文件浏览器,但操作起来更为方便,…

vim插件:显示树形目录插件NERDTree安装 和 使用

前言 一、下载和配置 NERDTree插件的官方地址如下,可以从这里获取最新的版本 https://github.com/scrooloose/nerdtree 下载zip安装包 或者使用下面官网源文件安装方法 我的实验环境是centos6.6,其他版本可能有些不同。 安装方法很简单,先把压缩文件下…

VIM插件:目录导航与操作插件NERDTree的使用方法

VIM插件:目录导航与操作插件NERDTree的使用方法 📘 从外部Buffer打开NERDTree的方法 👨‍💻 假设已经会了VIM的配置基本知识,并会安装和简单配置VIM插件了,如果这点不太熟悉,可以自行查看相关…

webview跳转外部链接

提示:本文章主要讲述js点击跳转外链 前言 一、示例模板 二、使用步骤 1.需点击跳转页面(假设为a) 2.跳转页面(假设为b) 3.json文件中配置路由 4.配置业务域名 总结 前言 官方介绍,web-view这个组件…

【小程序】Web-View 小程序跳转外部链接

写这个是因为,最近小程序的一个需求需要从小程序跳转到客户的官网,或者其他外部报名链接。 如果是以前的话,可能就无法实现,但是小程序的版本更新速度还是可观的,现在既可以跳转外部链接,还可以跳转APP&…

【Web-View】小程序跳转外部链接

最近小程序的一个需求要从小程序跳转到客户的官网,或者其他外部链接,如果是以前的话,可能就无法实现,但是小程序的版本更新速度还是可观的,现在既可以跳转外部链接,还可以跳转APP; 文档&#xf…

uniapp跳转外部链接

1、在需要跳转的地方添加点击事件 2、在点击事件的方法里 定义要跳转的外部链接地址,将链接传到webview.vue页面中 3、创建一个页面(webview.vue) 在页面中主要使用web-view标签 4、onLoad()用于接收传递过来的参数值, 赋值给w…

微信小程序跳转到外部链接

<web-view src"https://www.baidu.com/"></web-view>那比如这个跳转到www.baidu.com 就是行不通的了&#xff0c;只能是自己在开发的时候玩玩&#xff08;在开发者工具中点设置-项目设置-在不校验合法域名、web-view&#xff08;业务域名&#xff09;、T…