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

article/2025/9/28 23:26:11

资源下载地址:https://download.csdn.net/download/sheziqiong/85883881
资源下载地址:https://download.csdn.net/download/sheziqiong/85883881

基于αβ剪枝算法的五子棋

五子棋介绍

简介

五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。

五子棋规则

五子棋有多种规则,分为:原始规则、无禁类规则、有禁类规则;其中无禁类规则又有Standard Gomoku规则、Gomoku-Pro 规则、Swap规则、Swap2规则等。

本次五子棋采用原始规则:

行棋:黑子先行,一人轮流一著下于棋盘空点处。

胜负:先把五枚或以上己棋相连成任何横纵斜方向为胜。(长连仍算胜利)

在这里插入图片描述

​ 棋盘示例图

引入

人工智能是一门综合性很强的边缘科学,它研究如何使计算机去做那些过去只能靠人的智力才能完成的工作。而agent博弈是人工智能的重要分支,在博弈问题中提高机器的智能水平,敌对搜索对这一问题的经典解决方法,而极大极小算法是敌对搜索中最为基础的算法,为了提高极大极小搜索的效率,在极大极小搜索算法的基础上使用Alpha-Beta剪枝所产生的Alpha-Beta搜索算法则是其中最重要的算法之一。

本次试验利用Alpha-Beta搜索算法实现人机博弈中的五子棋游戏,并在此基础上,利用局部搜索、优先值启发、限制深度等方法来提高Alpha-Beta搜索算法的效率。

二、实验目的和环境

实验目的

熟悉人工智能系统中的问题求解过程;

学会利用对抗搜索解决博弈问题;

熟悉对抗搜索中的极大极小值算法,以及在此基础上的Alpha-Beta搜索算法的应用;

熟悉对五子棋问题的建模、求解及编程语言的应用。

实验环境

硬件环境:

  • 计算机型号:惠普Pavilion M4

  • 内存:4.00GB

  • CPU:Intel Core i5 2.6GHz

软件环境:

  • 操作系统:Windows10版本

  • IDE:Visual Studio 2015 社区版

  • 图形库:EasyX

  • 实现语言:C++(C++11标准)

三、算法和实现

棋形介绍

术语

  • 〖阳线〗 直线,棋盘上可见的横纵直线。

  • 〖交叉点〗 阳线垂直相交的点,简称“点”。

  • 〖阴线〗 斜线,由交叉点构成的与阳线成45°夹角的隐形斜线。

  • 〖落子〗 棋子直接落于棋盘的空白交叉点上。

  • 〖轮走方〗 “行棋方”,有权利落子的黑方或白方。

  • 〖着〗 在对局过程中,行棋方把棋子落在棋盘无子的点上,不论落子的手是否脱离棋子,均被视为一着。

  • 〖回合〗 双方各走一着,称为一个回合。

  • 〖开局〗 在对局开始阶段形成的布局。

  • 〖连〗 同色棋子在一条阳线或阴线上相邻成一排。

棋形

  • 〖长连〗 五枚以上同色棋子在一条阳线或阴线上相邻成一排。

  • 〖五连〗 只有五枚同色棋子在一条阳线或阴线上相邻成一排。

  • 〖成五〗 含有五枚同色棋子所形成的连,包括五连和长连。

  • 〖四〗 在一条阳线或阴线上连续相邻的5个点上只有四枚同色棋子的棋型。

  • 〖活四〗 有两个点可以成五的四。

  • 〖冲四〗 只有一个点可以成五的四。

  • 〖死四〗 不能成五的四。

  • 〖三〗 在一条阳线或阴线上连续相邻的5个点上只有三枚同色棋子的棋型。

  • 〖活三〗 再走一着可以形成活四的三。

  • 〖连活三〗 连的活三(同色棋子在一条阳线或阴线上相邻成一排的活三)。简称“连三”。

  • 〖跳活三〗 中间隔有一个空点的活三。简称“跳三”。

  • 〖眠三〗 再走一着可以形成冲四的三。

  • 〖死三〗 不能成五的三。

  • 〖二〗 在一条阳线或阴线上连续相邻的5个点上只有两枚同色棋子的棋型。

  • 〖活二〗 再走一着可以形成活三的二。

  • 〖连活二〗 连的活二(同色棋子在一条阳线或阴线上相邻成一排的活二)。简称“连二”。

  • 〖跳活二〗 中间隔有一个空点的活二。简称“跳二”。

  • 〖大跳活二〗中间隔有两个空点的活二。简称“大跳二”。

  • 〖眠二〗 再走一着可以形成眠三的二。

  • 〖死二〗 不能成五的二。

  • 〖先手〗 对方必须应答的着法,相对于先手而言,冲四称为“绝对先手”。

  • 〖三三〗 一子落下同时形成两个活三。也称“双三”。

  • 〖四四〗 一子落下同时形成两个冲四。也称“双四”。

  • 〖四三〗 一子落下同时形成一个冲四和一个活三。

