人工智能AI 全栈体系(十三)

第二章 计算机是如何学会下棋的

人类棋手在下棋时,会根据自己的经验只考虑在当前棋局下最重要的几个可能的走法,但是计算机没有这种经验。

知识太复杂了,需要考虑很多具体的情况,一旦知识总结的不到位,可能就会出现大的差错,总结知识让计算机使用应该是走不通的。

三、 α \alpha α- β \beta β 剪枝算法

1. 极小-极大模型存在的问题

在这里插入图片描述

2. 人如何处理这个问题呢?

请添加图片描述
请添加图片描述

3. α \alpha α- β \beta β 剪枝算法

  • 假设并不是一开始就将整个搜索图生成出来,而是按照一定的原则一点一点地产生。比如下图是一个搜索图,我们假设一开始并没有这个图,而是按照从上到下从左到右的优先顺序来生成这个图。我们先从最上边一个节点开始,按顺序产生 a、c、g、r 四个节点,假设就考虑 4 步棋,这时就不再向下生成节点了。由于 r 的分值为 0,而 g 是极小节点,所以我们知道 g 的分值应该 ≤0。接下来再生成 s 节点,由于 s 的分值为 5,g 是极小节点且没有其他子节点了,所以 g 的分值等于 0。由于 c 是极大节点,根据 g 的分值为 0,我们有 c 的分值 ≥0。再看 c 的其他后辈节点情况,生成 h 和 t 两个节点,由于 t 的分值为-3,而 h 是极小节点,所以有 h 的分值 ≤-3。
    在这里插入图片描述
  • c 的分值 ≥0,而 h 的分值 ≤-3,这时 u 的分值是多少都无关紧要了。
  • 图中 u 的分值如果大于 h 的当前分值-3,则不影响 h 的分值,即便 u 的分值小于-3,比如-5,虽然改变了 h 的分值为 ≤-5,但是由于 c 是极大节点,c 的当前分值已经至少为 0 了,所以 h 的分值变小也不会改变 c 的分值。
  • 这样的话,遇到图中这种 h 的当前分值小于 c 的当前分值这种情况时,由于 u 的分值是多少都不会影响 c 的分值了,所以就没有必要生成 u 这个节点了。这种情况我们称之为剪枝,其剪枝条件是如果一个后辈的极小节点(如图中的 h),其当前的分值小于等于其祖先极大节点的分值时(如图中的 c),则该后辈节点的其余子节点(如图中的 u)就没有必要生成了,可以被剪掉。注意这里用的是后辈节点和祖先节点,这是一种推广,因为这种剪枝并不局限于父节点和子节点的关系。
  • 在确认了 c 的分值为 0 之后,同样的理由,我们可以确认 a 的分值 ≤0。生成 a 的后辈节点 d、i、v,由于 v 的分值为 3,且 d 向下就一条路,所以有 d 的分值 ≥3。由于 a 的分值最大为 0,而 d 的分值最小为 3,所以大的红圈圈起来的那些分支的分值是多少又没有意义了,a 取 c 和 d 中分值最小的,最终 a 取值为 0,大红圈圈起来的部分都没有必要生成了,又可以被剪掉。这里我们又发现了另外一个剪枝条件:如果一个后辈的极大节点的分值(如图中节点 d)大于等于其祖先极小节点的分值时(如图中节点 a),则该后辈节点还没有被生成的节点可以被剪掉,如图中大红圈圈起来的那些节点。
  • a 的分值被确定为 0 之后,就可以确定 R 的分值 ≥0,继续向下生成节点 b、e、n、E,由于 E 的分值为 0,所以有 n 的分值 ≤0。n 是极小节点,其极大节点祖先有 e 和 R,e 这时还没有值,但是 R 的分值 ≥0,所以满足后辈极小节点的分值小于等于其祖先极大节点分值的剪枝条件,n 的两个子节点 F 和 G 都没有生成的必要,又可以被剪掉了。
  • n 的分值被确定为 0,从而有 e 的分值 ≥0。接着生成节点 o 和 H,由于 H 的分值为 1,有 o 的分值 ≤1,不满足剪枝条件,生成节点 I,I 的分值为 2,o 是极小节点,所以 o 的分值确定为 1。e 是极大节点,从 n 和 o 的分值中选取最大的,从而更新 e 的取值,由原来的 0 修改为 1。e 的分值确定为 1 后,有 b 的分值 ≤1。继续生成 b 的后辈节点 f、P、J,J 的分值为 6,得到 P 的分值 ≤6,不满足剪枝条件,继续生成子节点 K,得到 K 的分值为 8,P 是极小节点,选取子节点中最小的值 6,从而确定 f 的分值 ≥6。后辈极大节点 f 的分值 6 大于等于其前辈极小节点 b 的分值 1,满足剪枝条件,q、M、N 三个节点被剪枝,从而确定 b 的分值为 1。R 的分值取 a、b 中最大者,从而用从节点 b 得到的 1 代替原来从 a 得到的 0。搜索过程到此结束,按照刚才的搜索结果,甲方应该选择 b 作为行棋的最佳走步,如图中的红色箭头所示。
  • 这种方法就是 α-β 剪枝算法,可以利用已有的搜索结果,剪掉一些不必要的分枝,有效提高了搜索效率。

