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

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

下棋一直被认为是人类的高智商游戏,从人工智能诞生的那一天开始,研究者就开始研究计算机如何下棋。著名人工智能学者、图灵奖获得者约翰·麦卡锡在 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.mfbz.cn/a/118409.html

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

相关文章

如何使用Node.js快速创建HTTP服务器并实现公网访问本地Server

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

哪一波最容易亏钱,昂首资本这样讲

有交易者咨询anzo capital昂首资本,按照波浪理论最容易亏钱是在第几波,通过调查得知80%的错误发生在第四波。所以对哪一波最容易亏钱,很有可能就是第四波。当然了如果能准确的判断第四波时,也可能获得相当丰厚的利润。 第四波通…

❤️ React的安装和使用(实战篇)

React的安装和使用 一、React的安装和使用 reactJs警告提示: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap 翻译:tar2.2.2:此版本的tar不再受支持,将不会收到安全…

CentOS 7使用RPM包安装MySQL5.7

目标 本文目标是简单介绍如何在CentOS 7上使用RPM包安装MySQL 5.7,然后描述如何调整存储路径datadir。 环境准备 操作系统 —— CentOS 7MySQL版本 —— MySQL 5.7.44 获取MySQL-rpm包 官网下载地址:https://dev.mysql.com/downloads/mysql/5.7.htm…

如何安装Wnmp并结合内网穿透实现外网访问内网Wnmp服务

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包,安装完成后即可得到一个Nginx MyS…

VSIX:C#项目 重命名所有标识符(Visual Studio扩展开发)

出于某种目的(合法的,真的合法的,合同上明确指出可以这样做),我准备了一个重命名所有标识符的VS扩展,用来把一个C#库改头换面,在简单的测试项目上工作很满意,所有标识符都被准确替换…

浅述边缘计算场景下的云边端协同融合架构的应用场景示例

云计算正在向一种更加全局化的分布式节点组合形态进阶,而边缘计算是云计算能力向边缘侧分布式拓展的新触角。随着城市建设进程加快,海量设备产生的数据,若上传到云端进行处理,会对云端造成巨大压力。如果利用边缘计算来让云端的能…

第九周实验记录

1、安装Nerfstudio 环境配置 首先需要创建环境python3.8,接着需要安装cuda11.7或11.3 这里安装cuda11.7 pip uninstall torch torchvision functorchpip install torch1.13.1 torchvision functorch --extra-index-url https://download.pytorch.org/whl/cu117安…

Hive从入门到大牛【Hive 学习笔记】

文章目录 什么是HiveHive的数据存储Hive的系统架构MetastoreHive VS Mysql数据库 VS 数据仓库 Hive安装部署Hive的使用方式命令行方式JDBC方式 Set命令的使用Hive的日志配置Hive中数据库的操作Hive中表的操作 Hive中的数据类型基本数据类型复合数据类型ArrayMapStructStruct和M…

简述PyQt5布局管理

PyQt5的布局管理方法主要包括以下几种: 水平布局(QHBoxLayout):可以将所添加的控件在水平方向上依次排列。垂直布局(QVBoxLayout):可以将所添加的空间在垂直方向上依次排列。网格布局&#xff…

web3 dapp React项目引入 antd 对 balance 用户token信息组件进行样式改造

好 上文 web3 React dapp中编写balance组件从redux取出并展示用户资产 我们简单处理了用户资产的展示 那么 我们继续 先启动 ganache 环境 终端输入 ganache -d然后 打开我们的项目 将合约发布到区块链上 truffle migrate --reset然后 我们启动项目 确认一切正常 还原到上文…

day2 ARM基础

.text .globl _start _start:mov r0,#0 mov r1,#0 addfunc:add r0,r0,#1 r0自增1adds r1,r1,r0 R1实现1~100累加cmp r0,#100 判断r0是否到100bleq loop r0等于100 进入死循环 blne addfunc r0等于100跳转至循环累加 loop:b loopstop:b stop.end 【汇编…

淘宝婴儿用品购买情况分析报告

一.分析背景和目的 随着购物网站的发展,人们的网络购物行为占比也快速增加。为了能够获取更多的用户,提升商家的销售量,需要从产品和用户不同的角度进行分析,进而得到有价值的信息,指导商家进行获客和营销。本文就以淘…

NOIP2023模拟12联测33 D. 滈葕

NOIP2023模拟12联测33 D. 滈葕 文章目录 NOIP2023模拟12联测33 D. 滈葕题目大意思路code 题目大意 思路 放一段题解的材料 ABO 血型系统是血型系统的一种,把血液分为 A,B,AB,O 四种血型。血液由红细胞和血清等组成,红细胞表面 有凝集原,血清…

R语言环境下使用curl库做的爬虫代码示例

curl库是一个用于传输数据的工具和库,它支持多种协议,包括HTTP、FTP、SMTP等。在爬虫中,curl库可以用来获取网页内容,从而实现爬取网页的功能。通过设置curl的选项,可以实现对网页的请求、响应、重定向等操作。在使用c…

学习笔记三十三:准入控制

ResourceQuota准入控制器 ResourceQuota准入控制器限制cpu、内存、pod、deployment数量限制存储空间大小 LimitRanger准入控制器在limit名称空间创建pod,不指定资源,看看是否会被limitrange规则自动附加其资源限制创建pod,指定cpu请求是100m&…

django安装数据库

使用pip安装django pip3 install django注意我使用的是python3所以用pip3安装,如需安装指定版本 django ..* 检测是否安装成功,不报错,则安装成功 # python3 # import django下边这是报错的 django迁移数据库 再mysql中简历数据库 CREATE DATABA…

【系统集成项目管理工程师】——3.管理

主要掌握输入,输出内容先看他的过程域本身,过程域是什么输出就是什么 上一个过程域的输出是下一个过程域的输入 十大管理1432都有计划过程组,通常规划为首,控制为尾 规划阶段的万能输出是各子计划,即项目管理计划的…

加法运算、 || 、 赋值运算

一、加法运算 在这里插入图片描述 二、&& || 三、赋值运算 四、js类型就八种: 五、css权重、 六:布局,尽量使用块盒。 七、小数精度存储的问题:存的不精确,算的肯定也是有问题的。 八、找单身狗算法题…

20.7 OpenSSL 套接字SSL加密传输

OpenSSL 中的 SSL 加密是通过 SSL/TLS 协议来实现的。SSL/TLS 是一种安全通信协议,可以保障通信双方之间的通信安全性和数据完整性。在 SSL/TLS 协议中,加密算法是其中最核心的组成部分之一,SSL可以使用各类加密算法进行密钥协商,…
最新文章