7.1 估值函数

五子棋是一种零和游戏,但是五子棋的搜索树有较多分支因子以及深度较大,限于有限的计算资源,实际中不可能从搜索树的根节点搜索到最终棋局的叶子节点状态,我们只能限定其搜索深度,然后对棋局状态进行评估。

进行棋局估分的具体方式是对棋盘上已经落子的每个棋子根据其在棋盘上的位置以及与周围棋子形成的棋形进行打分,整个棋局状态的估分由己方所有棋子估分和减去敌方棋子估分和,即F(state)=
棋形估值函数具体规则:

根据五子棋的特点和根据实际情况多次调整,本次采用的棋形估值如下:

# define VALUE_MAX	10000000	//长连/成五 获胜# define VALUE_L4	150000		//活四
# define VALUE_W4	7500		//冲四
# define VALUE_D4    20			//死四# define VALUE_L3	7500		//活三
# define VALUE_W3	2000		//冲三
# define VALUE_D3    10			//死三# define VALUE_L2	1000 		//活二
# define VALUE_W2	200 		//冲二
# define VALUE_D2    5			//死二# define VALUE_L1	100 		//活一
# define VALUE_W1	50 			//冲一
# define VALUE_D1    0			//死一

算法

博弈树

下棋双方在棋盘上下棋,把棋局状态作为节点,当一方任意下棋时,局面就会从一个状态转移到另一个状态。对于一个确定的局面状态,有很多种可行的走法,每一种走法都会使局面状态转移到一个不同的子状态,把子状态和生成它的父亲状态用一条边连接,然后向下递归,直到下棋结束,整个过程生成了一棵树,即为博弈树。

极大极小值算法

在通常的局面中,我们往往想通过少量的搜索,为当前局面选择一步较好的走法,然而在五子棋的棋局中,一个局面的评估往往不像输、平、赢3种状态这么简单,在分不出输赢的局面中棋局也有优劣之分。也就是说,要用更细致的方法来刻画局面的优劣,而不是仅仅使用1,-1,0三个数字刻画3种终了局面。

用估值函数可以为每一个局面的优劣评分。例如甲胜为正无穷,乙胜为负无穷,和局为0,;其他的情形依据双方剩余棋子的数量及位置评定从负无穷到正无穷之间的具体分数。这样我们可以建立一棵固定深度的搜索树,其叶子节点不必是终了状态,只是固定深度的最深一层的节点,其值由上述函数评出;对于中间节点,如同前面提到的那样,甲方取子节点的最大值,乙方取子节点的最小值。

静态估值函数,用以取代固定深度的搜索。显然,我们无法拥有绝对精确的静态估值函数,否则,只要这个静态估值函数就可以解决所有的棋局了。估值函数给出的只是一个较粗略的评分,在此基础上进行的少量搜索的可靠性,理论上是不如前述的三种状态的博弈树的,但这种方法却是可以实现的。

极大极小策略是考虑双方对弈若干步之后,从可能的步中选一步相对好的步法来走,即在有限的搜索深度范围内进行求解。

定义一个静态估价函数f,以便对棋局的态势做出优劣评估。

规定:

  • max和min代表对弈双方;

  • p代表一个棋局(即一个状态);

  • 有利于MAX的态势,f§取正值;

  • 有利于MIN的态势,f§取负值;

  • 态势均衡,f§取零值;

MINMAX的基本思想:(1)当轮到MIN走步时,MAX应该考虑最坏的情况(即f§取极小值)(2)当轮到MAX走步时,MAX应该考虑最好的情况(即f§取极大值)(3)相应于两位棋手的对抗策略,交替使用(1)和(2)两种方法传递倒推值。

在这里插入图片描述

αβ剪枝算法

αβ剪枝算法是对Minimax方法的优化,它们产生的结果是完全相同的,只不过运行效率不一样。其方法运用的前提假设与Minimax方法也是一样的。αβ剪枝算法的基本思想是:边生成博弈树边计算评估各节点的倒推值,根据倒推值范围及时减掉那些没有必要再扩展的子节点,从而减少搜索节点的数量,节约了机器开销,提高搜索效率。其内容如下:

α剪枝:如果当前节点的某子节点的值不比当前节点的前兄弟节点中的最大值大,则舍弃该子节点和该子节点的所有后兄弟节点。

在这里插入图片描述

β剪枝:如果当前节点的某子节点的值不比当前节点的前兄弟节点中的最小值小,则舍弃该子节点和该子节点的所有后兄弟节点。

在这里插入图片描述

αβ剪枝算法搜索过程:

