添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

人机博弈,顾名思义,就是运用博弈论的知识,赋予计算机与人博弈的能力。

人机同台竞技,开头能想到算法自然是很多的。简单的有贪心算法,即数学建模一个评估游戏局面的函数,让计算机每一次做决策时,简单粗暴地选择当前最优的可行步骤。显而易见,对于五子棋、国际象棋等这类相对复杂的游戏,仅仅 贪心算法 是有心无力的,因为当前最优不代表全局最优,也就是说只考虑当前局面是有局限性的,简单的实例是在下中国象棋的时候,你的车前方有个落单的马,你迫不及待地把它逐出棋盘,却素不知,车离开了原有的某个战略性十分重要的地盘,发生了一连贯的蝴蝶效应,直接宣败了。因此,加深计算机的思考能力,由此有了各种相对复杂的算法,如 极大极小搜索算法、蒙特卡洛搜索算法 等等。在这一层面上,人类专家们不懈努力,穷尽一切棋类经验,终于完成了“深蓝”程序,配以强大的算力,一举打败当年国际象棋世界冠军卡斯特罗。然而随着 深度学习 热潮地重现, 强化学习的 拾起, 机器学习算法进一步 武装了AlphaGo \ AlphaGo Zero \ Alpha Zero,一下子打垮了先前的一切棋类程序,更在人类棋类上最后的“尊严” —— 围棋中,不费吹灰之力地扫掉了李世石、柯洁等世界大师,由此人机博弈的研究迈开了新的篇章。

据笔者浅薄的见解,主流的人机博弈程序主要可以划分为两个大的部分,亦即“ 搜索 ” + “ 评估 ”,前者可以理解为是活的灵魂、最根本的方法路线,后者则是外在的武器装备、盔甲。本文主要论述搜索环节,旨在为有心人通俗地介绍最基本的算法与相应的优化策略,提供一个人机博弈最底层、最简易、最实在、最根本的路线指南。搜索方面的算法知识多与具体棋类无关,而评估则是与棋类知识密切相关。可以先有个印象:计算机下棋效率看“搜索”写的好不好,棋力看评估写的好不好。

现在,让我们以一个易于入门的小项目贯穿全文,一个五子棋对战的程序。

何谓搜索?直白的解释就是不断地尝试。就像走迷宫一样,走到一个分岔口,又不知道哪儿通向终点,只好都试试,不行就回头。

那在人机博弈中,搜索又是何种意思呢?设想一下,你是怎么下五子棋的?

一个高手可能会说,我先看看场上有哪些点我是能下的,使之组成一个集合 { ICanGo }, 然后从中挑一个感觉不错的位置 ,假装下了此处,进而就化身为对手,揣测对手又会怎么下,如此反复,直到我推演到一个很后面的局面,实在推演不下去了,就给最终的局面评估一下,打个分数什么的。

最后我又回到当下,继续在{ ICanGo }里一个个这样去假设,去化身对手,去反复,去打分。

就那么短短几秒,我脑海里已经和假想敌下了好几十盘甚至上百盘了,终于找到当下所谓分数最高、最优的位置,下了这个点。

博弈论与极大极小搜索

后来就有学者把这个过程数学建模了,称为“博弈”,成立了一个叫“博弈论”的学科。让我们回顾刚才高手的博弈思路,你会发现这是一颗树状的思维导图,自顶向下分层的,最上面这层是 { ICanGo } ,对于集合中每一个点,如果我假设下了这个位置的话,就该到我们化身对手去揣测他的会怎么下了,“他”此时会有一个 { HeCanGo },“他”又从中取了一个位置,于是变回了我们下棋,如此反复。树状图中,最上面的点衍生了一大批点,这批点中每一个点又能单独衍生出新的点,无穷无尽,直到游戏终局。仔细一瞧,这其中自顶而下的每一条路径就是一个完整的对局!这棵树,我们称为,“ 搜索树

如果你使用排列组合知识,你就会发现这棵树由于规模过大、计算机算力有限是不能在所限时间内搜索、穷尽完的。于是我们就只能搜索到一定深度,然后对搜索到的最底层相对应的棋盘局面调用“评价”来打分。当然搜索自然有充满智慧的办法,绝不是盲目去搜索,有一些所谓根本想都不想就下的棋或者不下的棋就能减少搜索的步数,甚至整棵树的层数,这个思路就叫 “剪枝” 。[ 这就是人机博弈的基本思路,“搜索”+“评价”,深蓝很强是因为搜索方面做了很多剪枝,使得它能尽量地搜索更深更多的有效步骤;AlphaZero更强,是因为不仅搜索系统很科学,“评价”方面调用了机器学习,学到了很多人都不会的独门招式 ]

回到我们博弈论的数学建模过程,完善一个命题:有些博弈问题被称为“零和”的。意思是这类游戏只有一个胜利者,不是我输就是你输,没有共赢,当前局面,我是占优的,我的分数假设是500,那么你的分数就必然是-500。然后我们讨论的是最基础的博弈问题,即信息公开,像象棋、五子棋、跳棋什么的,而不是斗地主、德州扑克、麻将啥的。最后,我们还会发现一个问题,就是如何揣测对手的下法?比较著名的就是极大极小值搜索方法了,根本思路是“ 抱最坏的期望,做最好的打算 ”,假定对手像我们一样,也是走他认为最优的步骤,把他当作是和我们一样聪明的人,使用着类似的评估策略(他也会做假设,也会化身为我做对局推演)

