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

news2024/11/25 7:24:55

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

下棋一直被认为是人类的高智商游戏,从人工智能诞生的那一天开始,研究者就开始研究计算机如何下棋。著名人工智能学者、图灵奖获得者约翰·麦卡锡在 50 年代就开始从事计算机下棋方面的研究工作,并提出了著名的 α-β 剪枝算法。很长时间内,该算法成为了计算机下棋程序的核心算法,著名的国际象棋程序深蓝采用的就是该算法框架。

一、可以穷举吗?

1. 棋类人机大战简史

请添加图片描述

  • 1996 年,正值人工智能诞生 40 周年之际,一场举世瞩目的国际象棋大战在深蓝与卡斯帕罗夫之间举行,可惜当时的深蓝功夫欠佳,以 2:4 的比分败下阵来。1997 年,经过改进的深蓝再战卡斯帕罗夫,这次深蓝不负众望,终于以 3.5:2.5 的比分战胜卡斯帕罗夫,可以说是人工智能发展史上的一个里程碑事件。

  • 到了 2006 年,为了庆祝人工智能诞生 50 周年,中国人工智能学会主办了浪潮杯中国象棋人机大战,先期举行的机器博弈锦标赛获得前 5 名的中国象棋系统,分别与汪洋、柳大华、卜凤波、张强、徐天红 5 位中国象棋大师对弈,人机分别先行共战两轮 10 局比赛,双方互有胜负,最终机器以 11:9 的总成绩战胜人类大师队。

  • 转眼到了 2016 年,又值人工智能诞生 60 周年,人工智能的发展已不可同日而语,呈现出蓬勃发展之势。沉默多年的计算机围棋界突然冒出个 AlphaGo,先是 4:1 战胜韩国棋手李世石,转年又战胜我国的柯洁。至此,在计算机下棋这个领域,机器已经完全碾压人类棋手,机器战胜人类最高水平棋手已无任何悬念。

在这里插入图片描述

  • 三次重要事件均与人工智能提出的秩年有关,三大棋类机器战胜人类顶级棋手的时间顺序也刚好与三大棋类可能出现的状态数的多少一致,这也许只是一种巧合,在本章可以看到,状态数的多少并不是棋类难度的主要问题。

2. 分钱币游戏

  • 分钱币游戏是这样的,桌上有若干堆钱币,每次对弈的一方选定一堆钱币,并将该堆钱币分成不等的两堆,这一过程称为行棋。甲乙双方轮流行棋,直到有一方不能行棋为止,则对方取胜。下图给出了初始状态为 8 个钱币的例子,图中给出了该问题所有可能的走法。

在这里插入图片描述

  • 假设甲方先行行棋,甲方可以将 8 枚硬币分成(6,2)两堆,或者(5,3)两堆,或者(7,1)两堆,但不能分成(4,4),因为这是分成了相等的两堆,这是规则所不允许的。下一步轮到乙方行棋,“1”这堆不能选,因为无法分成两堆,“2”这堆也不能选,因为不能分成不相等的两堆,“6”、“5”、“7”都是可选的,但是要注意“6”只能分成(4,2)或者(5、1),而不能分成(3,3),因为(3,3)是相等的两堆。按照这样的原则,在图中给出了所有可能的行棋方法。
  • 甲方如果按照红色箭头走成(7,1),则乙方只能选择“7”这堆,将“7”分成(6,1)或者(5,2)或者(4,3),也就是图中按照黄色箭头得到(6,1,1)、(5,2,1)、(4,3,1)。无论对于这三种情况的哪一种,甲方都可以按照红色箭头选择行棋到(4,2,1,1),比如乙方行棋到了(6,1,1),则甲方将“6”分成(4,2),如果乙方走的是(5,2,1),则甲方将“5”分成(4,1)即可。而一旦甲方走到了(4,2,1,1),则乙方只能行棋到(3,2,1,1,1),这时甲方只需将“3”分成(2,1),得到(2,2,1,1,1,1),则乙方无棋可走,必输无疑。也就是说,对于这样一个分钱币游戏,甲方是存在必胜策略的。
  • 只要甲方走棋正确,乙方无论如何是不可能获胜的。
  • 对于分钱币游戏这样的简单问题,或者再稍微复杂一点的游戏,依靠穷举所有可能的方法也许可以找到必胜策略,但是对于象棋、围棋这样的变化非常多的棋类,是不可能穷举其所有可能性的。这也是目前在一些人中存在的误解,认为现在计算机速度这么快,存储这么大,对于国际象棋、中国象棋这样的棋类,完全可以依靠穷举战胜人类。其实这是非常错误的看法。

