Alpha-beta 算法

2023-05-16

Alpha-beta 算法是棋类游戏中最常用的,也是最基础的剪枝方法,

要说Alpha-beta 算法 就得先说下max_min博弈树 算法,就是模拟电脑下子,要下在对电脑最优的地方,模拟人下子就要下在对人最优的地方,对电脑来说最差的地方

极大极小值搜索树

此图中甲是电脑,乙是玩家,那么在甲层的时候,总是选其中值最大的节点,乙层的时候,总是选其中最小的节点。

而每一个节点的分数,都是由子节点决定的,因此我们对博弈树只能进行深度优先搜索而无法进行广度优先搜索。深度优先搜索用递归非常容易实现,然后主要工作其实是完成一个评估函数,这个函数需要对当前局势给出一个比较准确的评分。



  1. 在MAX层,假设当前层已经搜索到一个最大值 X, 如果发现下一个节点的下一层(也就是MIN层)会产生一个比X还小的值,那么就直接剪掉此节点。

解释一下,也就是在MAX层的时候会把当前层已经搜索到的最大值X存起来,如果下一个节点的下一层会产生一个比X还小的值Y,那么之前说过玩家总是会选择最小值的。也就是说这个节点玩家的分数不会超过Y,那么这个节点显然没有必要进行计算了。

通俗点来讲就是,AI发现这一步是对玩家更有利的,那么当然不会走这一步。

  1. 在MIN层,假设当前层已经搜索到一个最小值 Y, 如果发现下一个节点的下一层(也就是MIN层)会产生一个比Y还大的值,那么就直接剪掉此节点。


int alphaBeta2(int chess, int depth, int alpha, int beta,int i,int j) //alphaBeta剪枝;极大极小博弈树,人工智能第一步 模拟五步下子
{
    int best;
   if( getQuan(i,j,chess%2+1)>=Q5)
    {
	  return getComputerQuan()-getPeopleQuan();
    }
   else if(depth==0)
    {
    		//System.out.println(getComputerQuan()-getPeopleQuan());
    	return getComputerQuan()-getPeopleQuan();	
    }
    else {
    	if(chess==2)
    	{
    		int now;
    		for( i = 0;i<= 14;i++)
	  for(j = 0;j<=14;j++)
	  {
		  if(num[i][j]==0)
		  {
			  if(alpha>=beta)return alpha;
			  else if(generator( i,j)==true){	
				  num[i][j]=2;
				  now=alphaBeta2(1,depth-1,alpha,beta,i,j);
				  num[i][j]=0;			
				  if(now>alpha)alpha=now;
			  }
		  }
	  }
    		
    	best=alpha;	
    	}
    	else {
    		int now;
    		for( i = 0;i<= 14;i++)
	  for(j = 0;j<=14;j++)
	  {
		  if(num[i][j]==0)
		  {
			  if(alpha>=beta)return beta;
			  else if(generator(i,j)==true){
				  num[i][j]=1;
				  now=alphaBeta2(2,depth-1,alpha,beta,i,j);
				  num[i][j]=0;
				  if(now<beta)beta=now;  
			  }
		  }
	  }
    	best=beta;	
    	}
    }
     return best;
} 

可以看出搜索的复杂度是m^n 所以要想多搜几步减少m的值是必要的,m的值怎么减少呢?启发式搜索就是找最优的点有了打分之后,我们就可以按照分数高低进行排序了。具体实现的时候,是根据按照成五,活四,双三,活三,其他 的顺序来排序的这个难度也比较高,我就按着这个顺序排序,取最优的五个进行下一步循环,大大减少了基数m可以搜索到第六步,多搜索了2步而且时间是几乎相同的,关键代码如下:

if(chess==2)//电脑下子

     {

     int now;//一个记录当前值的数,

     for( i = 0;i<= 14;i++)

  for(j = 0;j<=14;j++)

  {

  if(num[i][j]==0)

  {

  if(alpha>=beta)return alpha;//alpha剪枝

  else if(generator(i,j)==true){//相邻剪枝

  num[i][j]=2;

 // now=getQuan(i,j,chess);

  now=getQuan(i,j,1)+getQuan(i,j,2);

  num[i][j]=0;

  bestson[cnt]=new struct();//入队

  bestson[cnt].i=i;

  bestson[cnt].j=j;

  bestson[cnt++].value=now;

  }

  }

  }

     struct t=new struct();

     for(i=0;i<cnt;i++)//冒泡排序

     for(j=i+1;j<cnt;j++)

     if(bestson[i].value<bestson[j].value)

     {

     t=bestson[i];

     bestson[i]=bestson[j];

     bestson[j]=t;

     }

     cnt=cnt<5?cnt:5;

     for(i=0;i<cnt;i++)//启发式搜索,取前五

     {

     num[bestson[i].i][bestson[i].j]=2;

  now=alphaBeta(1,depth-1,alpha,beta,bestson[i].i,bestson[i].j);

  if(now>alpha)alpha=now;

  num[bestson[i].i][bestson[i].j]=0;

     }

     best=alpha;

     }