请添加图片描述

  • 深蓝就是用了 α-β 剪枝算法,从而可以在规定的时间内完成一次行棋过程。
  • 这种 α-β 剪枝算法得到的最佳走步跟极小-极大模型得到的结果是一样的。α-β 剪枝只是剪掉了那些不改变结果的分枝,所以不影响最终选择的走步。
  • 那些分值是如何得到的?何处发生剪枝完全取决于那些分值,如果分值不准确则得到的结果也就值得怀疑了。

4. 如何估值?

请添加图片描述

  • 这些分值是非常重要的。据深蓝的研发者介绍说,他们聘请了好几位国际象棋大师帮助他们整理知识,用于估算分值。但是基本思想并不复杂,大概就是根据甲乙双方剩余棋子进行加权求和,比如一个皇后算 10 分,一个车算 7 分,一个马算 4 分等。然后还要考虑棋子是否具有保护,比如两个相互保护的马,分数会更高一些,其他棋子也是大体如此。然后再考虑各种残局等,按照残局的结果进行估分。当然,这里给出的各个棋子的分数只是大概而已。最后甲方得分减去乙方得分就是该棋局的分值。
  • 这个估值虽然看起来有些粗糙,但是由于在剪枝过程中探索的比较深,对于象棋来说,无论是国际象棋还是中国象棋,在探索的比较深的情况下,凭借棋子的多少基本就可以评判局面的优劣了,所以可以得到比较准确的估值。
  • 所以对于计算机下棋来说,探索的越深其棋力也就越强,在可能的情况下,应该尽可能探索的更深一些。

5. α \alpha α- β \beta β 剪枝效果如何?

请添加图片描述
请添加图片描述

6. 几点注意

请添加图片描述

α-β 剪枝的关键点
  • 在判断是否剪枝时,都是后辈极小节点与祖先极大节点进行比较、后辈极大节点与祖先极小节点做比较。当后辈极小节点的值小于等于祖先极大节点的值时,发生剪枝;当后辈极大节点的值大于等于前辈极小节点的值时,发生剪枝。

  • 在判断是否剪枝时,一定要注意不只是与父节点做比较,还要考虑祖先节点。

  • 在完成一次 α-β 剪枝后,只是选择了一次行棋,下一次应该走什么棋,应该在对方走完一步棋后,根据棋局变化进行 α-β 剪枝过程,再次根据搜索结果确定走什么棋。

7. 总结