请添加图片描述

  • 以中国象棋为例分析一下。在考虑不同的走棋顺序的情况下,总的状态数大约为 1 0 150 10^{150} 10150 ,假设 1 毫微秒可以产生一个状态,则产生出这些状态大约需要 1 0 134 10^{134} 10134 年。这是什么概念呢?从存储上考虑,地球上的原子总数约 1 0 50 10^{50} 1050 个,如果一个原子可以存储一个状态的话,则需要 1 0 100 10^{100} 10100 个地球才有可能存储得下这些状态。从时间上考虑,按照宇宙大爆炸的理论推算,宇宙年龄大概为 1.38 × 1 0 10 1.38 \times 10^{10} 1.38×1010 年,假设从宇宙诞生那一刻起就有一台高速计算机以每毫微秒生成一个状态的速度在运算,到目前为止也只产生了其中的 1.38 × 1 0 − 124 1.38 \times 10^{-124} 1.38×10124 %,也就是 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000138%。

  • 中国象棋的状态数特别大,依靠穷举所有可能的状态获得必胜策略的想法是行不通的。

  • 国际象棋的状态数稍微少一些,但也没有质的差别,围棋状态数则更多。

  • 所以结论就是不能靠穷举出所有可能状态的方法找到必胜的行棋策略。

3. 总结

请添加图片描述

  • 棋类历史上有过三次著名的人机大战事件。大家对计算机围棋系统 AlphaGo 战胜李世石、柯洁,计算机国际象棋系统深蓝战胜卡斯帕罗夫比较熟悉,在这两次人机大战之间,我国的五套计算机中国象棋系统战胜了人类五位中国象棋大师,也是人工智能发展史上的一件大事。

  • 在一些人中经常有这样的误解:认为现在计算机速度这么快,存储这么大,对于国际象棋、中国象棋这样的棋类,计算机完全可以依靠穷举出其所有可能状态的方法战胜人类,这是非常错误的看法。无论是国际象棋还是中国象棋,由于其可能出现的状态数过于庞大,是不可能通过穷举所有可能状态的方法找到必胜策略的。三次人机大战均与人工智能提出的秩年有关,三大棋类机器战胜人类顶级棋手的时间顺序也刚好与三大棋类可能出现的状态数的多少一致(按照可能的状态数多少从小到大排序依次为国际象棋、中国象棋和围棋),这也许只是一种巧合。

二、极大-极小模型

  • 下象棋的人,在下棋时是如何考虑走哪步棋的?
  • 在轮到自己行棋时,自己会考虑有哪几种下法,再考虑对于自己每种下法对方会如何考虑,自己再如何考虑……,然后看几步棋之后的局面如何,再选择一个自己认为好的走步。职业棋手能考虑到 7、8 步。
    请添加图片描述

1. 极大-极小模型

  • 这个思考过程可以用下图来示意。图中最上方的方框表示当前棋局,轮到甲方行棋,甲方考虑自己有 a 和 b 两种走法,下一步轮到乙方行棋,针对棋局 a,乙方可以有 c、d 两种走法,而对于 b,乙方可以有 e、f 两种走法。下一轮又该轮到甲方行棋……。假设甲方只思考了 4 步棋,则形成了下图的搜索图,最后一行就是双方四步后可能出现的棋局。从甲方的角度来说,他希望最后走到一个对自己有利的局面,而对乙方来说他也希望走到一个对乙方有利的局面。