现在的棋力已经很厉害了。

开始我也一点没接触过五子棋的算法,经过一周课余的努力也能做的不错了,好开心。。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Alpha-beta 算法 的相关文章

  • 在matplotlib中计算白色背景上alpha为0.5的RGB等效值

    我希望能够在 matplotlib 中以 0 5 的 alpha 值在白色背景上复制原色 r g 或 b 的外观 同时将 alpha 值保持为 1 下面是一个示例 通过手动实验 我发现 alpha 为 1 的 RGB 值看起来与 alpha
  • 在php中调整图像的透明度

    我已经仔细研究了在调整 png 大小时如何正确管理 alpha 我设法让它保持透明度 但仅限于完全透明的像素 这是我的代码 src image imagecreatefrompng file dir this gt file name ds
  • 使用 Open CV Python 将 Alpha 通道添加到单色图像

    我一直在研究彩色图像 RGB 和带有 alpha 通道 RGBA 的彩色图像 从 RGBA 图像中读取 Alpha 通道非常简单 我什至可以分割图像的 4 个通道 有没有什么方法可以将 Alpha 通道添加到单色或灰度图像 另外 alpha
  • Android 应用程序的 Beta 测试人员如何在同一设备上同时安装生产应用程序和 Beta 版应用程序?

    我需要我的 Beta 测试人员拥有 Beta 应用程序来进行测试 但同时他们必须拥有生产应用程序才能在生产环境中运行 问题是 如果他们成为 Beta 测试人员 似乎只能从 Google Play 获取 Beta 应用程序 有没有一种方法可以
  • iOS Apple TestFlight 版本需要什么样的证书和配置文件?

    我计划通过新的 Apple TestFlight 应用程序在 iOS 8 设备上发布 iPhone 应用程序的测试版 为此需要什么样的证书和配置文件 我需要一个生产证书和分配配置文件 可用的是这些 Certificate Pending D
  • GIMP的图层合成/混合方法

    在我寻求为 Matlab 中的图像混合工具添加 Alpha 功能时 我遇到了一些障碍 其中 我一直在使用these http ssp impulsetrain com porterduff html links http www adobe
  • Xcode 11 beta 无法将应用程序上传到 TestFlight

    我正在尝试将我的应用程序分发到 TestFlight 目前我的应用程序需要 iOS 13 以及 NFC 访问 在 iOS 13 结束测试版之前 我不打算发布我的应用程序 但我希望我的 QA 团队能够对其进行测试 我可以从 Xcode 11
  • 使用 Python 图像库调整透明 png 大小和光晕效果

    SO 上有几个类似的问题 但没有一个真正有帮助 基本上我正在尝试调整一个简单的 png 图像的大小 如下所示 http media spiralknights com wiki images 3 3e Equipment Proto Swo
  • 在 C# 中显示带有 alpha 通道的 PNG

    有没有办法在 C 应用程序中正确显示带有 alpha 通道的图像 比如说 PNG 感谢您的任何建议 UPDATE 好吧 我的问题有点不准确 我想获得 Alpha 通道的真正透明度 不填充父级的背景颜色 在下图中我们可以看到支持透明度 但按钮
  • 如何在 Python OpenCV 中读取 TIFF 图像的 Alpha 通道?

    我想使用 Python OpenCV 从 tiff 图像中读取 alpha 通道 我正在使用 Enthought Canopy 和 OpenCV 2 4 5 3 模块 我按照 OpenCV 网站的教程使用 cv2 imread 但它似乎不起
  • 如何使用 OpenGL 正确处理 Alpha 合成

    我正在使用glBlendFunc GL SRC ALPHA GL ONE MINUS SRC ALPHA 正如文档所述 实际上 Direct3D 文档中也说了同样的事情 一开始一切都很好 直到我从 GPU 下载结果并将其制作为 PNG 图像
  • 从 jpeg 中删除文本

    我有一个包含 alpha 混合文本的 jpeg 知道字体和大小后 我推导出一个代表文本的 png 文件 使用 ImageMagick 我可以获得原始图片的近似值吗 实现此目的的一种方法是使用一种称为修复的技术 您可以在 Python Ski
  • Matplotlib:曲线重叠时如何防止透明颜色叠加?

    例如我们在这里绘制一条透明颜色的线 import numpy as np import matplotlib pyplot as plt a np array 1 2 3 4 5 b 2 a plt plot a b blue alpha
  • 叠加两个或多个位图以在 Picturebox 中显示 (C#)

    在我的 C 程序中 我有一个 Picturebox 我想在其中显示视频流 连续帧 我收到原始数据 然后将其转换为位图或图像 我可以一次显示一张图像 没有问题 重现视频流 现在我的问题是我想要合并 2 个或多个具有相同大小和 alpha 值
  • Android 和设置(图像)视图 alpha 的 alpha

    真的没有对应的 XML 属性吗 setAlpha int 如果没有 还有哪些替代方案 它比其他响应更容易 有一个xml值alpha需要双值 android alpha 0 0 那是看不见的 android alpha 0 5 透视 andr
  • 为什么浏览器在 OSX 上渲染 rgba 的方式不同?

    我试图编写一些颜色操作代码 并在 alpha 上停留了很长一段时间 然后我 2 小时后 意识到浏览器以不同的方式渲染 rgba 我创建了这个测试 http jsbin com adekez 2 http jsbin com adekez 2
  • Swift 3 - 比较日期对象

    我正在将我的应用程序更新为 Swift 3 0 语法 我知道它仍处于测试阶段 但我希望在发布后立即做好准备 直到上一个 Xcode Beta Beta 5 我才能够比较两个Date使用操作数的对象 lt gt and 但在最新的测试版 Be
  • delphi TBitmap是否支持alpha通道

    我听人们说事实并非如此 但是 我创建了一个 TBitmap 并通过以下方式清除了整个区域 For I 1 to bmp Width do For J 0 to bmp Height do bmp canvas Pixels I J 0000
  • Java JLabel在渲染HTML时忽略前景色的alpha值

    当我使用具有 alpha 值的前景色的 JLabel 时 如下所示 JLabel label new JLabel This is non HTML text with correct alpha color label setForegr
  • ios 将 alpha 通道视频叠加在另一个视频上

    我一直在尝试创建一个视频模板 该模板使用 alpha 通道视频叠加在 mp4 视频和图像上 这就是我需要创建视频的方式http viewptch ptchcdn com rendered 52b28a9f8d4f980f3a3f99c3 c

随机推荐

  • 一文看懂四大汽车总线:LIN、CAN、FlexRay、MOST

    前言 随着汽车工业的发展 xff0c 汽车各系统的控制逐步向自动化和智能化转变 xff0c 汽车电气系统变得日益复杂 传统的电气系统大多采用点对点的单一通信方式 xff0c 相互之间少有联系 xff0c 这样必然会形成庞大的布线系统 据统计
  • 浅谈ASIL: 汽车安全性等级

    目录 ASIL 表示汽车安全性等级 ASIL的确定 1 严重度 2 暴露度 3 可控度 ASIL 故障分析手段 ASIL 表示汽车安全性等级 这是 ISO 26262 标准针对道路车辆的功能安全性定义的风险分类系统 ASIL 根据伤害的可能
  • SOA中间件DDS(数据分发服务-Data Distribution Service)

    DDS协议 高可靠性 实时性 DDS Data Distribution Service for Real Time Systems xff0c 是一种面向实时系统的数据分发服务 xff0c 由OMG提供 xff0c 它的权威性可以证明该协
  • MQTT与DDS的比较

    MQTT VS DDS MQTT协议 三种服务质量 QoS xff1a 最多一次 Sender 发送的一条消息 xff0c Receiver 最多能收到一次 xff0c 也就是说 Sender 尽力向 Receiver 发送消息 xff0c
  • R-Car H3系列SOC芯片与R-Car M3 R8A77961JBP0BA区别

    RENESAS推出的 xff1a R Car H3 系列 SOC 芯片 R8A77951JA00BA xff03 YJ1 xff0c R Car M3 系列 SOC 芯片 R8A77960JA60BG xff03 YJ5 在内核上 xff1
  • PTP(IEEE1588),TSN时间同步方法

    本文首先简要介绍主流的时间同步方式GNSS xff0c NTP xff0c PTP 然后通过NTP和PTP对比 xff0c 解释PTP性能更优秀的原因 xff1b 并对算法公式进行了推导 0 Why need time synchroniz
  • AUTOSAR的四种功能安全机制

    虽然AUTOSAR不是一个完整的安全解决方案 xff0c 但它提供了一些安全机制用于支持安全关键系统的开发 本文用于介绍AUTOSAR支持的四种功能安全机制 xff1a 内存分区 xff08 Memory Partitioning xff0
  • libstdc++版本冲突的解决

    类似的问题出现在测试环境部署过程 xff0c 当编译完成该前端解析器后 xff0c 由于其依赖一些库文件 xff0c 包括系统库文件libstdc 43 43 so 6 及 libc so xff0c 这都是系统至关重要的库文件 但是不同系
  • 3D打印——CLIP技术之更快速更高表面质量

    论文 Gradient light video projection based stereolithography for continuous production of solid objects 阅读 论文共分为6个章节 xff1a
  • 汽车上DTC是什么意思?DTC是什么故障

    DTC的全称是 Diagnostic Trouble Code xff0c 意为诊断故障代码 如今 xff0c 汽车很多故障都是通过故障代码去诊断的 xff0c 例如汽车底盘检测 车身及附件检测 汽车污染物与噪声处理部件等相关检测等 目的旨
  • 人生算法——读书笔记

    跨越出生和运气 xff0c 实现富足和自由 用概率思维 做好决策 人生算法九段 广义而言大自然有两个重要的算法 xff0c 一个是进化 xff0c 一个是大脑 现实中我们虽然拼命思考 xff0c 但是极少思考自己的思考 围绕认知的飞轮 xf
  • Linux 上功能强大的网络工具 tcpdump 详解

    tcpdump 是用于捕获传入和传出流量的网络实用程序 这是您需要了解的有关在 Linux 上使用 tcpdump 的所有信息 Linux 配备了大量的网络实用程序可供选择 tcpdump 是一种功能强大的网络工具 xff0c 如果您需要对
  • 简析车载以太网TSN标准

    众所周知 xff0c 通用以太网是以非同步方式工作的 xff0c 网络中任何设备都可以随时发送数据 xff0c 因此在数据的传输时间上既不精准也不确定 xff1b 同时 xff0c 广播数据或视频等大规模数据的传输 xff0c 也会因网络负
  • 英伟达发布的系统级芯片orin

    本文为英伟达全面分析的第七篇文章 xff0c 关注英伟达在今年会大规模交付的Orin系统级芯片 Orin 是亚特兰蒂斯神话第一任统治者 xff0c 海王Altan的儿子 Orin一经发布 xff0c 便成为众多车企争抢装车的对象 本文重点探
  • Shell内置命令之exit的语法与实例

    系统中是有exit命令的 用于退出当前用户的登录状态 但是在 Shell 脚本中 exit 语句是用来退出当前脚本的 下面这篇文章主要给大家介绍了关于Shell内置命令之exit的语法与实例 需要的朋友可以参考下 https www jb5
  • SHELL编程

    一 变量 1 shell 脚本基础知识 编译型语言 xff1a 如 c语言 解释型语言 xff1a shell 脚本 shell脚本的本质 xff1a shell命令的有序集合 2 shell 编程的基本过程 基本过程分为三步 xff1a
  • 浅谈TC8数据链路层测试

    当今时代 xff0c 智能汽车已成为一个炙手可热的话题 xff0c 各种先进汽车电子技术蓬勃发展 xff0c 比如自动驾驶 V2X OTA 这些新技术的背后都离不开车载以太网通信技术的支持 浅谈TC8数据链路层测试 知乎 其中数据链路层实现
  • 100 道 Linux 常见面试题 建议收藏,慢慢读~

    本文共 2W 43 字 xff0c 分别从 Linux 概述 磁盘 目录 文件 安全 语法级 实战 文件管理命令 文档编辑命令 磁盘管理命令 网络通讯命令 系统管理命令 备份压缩命令等方面拆解 Linux 常见面试问题 可以先收藏 xff0
  • patchelf 的功能以及使用 patchelf 修改 rpath 以解决动态库问题

    低版本 libc 库运行高版本 libc 库编译的程序 https blog csdn net Longyu wlz article details 108023117 在这篇博客中我描述了使用 patchelf 来修改动态库链接器的方法
  • Alpha-beta 算法

    Alpha beta 算法是棋类游戏中最常用的 xff0c 也是最基础的剪枝方法 xff0c 要说Alpha beta 算法 就得先说下max min博弈树 算法 xff0c 就是模拟电脑下子 xff0c 要下在对电脑最优的地方 xff0c