极大极小值搜索 一定能用到一个叫 AlphaBeta的剪枝 ,碍于技术细节,这里难以展开,从图中可以领悟大意。

棋类对战中,一个显著特征是,我不关心我们怎么下到这个局面的,我只关心这个局面于我的优劣。于是对局历史是无关紧要的,回想我们在极大极小搜索中,在对局推演的过程中,难免是会推演到同一个局面的,如果这个局面我之前得到了从下面传上来的分数了,那我就直接用好了,直接剪枝,这个想法被称为“ 置换表 ”。那如何表征一个棋盘和另一个历史棋盘是一样的呢,难道我们调用循环语句一个个棋盘位作比较吗,这样自然是效率极慢的,一个方法是 Zobrist Hashing ,一种哈希算法,把一个棋盘通过函数变换成一个唯一确定的整数,这样整数等不等于整数就是效率非常快的了。你可能会说据排列组合只是,一个棋盘的可能的局面数以兆计,一个小小整数怎能唯一确定一个局面呢,事实上是可以的,想想这其中的信息冗余,我们现在下到第11步了,准备来个7层的搜索,这样棋盘的局面就只有下了12~18步的局面了,这就缩小了很大的范围,也就能用一个小整数来唯一表征一个局面了,感兴趣的可以去搜索相关技术细节。

回顾最初的推演过程,“找一个感兴趣的点”(也就是上面绿色字的部分),按理说我们每个可以下的点都会考虑的,当然你也可以根据棋类具体的知识来排除一些绝对不会下的点,要小心,你的知识引入,或许能某个意义上增强计算机棋力或效率,但是也可能降低了计算机的实力的天花板,你又怎么确定你的知识是真理呢?看看AlphaGo,多少人类没想过的新想法。好了,既然排除点是可能造成不利影响的,那么我们调整选点顺序是肯定不会造成不利影响的,因为我们最终都考虑全部可能的点啊。但是这却可能带来效率的飞跃,也就是帮助前文的AlphaBeta剪枝,亦即这个剪枝是与选点顺序有密切联系的。这个想法被称为“ 启发式搜索 ” 我们引入了一点点知识,帮助计算机“更好”、更快地搜索。

事实上你会发现,当你真的实现上述的介绍的算法以及一系列优化后,你会遭遇一些微妙的问题。似乎计算机在玩弄对手,有时明明可以更快胜利,却翩翩走些无关紧要的地方,推迟胜利的到来,似乎在享受戏谑对手的感觉。这个问题是极大极小搜索造成的,我们每一层要么找极大,要么找极小,却忽视了如果等大的可能。也就是说两条路线都通往胜利,计算机选择哪个?都通往失败,计算机又选择哪个?一个解决方法是“ 迭代加深 ” 我们先进行3层的极大极小搜索,再来个5层的,再来个7层的,以此类推。这样如果浅层搜索就发现必胜了,那么我就没必要再进行深层搜索了。听上去似乎是增加了运算时间,降低了计算机的效率,可是设想一下,3层所需的时间和5层所需的时间是一个量级的吗?这点增加的时间无关痛痒啊。 另一方面,反而前面浅层搜索得到的结果幸许能为我上文的“启发式搜索”做一定的决策服务,给我选点顺序有个帮助呢。最重要的,你难以知道所限时间内计算机可以进行最多多少层的搜索,因为这会随着棋局进行的时间发生变化,越下到后面,棋盘越来越小,我可能都可以进行个十几层搜索直接穷尽完全部可能性呢!如果要超时了,我就不搜索下去了,取当前最优的,来下。

后来计算机学者们还找到了一系列更多的剪枝方法,比如 主变量导向搜索PVS、空着裁剪 (就是我这一步故意不下,看你会怎么下)

上述的算法及一系列剪枝的实现是容易的,事实上,作者我开头是困恼于“评估”环节的编写,着实令人头疼!

评估,对当前棋盘局面的形势量化成一个可比较的指标,这是艰辛的。好的评估,就有好的棋力,也可能连带着好的效率。个人把评估视为一种数学建模的过程,对于五子棋,则是什么“活三”“活四”各种奇怪的堆砌。
我个人是讨厌这种与棋类知识有关的东西,因为我本身就不精通下棋,又怎可指望我写出一个强大的评估函数呢?

一个与棋类知识无关的评估函数的思路是“ 快速走子网络 ”,就是对于一个待评估的局面,我们假设对弈的双方都乱下,然后增加这种试验的基数,如果局面是优的,那么肯定我们最后统计胜利率会更大,据此来估计评价这个局面。