在这里插入图片描述

  • 假设局面是否有利可以用一个分值表示,大于 0 的分值表示对甲方有利,而小于 0 的分值表示对乙方有利,等于 0 则表示双方势均力敌,是一个双方都可以接受的局面。我们从倒数第二行的圆圈开始考虑,这一行应该轮到乙方行棋。比如对于节点 g,乙方可以有两个选择,一个可以得到分值 0,一个可以得到分值 5。由于分值越小对乙方越有利,所以乙方肯定会选择走获得 0 分值的那一步,而不会选择走获得 5 分值的那一步。对于节点 h 也同样,乙方肯定会选择获得-3 分值的那一步。这一行的其他节点也一样,都是从其子节点中选择获得分值最小的那步棋。所以我们可以总结为,对于这一层来说,乙方总是选择具有极小值的节点作为自己的走步。图中倒数第二行节点边标的数字就是乙方所获得的分值。
  • 我们再看倒数第三行的方框,这一行应该轮到甲方行棋。甲方刚好与乙方相反,他肯定会选择子节点中分值最大的那步棋。比如对于节点 c,甲方可以选择走到 g,可以获得 0 分值,也可以选择 h 获得-3 分值。由于分值越大对甲方越有利,甲方只会选择行棋到 g 获得 0 分值,而不会选择 h 获得-3 分值。这一行的其他节点也同样,图中标出了其他节点可以获得的分值。
  • 最后我们再看 a、b 两个节点。这两个节点又轮到乙方行棋。乙方同样会从其子节点中选取分值小的节点作为走步,这样 a 可以获得 0 分值,b 可以获得 1 分值。而 a 和 b 是当前局面下可能的两个选择。如果选择 a,无论对方如何行棋,甲方都可以获得至少 0 分值,如果选择 b,无论对方如何行棋,甲方都可以至少获得 1 分值。虽然 0 分值对于甲方也是可以接受的,但是 1 分值结果会更好。所以经过这么一番思考后,甲方决定如图中红色箭头所示的,选择行棋到 b。这是一个模仿人类下棋的过程。
  • 对于最后可能形成的局面人类只是大概估计一下是否对自己有利。这里之所以用数字表示,一方面是为了量化局面的有利程度,另一方面是为了以后用到计算机下棋上,计算机处理的话,必须表示为数字。
  • 由于这种方法一层求最小值、一层求最大值交替进行,所以称作极小-极大模型,是通过模仿人类的下棋过程得到的一个模型。其中求最小值的节点称作极小节点,求最大值的节点称作极大节点。
  • 上面说的这些内容,都是甲方为了走一步棋,而在他大脑内的思考过程,并不是甲乙双方真的在行棋。经过一番这样的思考后,甲方选择一步行棋,等待乙方下完一步棋后,甲方再根据乙方的行棋结果再次进行这样的思考。所以上述极小-极大模型只是描述了甲方走一步棋的过程。

2. 限定深度就可以穷举吗?

  • 计算机就是采用这种办法下棋的吗?
  • 还不是,因为这样做的话,对于实际的下棋过程计算量还是非常大的。以下国际象棋的深蓝为例,基本上要搜索 12 步,搜索树的节点数在 1018 量级,据估算,即便在深蓝这样的专用计算机上,完成一次搜索也需要大概 17 年的时间,所以这个极小-极大模型只是用来描述这样一种模拟人类下棋的过程,并不能真的用于计算机下棋,一些简单的棋类或许可能可以。

请添加图片描述

3. 总结

请添加图片描述

  • 人类在下棋的过程中,一般是通过向前考虑若干步的方法找到自认为比较好的走法。受人类棋手下棋过程的启发,提出了计算机下棋的极小-极大模型。该模型是在有限搜索深度内穷举出所有可能的状态,从中找出一个在该搜索深度内的最好走法。
  • 由于搜索深度越深计算机下棋的水平越高,极小-极大模型虽然限制了搜索的深度,但是对于真实的棋类问题,要达到与人类大师抗衡的水平,还是因为计算量过大,耗时过多而不能满足实际要求。以深蓝为例,搜索深度限制为 12 步,用极小-极大方法实现的话,完成一次搜索需要耗时 17 年时间。这显然是不现实的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关键字驱动自动化测试框架搭建详解

前言 那么这篇文章我们将了解关键字驱动测试又是如何驱动自动化测试完成整个测试过程的。关键字驱动框架是一种功能自动化测试框架,它也被称为表格驱动测试或者基于动作字的测试。关键字驱动的框架的基本工作是将测试用例分成四个不同的部分。首先是测试步骤&#…

用HTML + javaScript快速完成excel表格信息除重并合并

今天突然接到一个工作,要把两个存储在.xls的主体信息表,除重后合并成一个主体信息表,并且补充主体类型和所在县区这两列信息。 完成这项工作的方法有很多,如果信息表中的信息量不大的话,手工处理一下也行,如…

MYSQL运维篇(已完结)

一、日志 1. 错误日志 2. 二进制日志 😎 介绍 😎 日志格式 😎 日志查看 😎 日志删除 3. 查询日志 4. 慢查询日志 二、主从复制 1. 概述 2. 原理 3. 搭建 4. 总结 三、分库分表 1. 介绍 🍤 问题分析 🍤…

WPF布局与控件分类

Refer:WPF从假入门到真的入门 - 知乎 (zhihu.com) Refer:WPF从假入门到真的入门 - 知乎 (zhihu.com) https://www.zhihu.com/column/c_1397867519101755392 https://blog.csdn.net/qq_44034384/article/details/106154954 https://www.cnblogs.com/mq0…

报错“this.bookDao“ is null

这是我的报错: 原因是我的BookServiceImpl方法中的对象没有装配: 添加上自动装配注释即可实现自动装配:

Python---字符串的修改方法---replace()替换