在这里插入图片描述

算法优化

局部搜索

设定一个落子范围MAX_EXTEND进行限定,在当前棋盘落子位置的最左、最右、最上、最下点的MAX_EXTEN格之内且不超过棋盘边界的可落位置进行扩展搜索。这样在棋子较少的时候,搜索结点的数量大大减少。

优先值启发

当前节点的子节点的排列顺序对于搜索的速度起着至关重要的影响。如果一开始搜索的子节点更接近于最终返回值,那么再对后面节点进行搜索时剪枝函数会发挥更大的作用,算法效率得到极大提高。

我们可以对下一次的将要搜索的分支子节点计算一个启发值,按照启发值大小顺序进行排序搜索,如果子节点仍然较多,可以设定一个MAX_SEARCH_STEP进行限制。

启发值设计为:G= max(G1+ADDSCORE,G2);也就是该位置下己方棋子的估分加一个微调值和下对方棋子的估分值中这两个值中的较大值。加一个微调是当双方都形成活四棋局时,主动权在自己手中,应该让自己赢。

核心算法伪代码

int AlphaBeta(int depth, int alpha, int beta) { 
if (depth == 0) {		//到达一定深度,评估棋局,返回分值val = Evaluate(); return val; 
}
GenerateLegalMoves();		//生成下一步合法位置while (MovesLeft()) {MakeNextMove();		//下棋 //注意Negamax风格的调用方式,前面有个负号,后面的参数是-beta和-alpha// Negamax的含义中Nega就是指这里的负号 val = -AlphaBeta(depth - 1, -beta, -alpha);   UnmakeMove();		//撤销if (val >= beta) 		//剪枝情况判断 return beta; if (val > alpha)alpha = val;}return alpha;   // 此时的alpha就是记录了当前结点的所有子结点的最大的负评估值 
}

核心算法流程图

在这里插入图片描述

四、结果演示

AI为黑棋方:

在这里插入图片描述

AI为白棋方:

在这里插入图片描述
资源下载地址:https://download.csdn.net/download/sheziqiong/85883881
资源下载地址:https://download.csdn.net/download/sheziqiong/85883881


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

相关文章

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

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

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

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

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

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

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

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

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

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

模型压缩:剪枝算法

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

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

⬜⬜⬜ 🐰🟧🟨🟩🟦🟪 (*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &a…

理解Alpha-Beta 剪枝算法

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

组合总和(剪枝算法)

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

Alpha-Beta剪枝算法原理

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

GRNN广义回归神经网络

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

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

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

广义回归神经网络(GRNN)

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

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

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

m基于C3D-hog-GRNN广义回归神经网络模型的人员异常行为识别算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 实时的人群异常行为识别是一项极具挑战的工作,具有较高的现实意义和社会需求,快速准确地判断出异常行为并及时预警,一直是我们探索的方向。传统的机器学习算法…

基于BP神经网络/GRNN神经网络的电力预测matlab仿真

目录 一、理论基础 二、案例背景 三、MATLAB程序 四、仿真结论分析 一、理论基础 BP神经网络,即Back Propagation神经网络,其本质是一种基于误差反馈传播的神经网络算法。从结构上讲,BP神经网络是由一个信息的正向传播网络和一个误差的反…

RNN CNN GCN

RNN CNN GCN 属于深度学习领域——图像识别 主要用于识别提取图像的特征 CNN:对象是图片,一个二维结构,其主要核心是有一个kernel小窗口,用于图片的平移,然后再利用卷积来提取图片的特征。 RNN:针对一维结构,主要利用…

基于麻雀搜索算法优化的广义回归神经网络(GRNN)预测 -附代码

基于麻雀搜索算法优化的广义回归神经网络(GRNN)预测 文章目录 基于麻雀搜索算法优化的广义回归神经网络(GRNN)预测1.GRNN 神经网络概述2.GRNN 的网络结构3.GRNN的理论基础4.运输系统货运量预测相关背景5.模型建立6.麻雀搜索算法优化GRNN7.实验结果8.参考文献9.Matlab代码 摘要&…

广义回归神经网络(GRNN)的数据预测

广义回归神经网络是径向基神经网络的一种,GRNN具有很强的非线性映射能力和学习速度,比RBF具有更强的优势,网络最后普收敛于样本量集聚较多的优化回归,样本数据少时,预测效果很好, 网络还可以处理不稳定数…

神经网络(一):GRNN广义回归神经网络理论概念笔记

GRNN广义回归神经网络以及相关概念 https://blog.csdn.net/zengxiantao1994/article/details/72787849 https://blog.csdn.net/guoyunlei/article/details/76101899参考博客 小小白入坑系列,欢迎大佬的指教! 算法网上铺天盖地的,我只是把自己对算法的理…