请添加图片描述

  • 对于真实的棋类游戏,由于其状态数过于庞大,不可能通过穷举所有状态的方法获得最佳走步。受人类下棋时思考过程的启发,提出了计算机下棋的极小-极大模型。该模型只在有限步内搜索,获得有限范围内的最佳走步。但同样由于棋类变化太多,即便是有限范围的搜索也是非常花费时间的。人类棋手在做极小-极大搜索的时候,并不是考虑有限范围内的每一种可能的走法,而是根据经验砍掉大量的不合理分枝,从而极大地缩小了搜索范围。受此启发提出了 α-β 剪枝算法,与人类利用经验砍掉大量不合理分枝不同,计算机并没有这种经验,而是利用已有的搜索结果,砍掉没有必要产生的分枝,有效地提高了搜索效率。深蓝就是采用的这种方法。

  • α-β 剪枝条件:

    • 当后辈的极小节点值小于等于其祖先的极大节点值时,发生剪枝。

    • 当后辈的极大节点值大于等于其祖先的极小节点值时,发生剪枝。

  • 注意:比较时不只是与其父节点做比较,还要与其祖先节点做比较,只要有一个祖先节点满足比较的条件,就发生剪枝。

  • α-β 剪枝算法所得到的最佳走步质量严重依赖于最底层节点估值的准确性,搜索的越深,估值越准确。这是因为越深的节点其对应的棋局中棋子越少,而棋子比较少的情况下,其局面的估值也就会比较准确。这与人下棋时的思考也是一致的。

  • α-β 剪枝算法结束时得到的只是当前棋局下的一步走法,相当于我们思考了半天决定了一步棋如何走,后面如何进行,需要待对方走完一步棋后再次进行 α-β 剪枝搜索获得下一步棋的走法。也就是说,每行棋一次都需要进行一次 α-β 剪枝搜索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/170461.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【寒武纪(14)】硬件系统由标量指令、向量指令、张量指令、访存指令构成

我们在文档《Cambricon-BANG-C-Developer-Guide-EN-v4.5.1》的build-in function 发现,存在三种计算:矩阵乘法、标量类型、向量。 查阅《Cambricon-BANG-C-CProgramming-Guide-CN-v1.5.0.pdf》可知,硬件系统由标量指令、向量指令、张量指令、…

提升工作效率,使用AnyTXT Searcher实现远程办公速查公司电脑文件——“cpolar内网穿透”

文章目录 前言1. AnyTXT Searcher1.1 下载安装AnyTXT Searcher 2. 下载安装注册cpolar3. AnyTXT Searcher设置和操作3.1 AnyTXT结合cpolar—公网访问搜索神器3.2 公网访问测试 4. 固定连接公网地址 前言 你是否遇到过这种情况,异地办公或者不在公司,想找…

STM32 Flash

FLASH简介 Flash是常用的用于存储数据的半导体器件,它具有容量大,可重复擦写,按“扇区/块”擦除、掉电后数据可继续保存的特性。 常见的FLASH主要有NOR FLASH和NAND FLASH两种类型。NOR和NAND是两种数字门电路,可以简单地认为FL…

计算机毕业设计python企业员工人事管理系统vue

管理员: 1.员工资料管理:查看员工列表,添加职工,修改信息(搜索员工使用模糊查询) 2.部门管理:查看部门列表,修改信息,添加新部门 3.职工考勤管理:添加&#x…

你知道如何实现游戏中的透视效果吗?

引言 游戏中的透视效果可以合理运用CtrlCV实现。 不知道大家有没有这样一段经历:在做Cocos项目时需要一些特定的Shader去做一些特定的效果,例如透视、高光、滤镜等等,想自己写吧,不怎么会啊,网上又找不到&#xff0c…

EtherCAT从站EEPROM分类附加信息详解:RXPDO(输入过程数据对象)

0 工具准备 1.EtherCAT从站EEPROM数据(本文使用DE3E-556步进电机驱动器)1 分类附加信息——RXPDO(输入过程数据对象) 1.1 分类附加信息规范 在EEPROM字64开始的区域存储的是分类附加信息,这里存储了包括设备信息、SM配置、FMMU配置在内的诸多信息。每个信息在一段连续的…