修改字符串,指的就是通过函数(方法)的形式修改字符串中的数据。 编号函数作用1replace()返回替换后的字符串2split()返回切割后的列表序列3capitalize()首字母大写4title()所有单词首字母大写5upper()与lower()返回全部大写或小写的字符串6l…

文件夹批量改名:轻松实现文件夹随机重命名

无论是在我们的日常生活还是工作中,批量重命名文件夹是一项非常常见的任务。当我们需要整理或分类大量的文件时,往往需要对相应的文件夹进行重命名。然而,手动一个接一个地完成这个任务不仅会消耗大量的时间,还容易在重命名过程中…

Apache Doris (五十二): Doris Join类型 - Broadcast Join

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Broadcast Join原理

AD7792/AD7793 备忘

AD7792/AD7793 是一款 ∑-Δ ADC,3 通道、低噪声,内部集成仪表放大器和参考源。AD7792 为 16 位,AD7793为 24 位。 供电电压:2.7 ~ 5.25 V,并不支持负电压。转换速率:4.17 Hz ~ 470 Hz内置参考基准&#x…

图片怎么转换成pdf?

图片怎么转换成pdf?图片可以转换成PDF格式文档吗?当然是可以的呀,当图片转换成PDF文件类型时,我们就会发现图片更加方便的打开分享和传播,而且还可以更加安全的保证我们的图片所有性。我们知道PDF文档是可以加密的&…

mac系统快速切换不同版本JDK

1.安装所需jdk版本 下载地址:http://www.codebaoku.com/jdk/jdk-index.html 本示例安装了jdk8和jdk19两个版本 2.查看对应安装路径 安装好后,通过终端输入以下命令查看相关路径(后续需在.bash_profile中配置) /usr/libexec/ja…

技术分享 | 抓包分析 TCP 协议

TCP 协议是在传输层中,一种面向连接的、可靠的、基于字节流的传输层通信协议。 环境准备 对接口测试工具进行分类,可以如下几类: 网络嗅探工具:tcpdump,wireshark代理工具:fiddler,charles&a…

OmniPlan Pro 4:一站式项目流程管理神器

🤖 OmniPlan Pro 4 for Mac 是一款强大的项目管理软件,具备许多功能。以下是它的一些主要功能介绍: 🗓️ 强大的项目计划: OmniPlan Pro 4 可以帮助您创建详细的项目计划。您可以创建任务、设置任务之间的依赖关系、分…

软件测试/测试开发丨Python安装指南(Windows版)

点此获取更多相关资料 下载 Python 解释器 下载地址: https://www.Python.org/downloads/ 通过下载页面,可以在该页面上看到下载链接。 在下载列表中以“(64-bit)”结尾的链接是 64 位的 Python 安装程序,以“(32-bit)”开头的链接是 32 位的 Python 安…

Chromebook文件夹应用新功能

种种迹象表明 Google 旗下的 Chromebooks 近期要有大动作了。根据 Google 团队成员透露,公司计划在 Chrome OS 的资源管理器中新增“Recents”(最近使用)文件,以便于用户更快找到所需要的文件。 种种迹象表明 Google 旗下的 Chro…

一方的系统架构师认证考试之路

为什么参加 因为人民币。听说过医生、律师等职业有评职称的考试,程序员也能评职称?评个职称有啥用?我等体系外的一线搬砖仔,考个软考高级证有啥用?答:拿到证原地加薪 500/月,有图为证&#xff…

三:ffmpeg命令帮助文档

目录 一:帮助文档的命令格式 二:将帮助文档输出到文件 一:帮助文档的命令格式 ffmpeg -h帮助的基本信息ffmpeg -h long帮助的高级信息ffmpeg -h full帮助的全部信息 ffmpeg的命令使用方式:ffmpeg [options] [[infile options] …

作用域,基本数据类型(常量const),转义字符,运算符

1.作用域 全局作用域:定义在所有花括号外的名字具有“全局作用域” 块作用域:在某个花括号内定义的名字具有“块作用域” 一般把具有全局作用域的变量叫做“全局变量”,具有块作用域的变量叫做“局部变量” 如果在嵌套作用域里出现重名&a…

如何优化服务器负载均衡策略?一文讲解

在现代大规模、高流量的网络使用场景中,对于企业来说,仅凭单机提供业务已不能给用户带来最佳体验,应用的可靠性和速度也会受到影响。为了应对高并发和海量数据的挑战,必须提升系统性能,服务器负载均衡技术应运而生。那…

MySQL主从搭建,实现读写分离(基于docker)

一 主从配置原理 mysql主从配置的流程大体如图: 1)master会将变动记录到二进制日志里面; 2)master有一个I/O线程将二进制日志发送到slave; 3) slave有一个I/O线程把master发送的二进制写入到relay日志里面; 4&#xf…