作者:微软亚洲研究院

来源:微软研究院AI头条(ID: MSRAsia)

计算机科学家们一直对游戏 AI 乐此不疲,原因并非为了精进棋艺,而是希望在此过程中不断提升人工智能的算法和处理复杂问题的能力。实际上,游戏 AI 的历史几乎和人工智能的历史一样长,很多关于人工智能的研究,都起源于研究如何构建能够完成游戏的智能体(agent)。游戏 AI 的进化,始终与 AI 研究进展相生相伴。
人工智能研究之所以会选择棋牌类游戏作为实验对象,如双陆棋、国际跳棋、国际象棋、扑克、围棋等,主要因为它们往往具有以下特点:
1) 均有一个简单而清晰的规则,有清晰的胜负判定条件和行动准则;
2) 在公众认知中,掌握和精通这些棋牌类游戏往往在一定程度上是人类智力的彰显。

1956 年,国际跳棋就开始

使用强化学习算法

其实早在 Alan Turing 勾勒出人工智能的轮廓之前,计算机科学家们就已经开始在游戏上测试他们编写的『智能』程序了。
1928 年,John Vonn Neuman 发表了 Minimax(极小化极大)算法,而在 1949 年,Claude Shannon 将该算法重新组织,并用于解决国际象棋问题。1956 年,达特茅斯会议召开, 人工智能被确立为一个学科。同年,Arthur Samuel 发明了一种能够通过自我学习攻克国际跳棋(Checkers)游戏的算法,现在该算法被称为强化学习(Reinforcement Learning)。
博弈树(Game Tree)是用一棵树来表达一个赛局中各种后续可能性,一棵完整的博弈树会有一个起始节点,代表赛局中某一个情形;下一层的子节点是上层父节点赛局下一步的各种可能性,依照这种规则扩展,直到赛局结束为止。博弈树中的叶子节点代表了各种游戏结束的可能情形。
极小化极大算法(Minimax)是由 Claude Shannon 定义的用于解决国际象棋的算法,该算法最早在 1927 年被 John Vonn Neuman 发明。该算法可被概括为:对于两个玩家的对抗游戏,其中任何一个玩家的决策会依赖于另外一个玩家之前的决策,且另外一个玩家总是竭尽所能地想要获得胜利。因此,一方会在所有选项中选择令其自身优势最大的一个,而另一方则会选择令对手优势最小的一个。通过穷举不同玩家之间的策略,该算法可以构建一棵搜索树,并通过穷举不同的可能,选择其中能得到最佳结果的路径。实践中,由于不同的游戏可能涉及的状态空间复杂度不同,该算法的计算复杂度会呈指数级增长,因此往往需要引入剪枝策略来简化搜索的复杂度,例如,使用用于预估局面(结果)的预估函数(Evaluation Function)。
Alpha-Beta 剪枝是一种用于减少在极小化极大算法中所需评估的节点数的搜索剪枝算法。该算法在搜索过程中始终维持着两个值,alpha 和 beta,其中 alpha 用来描述搜索到的最好值,任何比它小的值的节点则不需要继续搜索,beta 用来描述对于对手来说最坏的值,其中任何一个选择如果比 beta 值大,则意味着对手不会选择走到目前这个局面,因此也可以停止搜索。图1:一个简单的 Minimax 搜索树(左);带有 Alpha-Beta 剪枝策略的 Minimax 搜索树(右)(来自于http://gameaibook.org/book.pdf)

1992 年,双陆棋的突破成为里程碑
双陆棋(Backgammon)智能程序的突破,被认为是人工智能研究史上的一个里程碑式的事件。在 1970 年左右,一名德国棋手 Hans Berliner 编写了双陆棋智能程序BKG 9.8。

图2:双陆棋(左);TD-Gammon 的模型结构(右)

到了 1992 年,Gerald Tesauro 编写了 TD-Gammon,该程序采用了人工神经网络作为模型,并采用了 TD-lambda 算法进行训练。通过大量的自我博弈,TD-Gammon 达到了顶级人类的水平,而且正是这种没有人类玩家参与的训练方式,使得 TD-Gammon 的下棋方式不同于人类玩家。TD-Gammon 的意义不仅在于采用了强化学习进行训练,更是证明了不需要任何的特征工程,单纯使用棋子的位置作为神经网络的输入亦可训练出达到顶级人类玩家水平的智能体。
双陆棋输赢小插曲
开始时,双陆棋智能程序 BKG 9.8 跟初学者下棋也经常输。但后来 Berliner 使用了模糊逻辑的原理,使程序不断改进,最终在 1979 年 7 月以 7:1 击败了当时的双陆棋世界冠军——意大利棋手 Luigi Villa。不过 Berliner 也指出,这多半是运气的原因,掷得的骰点对计算机比较有利。

20 世纪 90 年代,国际跳棋、国际象棋 AI 纷纷超越人类
随着计算机算力的大幅提升和人工智能算法的逐渐成熟,在 Arthur Samuel 编写第一个用于解决国际跳棋的算法的 38 年之后,艾尔伯特大学的 Jonathan Schaeffer 教授于 1994 年带领团队编写了 Chinook,该程序核心依然采用了搜索树算法,为了减少搜索树的计算复杂度,以及提高预估函数的准确性,它建立了一个包含国际跳棋大师的开局方法和残局局面胜负情况的数据库,并采用了一个基于手工特征的 Alpha-Beta 树搜索算法。
1994 年,在 Chinook 与世界冠军 Marion Tinsley 进行的国际跳棋决赛中,Marion Tinsley 由于身体不适,在与 Chinook 连续打平 6 次之后放弃了比赛,因此 Chinook 成为了第一个在与人类玩家对抗中获得国际跳棋世界冠军的智能程序。Jonathon Schaeffer 教授于 2007 年发表了文章,证明国际跳棋问题已经被人工智能解决。

图3:Marion Tinsley 与 Chinook 对战(左);Garry Kasparov 与 Deep Blue 对战(右)

而另一边,国际象棋 AI 也被由许峰雄带领的深思(Deep Thought)团队所攻克。深思采用了特殊的硬件设计用于搜索加速,并在此基础上引入了单步延伸(singular extensions)算法,其核心思想是:如果在逐层进行策略搜索时,发现某一步的结果显著好于其他步,则会进一步加深这一步棋的搜索以确认其中没有陷阱。
之后深思团队被 IBM 公司聘用,并应用于 Big Blue 大型机(后改名为深蓝 Deep Blue),于 1997 年以 3.5:2.5 击败国际象棋世界冠军 Garry Kasparov。在与 Kasparov 的比赛中,深蓝受益于专门设计的大型机的强大运算能力,能够每秒钟运算 2 亿步棋,且可搜索及估计随后的 12 步棋(在单步延伸的情况下可搜索 40 步棋)。最终,深蓝计算机成为首个在标准比赛时限内击败国际象棋人类世界冠军的计算机系统。

围棋 AI 完成进化,初步实现历史使命

相比较而言,围棋的状态远复杂于上述棋类游戏(每一步棋可选范围为 19*19 种),而且下棋的策略十分依赖于对于牌局的评估,因此围棋一直被认为是比国际象棋等更难的棋类游戏。

1968 年,Albert Zobrist 编写了第一个围棋程序,该程序仅能打败初级玩家。1993 年,Bernd Brügmann 编写了 Monte Carlo Go 程序,使用了蒙特卡洛算法替代预估函数,该程序不再根据任务精心设计对于结果的预估函数,而是用多次采样(rollout)——自我博弈到终局结束——的平均值替代预估结果。该算法也被认为是 AlphaGo 成功的核心算法。

2006 年,法国国家信息与自动化研究所(INRIA)研究员 Sylvain Gelly 在 Monte Carlo Go 的基础上引入了 UCT 算法,创造了 MoGo 程序,该程序于 2008 年在被让 7 子的情况下打败了职业 8 段选手 Kim Myung Wan。MoGo 的成功充分地证明了 MCTS(UCT) 算法在解决围棋问题上的重要性。

2015 年,DeepMind 团队在上述程序的基础上开发了基于深度强化学习的程序 AlphaGo,并成功击败了欧洲围棋冠军樊麾,成为第一个无需让子即可在 19 路棋盘上击败围棋职业棋手的计算机围棋程序。

蒙特卡洛树搜索(MCTS)是由 Rémi Coulom 于 2006 年发明的将蒙特卡洛算法应用于博弈树搜索上的算法。该算法的核心思想是用模拟环境跑出来的结果替换根据预估函数估计出来的结果。同年,L. Kocsis 和 C. Szepesvari 发明了 UCT 算法,该算法在蒙特卡洛搜索上结合了 UCB,为搜索策略提供了一个平衡探索(exploration)和利用(exploitation)的方式。目前所实现的 MCTS 一般采用了 UCT 的实现方式。

CFR(Counterfactual Regret Minimization)是由 Martin Zinkevich 于 2007 年提出的算法,该算法从随机策略开始,通过最小化遗憾值的方法,在游戏结束后,寻找事后最优的选择,从而寻找最优的博弈策略和纳什均衡。该算法需要遍历游戏所有的可能状态,因此也需要采用剪枝、估值网络、状态压缩等方法减少计算量。

不完美信息游戏 AI 复杂度更高,

开始登上历史舞台

相对于上述棋类而言,扑克、桥牌、麻将等牌类游戏则被认为是另一类游戏,在这些游戏中的玩家往往信息是不对称的,这类游戏被称为不完美信息游戏(imperfect information game)。

由于信息不对称,在德州扑克这样的游戏中,玩家可以通过诈唬(Bluff)来误导对手,通常人们认为顶级人类玩家早已熟练掌握了这门技术(艺术)。阿尔伯特大学的研究人员一直在推动德州扑克 AI 的发展,继 1984 年职业扑克玩家 Mike Caro 编写了 Orac 程序之后,阿尔伯特大学的研究人员 Jonathon Schaeffer 于 1997 年编写了 Loki 用于模拟德州扑克玩家的诈唬行为,2001 年,该程序更名为 PsOpti,并引入了基于博弈论的方法,并在 2015 年发布了 Cepheus,该程序在之前的基础上引入了 CFR+ 算法解决了两人有限注德州扑克,证明了计算机在有限注的情况下可以完胜人类。2017年,卡耐基梅隆大学和阿尔伯特大学相继发布了 Libratus 和 DeepStack,在两人无限注德州扑克上成功击败了世界顶级人类玩家。2019 年,卡耐基梅隆大学又联合 Facebook AI 发布了 Libratus 的后继版本 Pluribus,成功在六人不限注扑克上打败了职业扑克玩家。

另一方面,这种不完美信息状态使得游戏策略的复杂度变得更高,进而使得基于树搜索和 CFR 算法的系统计算复杂度更大。桥牌由于其相对繁复的游戏规则(包含叫牌阶段和打牌阶段),也逐渐成为人工智能跃跃欲试的对象。从上世纪 80 年代开始,曾在美国海军科伦比亚地区实验室任职的 Tom Throop 就开始编写 Bridge Baron 程序,经过十几年的更新,于 1997 年赢得了第一届世界计算机桥牌大赛。第二年,该比赛的冠军则被由俄勒冈大学 Matthew Ginsberg 开发的 GIB 程序获得。同年,该程序被邀请参加了世界桥牌大赛,最终在 35 位参赛者中获得了第 12 名的成绩。在之后的十多年里,基于蒙特卡洛方法的 Jack 和 Wbridge5 轮番取得了该比赛的冠军。对麻将而言,东京大学的 Naoki Mizukami 于2015年开发了名为爆打的 AI 程序,日本 Dwango 公司也于 2018 年开发了基于深度学习模型的 NAGA025。只不过整体而言,这些人工智能程序依然与顶级人类选手有一些差距。

相比象棋、围棋这样「信息完美」的棋类游戏,和德州扑克这样「信息不完美」的牌类游戏,桥牌、麻将更具挑战,因为它们不仅「信息不完美」,而且拥有更多隐藏空间。这样的性质,使它们更接近人类真实生活中的决策过程。此类游戏 AI 的突破,可能会是下一个游戏 AI 研究的里程碑。

图4:游戏 AI 发展历史
参考资料:

[1]http://www.bridgeguys.com/CGlossary/Computer/CBProgrammers.pdf

[2]http://gameaibook.org/book.pdf

[3]http://www.andreykurenkov.com/writing/ai/a-brief-history-of-game-ai/

- 加入社群吧 -

游戏AI的缘起与进化相关推荐

  1. 为什么说麻将比围棋难?游戏AI复杂度怎么算

    通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习. 在游戏AI的缘起与进化一文中我们讲到,游戏 AI 的进化始终与 AI 研究相生相伴,这是由于游戏种类丰富 ...

  2. 触手可及的人工智能,大师级游戏AI正在进化

    目前是人工智能技术发展最为蓬勃的时代,各行各业无数人都想给自己添上"AI加持"的标签.但说起当下人工智能真正肉眼可见的应用,很多时候又会进入到某些非常专业领域的圈子里. 不过,我们 ...

  3. 为什么要研究游戏 AI 呢?

    作者 | 叶鑫 来源 | Datawhale AI作为时下计算机算法的超级巨星,在例如CV.NLP.语音.机器人等诸多领域都有广泛的应用.而在游戏领域,AI的应用往往被认为只是把游戏角色拟人化,算法的 ...

  4. 游戏+AI,你不曾想象的未来

    AI,Artificial Intelligence,人工智能. 这词或许过去陌生,但现在几乎妇孺皆知.不管你是不是真的能拼对这个单词,是不是真的能理解其中的含义,都不重要. AlphaGo打败围棋世 ...

  5. Java版战棋(SLG)游戏AI及寻径处理入门

    代码下载地址:http://download.csdn.net/source/1047937 SLG或者说战棋游戏,在大多数英文站点是归类到Simulation Game的(包括模拟城市之类的纯SIM ...

  6. 游戏AI行为选择算法一览

    前言 AI研究的目的是为机械赋予智慧,而游戏一直被认为是需要智慧才能完成的事情,因而游戏自然成为了AI自证能力的最佳途径之一.从棋盘游戏到视频游戏,从最早的Deep Blue到近几年大热的Alpha ...

  7. 王者荣耀AI“绝悟”又进化了!会全英雄又懂田忌赛马

    点击上方"机器学习与生成对抗网络",关注"星标" 获取有趣.好玩的前沿干货! 文章来源:腾讯公众号  编辑:图灵的猫 还记得围棋AI"绝艺" ...

  8. 游戏AI:只是AI间的游戏,还是游戏的未来?

    前言背景 1. 雅达利的崛起与沉沦 1974年,一个名叫史蒂夫·乔布斯的年轻人来到了雅达利(Atari)公司位于洛思加图斯的总部,拿着一块他朋友沃兹尼亚克做的电路板,手舞足蹈的比划,试图让对方相信这个 ...

  9. 游戏开发——游戏AI的简述

    一.游戏AI 游戏AI(Game AI),是指在游戏中,由已经写定好的程序控制的"类人化玩家",俗称电脑玩家.一般的游戏AI能够拥有对真实玩家的一系列操作感知的能力并对此作出交互行 ...

最新文章

  1. python商业爬虫_商业爬虫学习笔记day1
  2. ​Arm芯片的新革命在缓缓上演
  3. Spring 源码分析(四) ——MVC(一)Web 基础
  4. H3C 2126 限速后的问题
  5. 51单片机——My-Clock项目
  6. Nacos-认识和安装Nacos
  7. JS实现图片循环滚动
  8. 捡起JavaScript(1)
  9. mysql web界面 Linux_部署WEB项目到服务器(三)安装mysql5或者mysql8到linux服务器(Ubuntu)详解...
  10. 文件流——Excel文件数据读写
  11. python支持向量机回归_支持向量机——核函数与支持向量回归(附Python代码)
  12. C# 递归函数详细介绍及使用方法
  13. 阿里P7程序员、资深架构师,竟不知jvm、红黑树!这都能进大厂?
  14. 使用ConfigurationManager来写自己的配置文件
  15. oracle和mysql的mod函数
  16. 程序员必备的思维能力:抽象思维
  17. 给定三角形三边,如何判断该三角形的形状
  18. 正确使用uniapp搭配微信开发者工具自带的骨架屏功能,生成骨架屏
  19. 机器学习笔记--PR曲线和ROC曲线
  20. 腾讯实习生面试2016两道面试题目?(知乎)

热门文章

  1. Polyworks脚本开发学习笔记(二)-TREEVIEW基本操作
  2. Flowable UI制作流程图
  3. 2020 图片:我们人类这一年
  4. WireShark无法找到网卡
  5. 类与对象(中) 构造函数和析构函数
  6. OpenCV系列之用于角点检测的FAST算法 | 四十一
  7. Devops统一研发体系建设方案.ppt
  8. mysql 百度地图 省市_百度地图自定义选取区域(一)
  9. C语言学习打卡day1——身高单位换算
  10. 并发编程系列之五多线程synchronized是可重复加锁,重入锁