会议剪影 | 思腾合力受邀出席第四届长三角文博会并作主题演讲

以“担当新使命:长三角文化产业的力量”为主题的「第四届长三角国际文化产业博览会」于2023年11月16日-19日在国家会展中心(上海)成功举办。思腾合力作为行业领先的人工智能基础架构解决方案商出席本次盛会。 此次展会的面积首次超过10万平米&#xff0c…

BUUCTF [BJDCTF2020]一叶障目 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。来源:https://github.com/BjdsecCA/BJDCTF2020 密文: 下载附件,解压得到一张.png图片。 解题思路: 1、在010 Editor中打开&#x…

【六祎 - Dubbo】Dubbo 应用 XML配置分析;Dubbo 配置篇;Dubbo参考手册

Dubbo 应用 XML配置分析 演示案例:提供者代码xml配置消费者代码xml配置 参考地址: 手动配置 https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/overview/ 配置说明 xml配置 https://cn.dubbo.apache.org/zh-cn/ov…

Haclon简介及数据类型

Haclon简介 HALCON是由德国MVtec公司开发的机器视觉算法包,它由一千多个各自独立的函数(算子)构成,其中除了包含各类滤波、色彩以及几何、数学转换、形态学计算分析、图像校正,目标分类辨识、形状搜寻等基本的图像处理…

Linux常用命令——builtin命令

在线Linux命令查询工具 builtin 执行shell内部命令 补充说明 builtin命令用于执行指定的shell内部命令,并返回内部命令的返回值。builtin命令在使用时,将不能够再使用Linux中的外部命令。当系统中定义了与shell内部命令相同的函数时,使用…

基于Python实现用于实时监控和分析 MySQL 服务器的性能指标和相关信息工具源码

MySQL命令行监控工具 - mysqlstat 介绍 mysqlstat 是一个命令行工具,用于实时监控和分析 MySQL 服务器的性能指标和相关信息。 它可以帮助 DBA(数据库管理员)和开发人员定位和解决数据库性能问题。 以下是 mysqlstat 工具的主要功能&#…

007 OpenCV霍夫变换

目录 一、环境 二、霍夫变换原理 三、代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、霍夫变换原理 OpenCV中的霍夫变换是一种用于检测图像中直线和圆的算法。它基于图像中像素的分布情况,通过统计像素点之间的…

纯CSS实现炫酷文本时钟

如图所示这是一个纯本文时钟效果,和传统的时钟不一样,没有表盘,也没有完整到每一分钟的数字表示当前时刻。 在这个时钟中,当前时间通过文本显示,显示的文本时间误差为+/- 4分钟,以明亮的颜色突出显示当前时间,而其余字母则较暗。 实际上这是一个实现很复杂的时钟,因为…

python刷题笔记1(42例题)

1. split()函数 str.split([sep [, maxsplit]]) 分割字符串,返回一个数组 2. 判断子串 # 判断子串是否在主串里面,是则输出“Yes”,否则输出“No” str1 input("子串:") str2 input("主串:") if str1 in s…

Python如何将项目直接打包为一键整合包

目录 一、准备项目 二、创建打包文件 三、创建安装脚本 四、执行安装 五、测试安装 六、常见问题与解决方案 总结 Python项目打包成一键整合包是一个比较复杂的任务,需要考虑到项目的各个方面,包括依赖项、配置文件、静态文件、数据库等等。下面是…

Flask Web开发:数据库

目录 在虚拟环境中安装Flask-SQLAlchemy: 一、配置 数据库配置示例: 二、定义模型 Role 和 User 模型代码: (1)常用的 SQLAlchemy 列类型:​编辑 (2)常用的 SQLAlchemy 列选项…

基于springboot实现冬奥会科普平台系统【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现冬奥会科普平台系统演示 摘要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理平台应运而生&…

vue3-响应式核心

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-响应式核心 响应式核心 目录 响应式核心 3.1ref() 3.2computed () 3.3 reactive() 3.4 …