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

article/2025/10/8 18:18:31

我在最近撰写五子棋AI程序设计报告时,翻阅了很多的资料博客,但却发现大佬们的博客,没有一篇是能让我只看它就能理解全部的AI算法。在看了众多博客后,我终于对博弈树、极大极小搜索、αβ剪枝恍然大悟,其实这些看似高大上的算法,其背后的想法都十分直白朴素。人们都说刚刚学会一项技能的人,是这个技能最好的老师,所以我便试着写了我这人生中的第一篇博客~

由于这是一篇算法原理博客,旨在让读者理解,里面就不包含代码了。以下关于算法原理的图片,是我从其他博客借鉴的,但是算法的举例分析完全是由刚刚理解的自己撰写,所以只要你一个字一个字地看,保证能明白!!!

废话少叙,上干货——

一、博弈树

(1)博弈的初始格局是初始节点

(2)在博弈树中,双方轮流扩展节点假设有两方博弈,若A先走则成处于奇数深度的节点都应由A走,所有偶数级都应该由B走。

说白了博弈树就是对于棋盘状况的一种穷举!

以五子棋为例子:

树中长方形结点为己方决策节点,圆圈结点为对方决策节点。每一个节点对应一种局面,有相应的评估函数算出来的分值(针对己方)。其中,每层的节点孩子的数目等于当前决策者所拥有的选择数量,所以博弈树每层节点的孩子数目逐层递减。(图中第一层三个孩子节点,由于我方已经进行决策,对方剩下的的选择数便只有两个,故第二层结点的孩子只有两个。)


 

二、极大极小搜索

在五子棋中,双方每一次落子,都会创造出一种新的局面。我们设计好计算局势得分的函数(针对A),来计算每一个局面对于A的得分,轮到A拓展结点(选择落子位置,即创造新局面)时,A会选择得分最大的,而B会选择得分最小的(A越糟糕B越开心)。

在决策树中,轮到我方决策层时,我们总希望做出得分最高的决策(得分以我方标准来算);而在敌方决策层时,我们假定敌方总能够做出得分最小的决策(我方得分最小便是相应敌方得分最高)。所以在博弈树中,每一层所要追求的结果,在极大分数和极小分数中不断交替,故称之为极大极小搜索。

注意啦!!!

由于一些同学提出我原先的MIN、MAX节点定义说的不太清楚,所以为了把知识掰碎了喂给大家,在此给出针对本文内容的确切定义,以下定义只在本文中生效:

1、方块节点:方块节点所在层称作MIN决策层,也就是敌方决策层,敌方会在所有方块节点中选择得分最小的一个

2、圆圈节点:圆圈节点所在层称作MAX决策层,也就是我方决策层,我方会在所有圆圈节点中选择得分最大的一个

示例图片如下:

(请忽略上图中的MAX和MIN(反了),只看图感受就好,个人感觉我的定义更好理解)

我方要做出局势得分最大的决策,故称我方决策层为极大层;敌方要做出局势得分最小的决策,故称敌方决策层为极小层。

MINMAX的基本思想f(p)指局势分数

  1. 当轮到敌方走步时,AI应该考虑最坏的情况(即f(p)取极小值)
  2. 当轮到我方走步时,AI应该考虑最好的情况(即f(p)取极大值)
  3. 相应于两位棋手的对抗策略,交替使用(1)和(2)两种方法传递倒推值

三、α,β剪枝

在极大极小搜索过程中,我们很明显地注意到,随着AI思考层数的上升,时间复杂度程指数级增长。当思考层数高时AI反应明显变慢,为了解决这个问题,我们采用α,β剪枝算法。

α,β剪枝算法是一种基于深度优先搜索的剪枝算法,示例如下图所示:

假设博弈树的搜索结果如图,正方形为MIN决策层,圆圈为MAX决策层。搜索结果D、E的评分分别为5和4,根据MAX决策准则,如果极小决策者选择C,那么对手势必会选择D,所以C方案所带给极小决策者的得分是5(记为α)。在搜索F方案的过程中,我们发现下一步极大决策者存在得分为6的方案G,所以F方案带给极小决策者的得分必然大于等于6,这个得分大于已经搜索完毕的方案C,所以对于极小决策者来说F方案已经不可能优于C方案,故不再需要计算F的其他子节点情况,剪去F分枝。

上述过程被称之为α剪枝,触发条件是MIN层方案的子结点出现大于α的得分,则剪去该条分枝。

β剪枝同理,触发条件时MAX层方案的子结点出现小于β的得分,则剪去该条分枝。

设游戏的时间复杂度为m^n,n为思考层数,理论上来说,经过排序的剪枝算法可以剪掉一半的n,使得思考层数可以翻倍。

欢迎关注笔者公众号~哥玛萌的小树洞


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

相关文章

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

学习这个算法之前必会链表 关于链表看这两篇博文 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 成员函数 四 五子棋对…

博弈与博弈树

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

博弈树搜索算法

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

博弈树-BIT

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

第四章 博弈树game tree

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

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

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

博弈树与α-β剪枝

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

博弈树

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

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下载安装 如果你安装了插件管理器的化安装就很简单了,如果没有安…