事实上,我最先着手写的时候,出于对AlphaZero的学习,我开头是转向使用 机器学习 来取代我来编写这个评估函数的。棋盘是15*15的尺寸,不妨把当前局面看成一副图片,我把它丢进一个 卷积神经网络 中跑出一个值,然后把这个局面对应的最终胜负做为标签来训练这个卷积神经网络,指望着我也能培育出一个能评估局面的网络。可惜就像大家戏称深度学习的程序员为“炼丹”一样,我是炼失败了,找了网上共享的什么世界五子棋锦标赛大师对弈棋谱作训练集,跑了几天,啥都没有。我后来又想到AlphaZero不仅给网络提供了当前局面,还告诉了网络这个局面是怎么下成这样的,也就是对弈历史,或许这就能帮助网络训练出来呢?设想一下,单单给你一个局面,怎么可能能分析出好坏啊,这得看是谁在和谁下呢。 可惜这个想法也失败告终。 最后我想到了可能是找的棋谱虽然以千计,但还是太少了,不具有代表性,就果断写了个强化学习,干脆让电脑和电脑自己下,自己总结经验,自己学习。结果也是没有任何成果,依旧啥都评估不了。总归是放弃了神经网络这想法,毕竟AlphaZero,纵观历史也就他们搞出来了。

人人对战,还是比较简单,只要能够做到精确计算坐标点,就可以实现。最重要的是 人机 对战的方面,需要用到比如最大值最小值的算法,还要用到 剪枝 +优化的算法,还是比较难。第一次接触算法的人可能就比较简单,所以我想发表一下感言:懂数学的人真的能走遍天下。...        爱好编程的大部分还是喜欢自己编写一个游戏,但较少是编写和电脑对战的游戏,因为里面毕竟涉及 博弈 搜索 等技术,我想来通编写一个 人机 博弈 的中国象棋游戏,希望从中收获些东西。参考书是王小春编著的一本《PC游戏编程- 人机 博弈 》。应该说里面很多思想都是来自这本书上的,虽然思想不是源自我自己,但是可以通过自己亲手从头到尾把这个游戏编写出来,主要体会里面 搜索 技术和估值核心。1. 人机 博弈 的要点 在讨论 人机 协同中的 人机 博弈 时,我们可以将其理解为人类和机器(或人工智能)在共同工作或互动过程中,如何处理彼此之间的竞争、合作和优化问题。1. 人机 协同的定义 人机 协同指的是人类和机器(或人工智能)在执行任务时的合作与协调。目标是利用人类的创造力和机器的计算能力来提升工作效率和质量。协同的形式可以包括辅助决策、增强能力、自动化任务等。2. 博弈 的定义 博弈 理论研究的是在有限资源和信息不完全的情况下,参与... 现代的 博弈论 快速与人工智能进行结合,形成了以数据驱动的 博弈论 新的框架。 博弈论 与计算机科学的交叉领域非常多,有以下几个方面:理论计算机科学:算法 博弈论 人工智能:多智能体系统、AI游戏、 人机 交互、机器学习、广告推荐等。互联网:互联网经济、共享经济。分布式系统:区块链。 人工智能与 博弈论 结合,形成了两个主要研究方向:1. 博弈 策略的求解;2. 博弈 规则的设计。 博弈论 提供了许多问题的数学模型。纳... 算法复习第一天:论序一、先了解几个人① 号目标人物② 号目标人物二、数据结构的兴起和发展1.客观世界与计算机世界的关系2.程序设计的实质是什么3.数据结构是随着程序设计的发展而发展的三.研究对象与基本概念1.例子一:学籍管理问题(表结构)2.例子二: 人机 对弈问题(树结构)教学计划编排问题(图结构)总结 一、先了解几个人 ① 号目标人物 尼古拉斯·沃斯(Niklaus Wirth)1934年2月15日—瑞士计算机科学家 著名的一条言论:算法+数据结构 = 程序设计 Pascal之父、结构化程序设计的先驱 这本书分为三个部分:数据的基本概念、基本的数据结构、基本的数据处理技术 数据的基本概念就是第一章的主论 基本的数据结构分为线性结构和非线性结构(线性结构有线性表、栈和数列、串、数组和广义表;非线性结构分为树和图) 基本的数据处理技术包括查找技术和排序技术 数据结构的基本内容 通常,用计算机解决一个问题的步骤:具体问题抽象为数学模型、设计算法、编程、调试、运行 具体问题抽象为数学模型的实质是分析问题... 一、前言 人机 博弈 是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化 极大 算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出。 Alpha - beta 剪枝 的本质就是一种基于极小化 极大 算法的改进方法。Knuth等人在1975年优化了算法,提出了负 极大 值(negamax)概念,这一概念的原理本质上与极小化 极大 值算法并无不同,但是却不需要系统区分取 极大 值者和 极小值 者,使得算法更加统一。 2.1项目要求 五子棋 是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。具体要求如下: 功能需求: 1、实现人与人对决。 2、实现人与机器对决,对局双方各执一色棋子,要求其中一方为机器。 3、游戏开始要求为空棋盘。 4、黑先、白后,交替下子,每 转自 ∑ 沈浩老师最近看到一篇不错的文章,让沈雨尘帮助整理一下,与同学们分享!概览什么是 博弈论 ?它是如何应用到人工智能(AI)中的?人工智能中的 博弈论 是一个迷人的概念,每...