游戏编程中的人工智能技术:前言、目录、序言等

 


前 言(Forward)

欢迎来到《游戏编程人工智能技术》。我想你就会发现,这正是你所读到的有关游戏编程的最有用的书之一。

Mat最先引起我的注意是在大概2000年的时候,那时,他开始在GameDev论坛 (www.gamedev.net)发布各类关于游戏人工智能的帖子,并回答网友的各种相关问题。他很快就获得了大家的关注,在跟贴中也不乏赞扬与认同,尤其是在贴出他为公众消遣而制作的有关神经网络和遗传算法的两个教程之后。Mat发现游戏开发者需要获得AI技术方面的知识以期运用在游戏制作中,而他的两个教程以及在Gamedev论坛里提问的耐心答复无疑是满足这一需要的一个途径。我对能为这样一个专题的书写前言而感到荣幸,希望以后能有更多的此类专著。

本书内容(Content of This Book)

这本书基本上是为提高游戏制作水平而写的。主要通过使计算机对手更聪明,更有能力,和更接近真人来达到这个目的。这个新的知识领域只是在过去10年左右的时间里才开始引起真正的关注。

本书出版的同时,游戏开发者可以发现当今的游戏产业正不断扩展,吸引着更多新的玩家,并以史无前例的速度蓬勃发展。随着新的游戏机和PC平台不断拥入市场,游戏开发者会发现自己拥有极为充裕的物质条件:更大的记忆空间,更快的CPU速度,更多的连接选项,和更高的视频分辨率。这些新的功能为游戏开发者提供了无限的可能,但同时也让他们面对无数的取舍和重点选择。新的游戏应该是在视频分辨率上更高一些呢,还是应该使碰撞更具有真实感些?在游戏速度方面,我们在制作一年半以后要上市的游戏时,能够在那时的主流机上做何种程度的开发呢?如何使我们的游戏区别于市场上那些竞争对手的产品?

采用大量的游戏人工智能(AI)显然是使你的游戏鹤立鸡群的重要手段之一,有关游戏AI专题的书和文章的源源出版能充分说明这一点。高质量的游戏AI已经不再是为提高出帧率(framerate)才予以考虑的东西,它现在已是和图形(graphics)或声音(sound)一样,成为游戏设计过程的极为重要的一个部分,它是促进还是阻碍游戏产品畅销的一个决定性因素。游戏开发者正竭尽所能研究新的AI技术,以籍此构筑更好、更聪明的游戏AI。他们想要探索新的理念,使AI技术进入下一代,到那时,AI不仅是要创造有趣的游戏对手,而且还要使这个对手能够与玩家交谈(talk),能和众多的在线冒险家周旋(interact with),能在一个一个的游戏中不断学习,使它在下一轮的游戏中变得更加聪明机智。

  自然,这些新的AI也得帮助游戏产品更好地销售。这永远是一根底线。如果一个游戏产品不销售出去,则无论它的AI有多么高超也都无关紧要了。

制作更好的游戏(MakingSmarter Games)

本书着重探讨一个比较“新奇”的技术领域(无论如何,对于游戏行业来说如此):遗传算法和神经网络及其在游戏制作中的运用。这个领域以前一直很难使游戏开发者感兴趣,主要是有以下几个原因。大多数游戏开发者都认为他们现有的技术已经很完善且容易调试。标准的有限状态机(finite state machine,FSM)和模糊状态机(fuzzy state machine,FuSM)已经出色地提供了稳固而易于调试的AI技术,一些备受欢迎的游戏,诸如帝国时代(Age of Empires)到Quake都采用这种技术的。的确,该些技术是切实可用,而且如果有足够的编程时间,该技术可以适用于几乎所有的场合。

但是这些技术也常常面临着过多的选择,而这就是游戏开发者开始采用减少返回法则(Law of Diminishing Returns)的地方。通过构筑FSM来处理一些新游戏所固有的无数的可能性会使开发者心思混乱,AI必须估算的选项数量多得使他们无法抵挡。对于一个游玩人来说,可能只有二、三种“明显”更好的选择,但对一个需要在星期六晚上为即将发送到出版商那里的游戏最终版编写AI程序的开发者,会这么认为吗?如果玩家看到,在一个将使游戏完全死机(hang)的关键抉择面前,AI作出了错误的选择,或者更糟的是,做了一个愚蠢的选择,且这样的情况发生了几次,那么,完蛋了玩家就会把你的CD从驱动里退出并转向去玩别的游戏了。

与此相反,我们应该让玩家面对的电脑对手不存在盲点(blind spot),在一游戏中不存在那种会被玩家发现、并一旦运用就会引起AI脑死(AI brain-dead)的某种特殊状态组合。并要求玩家面对的AI能够不断适应玩家的风格,能随着玩家对游戏学习的深入,一起变得更加精明能干。

这种适应性,或者学习本领,对游戏开发者及游戏玩家来说就犹如一个圣杯(HolyGrail),无论何时,当问及玩家未来最希望看到的游戏时,回答的都会是这个。玩家希望接受能够适应他们的游玩风格的AI的挑战,而AI也能预料到玩家最有可能做些什么并相应地采取一些策略步骤,AI所做的就如同另一个人所做的那样。

进入未来(To theFuture)

现在让我们转来谈谈如本书所包含的一些更有兴趣的AI技术。这些技术给通常是枯燥的、逻辑性较强的AI领域,带来了许多生物学的思考方法,为开发者提供用以创造能和玩家一样思维的电脑对手的工具。使用这些技术,一个开发者可以构筑一个足够聪明的AI,它将能尝试不同的事物来考虑哪个效果更好,而不是只简单的从程序员编制的菜单里挑选出某个选项。它将会分析敌对部队的相对实力和位置,找出一个最近的突击点,并且不时地重新调配自己的部队来夺取胜利。

这些技术所带来的好处不仅仅是玩家能够玩得更畅快。如果构造合理,一个有学习功能的AI可以对程序员所花的游戏开发和测试时间产生确实的效果,因为程序员将不再必须构筑和测试几十甚至上百的脆弱而死板的AI逻辑。如果AI可以在只给予几个基本指导之后就通过观察职业人类玩家来学习怎样玩游戏,这个AI就不但会更牢靠,而且无疑能把游戏玩得更好。这就是阅读关于篮球的知识和实际亲手玩篮球的效果区别。

是不是这样就意味着Mat已经完成所有高难的工作,而你所需要做的就只是复制和粘贴他的编码到你最新的项目里去构筑一个能象真人一样的AI玩家呢?当然不是。这里所呈献的,是为那些完全不了解这些更边缘的AI技术和正在为新项目寻找灵感的人提供一个指导,一个筐架,和一条基线。可能,你没有时间去亲自研究这些可能性,又或者你想摆脱那些课本或网站上提供的过于理论性的说明。那么这本书可以为你提供所需的知识。

接下来的章节将用一种简单易懂的方式探讨这些技术。采用Mat一贯使用的游戏开发者互相探讨问题的方式阐述问题。

有学习功能和高适应性的AI技术是一门新兴的技术,它可以使游戏制作更完善,更满足游戏玩家的要求,并且,更重要的是,能更好的促进游戏发行量。

Steven Wookcock

    [email protected]


 

 

致谢(Acknowledgments)

首先,我要感谢我的爱妻Sharon,在我写这本书的时候给予我极大的容忍、理解和鼓励。有无数次,当我从键盘前转过头去,眼神空洞地问她:“对不起,你刚才说什么来着?”时,她竟没有一次失去耐心对我扔盘子。

感谢Premier 出版社的Mitzi女士在本书写作的整个过程中给予我的帮助,回答我那些常常显得很荒唐的提问(虽然她认为约克夏男人讲话象Jamie Oliver!)。非常感谢Jenny, 我的编辑,对负责检查我的程序的bugs的Andre如此严厉,也感谢Heather帮我纠正了我的所有错误,并美国化了我的文章。

非常感谢Gary"Stayin' Alive" Simmons,他第一个建议我编写此书;还有我的网上教程的支持者们,他们的邮件每天都给予我很多鼓励;感谢Steve "Ferretman" Woodcock 为我写了前言;还有Ken,回答了我很多关于NEAT的疑问。

当然,我也不能忘了Fish和Scooter两个小宝贝,每当我坐下来写作时,它们就会跳到我的膝盖上来,向我亲热,使我感到温暖。

 

 

关于作者(Aboutthe Author)

Mat Buckland在伦敦大学学完计算机科学后,当过多年的风险管理咨询顾问。终于他开始厌倦了所有的金钱游戏和公司制度,就一把火烧掉了他原有的公司礼服,跑到一家为GremlinSoftware开发游戏的公司工作。虽然薪水少得多,但是却很有趣,而且他可以每天穿牛仔裤去上班了!现在Mat同时是一个自由程序员和人工智能咨询顾问。自从80年代初第一次接触到这些技术,他就对进化计算和AI尤感兴趣。他是ai-junkie.com网站(www.ai-junkie.com)的作者,该网站提供一些有关进化算法的教程和建议。


 

 

目 录 简 要

(Contents at a Glance)

 

前 言………………………………………………………………………………………… vi

丛书编辑者的来信…………………………………………………………………………xviii

引 言……………………………………………………………………………………………xx

第1部分 Windows编程 …………………………………………………………………… 1

第1章 Windows编程入门 ……………………………………………………………… 2

第2章 Windows编程进阶……………………………………………………….…… 30

第2部分遗传算法 ………………………………………………………………………… 75

第3章 遗传算法入门………………………………………..………………………..…76

第4章 置换码,TSP问题 ….………………………………………………….……. 100

第5章 改进遗传算法…………………………………………………………………… 123

第6章 登月工程 ……………………………………………………………………… 152

第3部分神经网络  ………………………………………………………………………201

第7章 神经网络入门………………………………………………………………… 202

第8章 为机器人增添知觉…………………………………………………………… 242

第9章 有监督的训练方法…………………………………………………………… 258

第10章 实时演化………………………………………………………………………288

第11章 演化神经网络的拓扑…………………………………………………………303

第4部分附录 …………………………………………………………………………… 366

附录A Web资源…………………………………………………………………… 367

附录B 参考书目和推荐读物………………………………………………………….369

附录C 光盘内容说明………………..……………………………………………… 372

结 束 语 …………………………………………………………………………………… 375

索 引 …………………………………………………………………………………………376


 

目   录

 

译者序 ………………………………………………………………………………i

前言 ……………………………………………………………………………… vi

致谢 ……………………………………………………………………………… ix

关于作者 ………………………………………………………………………… ix

目录 ……………………………………………………………………………… xi

丛书编辑者的来信 ……………………………………………………………… xx

引言 ……………………………………………………………………………xxii

 

第一部分 windows编程……….………………………………… 1

第1章 开始出现一个字, 这个字就是Windows ……….…………………… 2

1.0 后来再出来Word和Excel,…,等……….………………………………………… 2

1.1 历史一瞥…………………………………………………………………………… 2

1.1.1 Windows 1.0 …………………………………………………………………… 3

1.1.2 Windows 2.0 …………………………………………………………………… 3

1.1.3 Windows 3.0和3.1………………………………………………………… 3

1.1.4 Windows 95 ………………………………………………………………… 4

1.1.5 Windows 98及其后续版本 ………………………………………………… 5

1.2 Hello World! ………………………………………………………………………5

1.3 你的第一个Windows程序 ………………………………………………………6

1.3.1 匈牙利表示法 ………………………………………………………………… 9

1.3.2 你的第一个窗口 …………………………………………………………… 11

1.3.2.1 注册你的窗口…………………………………………………………… 12

1.3.2.2 创建窗口………………………………………………………………… 15

1.3.3 Windows消息循环(Message Pump)……………………………………… 18

1.3.4 Windows过程(Windows Procedure)……………………………………… 21

1.3.4.1 WM_CREATE消息…………………………………………………… 23

1.3.4.2 WM_PAINT消息……………………………………………………… 24

1.3.4.3 WM_DESTROY消息………………………………………………… 26

1.3.4.4 其余的怎样呢?………………………………………………………… 27

1.3.5 键盘输入 ……………………………………………………………………… 27

1.3.5.1 虚拟键代码(Virtual Key Codes)……………………………………… 27

1.3.6 嗒的嗒!……………………………………………………………………… 29

 

第2章Windows编程中进一步的各种奇遇 ……………………………… 30

2.1 Windows图形设备接口(GDI)………………………………………………… 30

2.1.1 设备描述表(Device Context, DC)……………………………………………31

2.1.1.1 怎样得到句柄(Handle)呢?…………………………………………… 31

2.1.2 各种绘图工具:画笔、画刷、颜色、线和形状……………………………… 33

2.1.2.1 自定义画笔(Pen)………………………………………………………… 37

2.1.2.2 画刷(Brushes)…………………………………………………………40

2.1.2.3 形状(Shapes)………………………………………………………… 42

2.2 文本(Text)………………………………………………………………………46

2.2.1 TextOut ………………………………………………………………………… 47

2.2.2 DrawText ……………………………………………………………………… 47

2.2.3 加入颜色(color)和透明度(Transparency)……………………………… 48

2.2.4 实时消息抽取循环 …………………………………………………………... 49

2.3 如何创建后备缓冲区? ……………………………………………………………… 51

2.3.1 这听上去很棒,但怎样来实现呢?…………………………………………… 53

2.3.2 我怎样来使用后备缓冲器呢?………………………………………………… 55

2.3.3 保持干净(Tidy)………………………………………………………………57

2.4 使用资源(Resources)…………………………………………………………59

2.4.1 图标(Icons)………………………………………………………………….60

2.4.2 光标(Cursors)……………………………………………………………61

2.4.3 菜单(Menu)………………………………………………………………62

2.4.4 为菜单添加具体功能 ………………………………………………………… 63

2.5 对话框(Dialog Boxes)………………………………………………………65

2.5.1 一个简单的对话框 …………………………………………………………… 66

2.5.2 一些更有用的知识 …………………………………………………………… 68

2.6 正确定时(Timing)……………………………………………………………73

2.7 结束了!………………………………………………………………………… 74

 

第二部分 遗传算法(Genetic Algorithms)…………………… 75

第3章 遗传算法入门 …………………………………………… 76

3.1 鸟和蜜蜂…………………………………………………………………………… 76

3.2 二进制数速成……………………………………………………………………… 81

3.3 计算机内的进化…………………………………………………………………… 83

3.3.1 什么是赌轮选择(Roulette Wheel Selection)?………………………… 84

3.3.2 什么是杂交率(Crossover Rate)?……………………………………………85

3.3.3 什么是变异率(Mutation Rate)? ………………………………………………85

3.3.4 咂搞的呀!…………………………………………………………………… 85

3.4 帮助Bob找回家 ……………………………………………………………………86

3.4.1 为染色体编码 ………………………………………………………………… 88

3.4.2 Epoch方法 …………………………………………………………………… 93

3.4.3选取参数值 …………………………………………………………………… 95

3.4.4 算子函数(Operator Functions)……………………………………………96

3.4.4.1 重温赌轮选择…………………………………………………………… 96

3.4.4.2 重温杂交(Crossover)算子 …………………………………………97

3.4.4.3 重温变异(Mutation)算子 ……………………………………………98

3.4.5 运行寻路人(Pathfinder)程序 ……………………………………………99

3.5 练习题……………………………………………………………………………… 99

 

第4章 置换码与巡回销售员问题 ………………………………………… 100

4.1 巡回销售员问题(TSP)……………………………………………………… 100

4.1.1 小心陷阱 …………………………………………………………………… 102

4.1.2 CmapTSP,SGenome,CgaTSP    ……………………………………… 104

4.1.2.1 CmapTSP类………………………………………………………… 104

4.1.2.2  SGenome结构 ……………………………………………………… 107

4.1.2.3 CgaTSP类 …………………………………………………………… 109

4.2 置换变异算子(Permutation Mutation Operator)………………………… 111

4.3 置换杂交算子(Permutation Crossover Operator)……………………… 115

4.4 挑选一个适应性函数 …………………………………………………………… 116

4.5 选择 (Selection) ………………………………………………………………… 118

4.6 把一切组装在一起.……………………………………………………………… 119

4.6.1 #defines文件 ……………………………………………………………… 120

4.7总结………………..……………………………………………………………… 121

4.8 练习……………….……………………………………………………………… 122

 

第5章 遗传算法优化 ……………………………………………………… 123

5.1 TSP用的各种算子 ………………………………………………………………… 124

5.1.1 各种置换变异算子 …………………………………………………………… 124

5.1.1.2 移位变异(Displacement Mutation,DM)…………………………… 127

5.1.1.3 插入变异 (Insertion Mutation,IM) …………………………………… 128

5.1.1.4 倒置变异 (Inversion Mutation,IVM) ……………………………… 129

5.1.1.5 倒置移位变异(Displaced Inversion Mutation,DIM)………………… 129

5.1.2 各种置换杂交算子 …………………………………………………………… 130

5.1.2.1 基于顺序的杂交(Order-Based Crossover,OBX)…………………… 130

5.1.2.2 基于位置的杂交(Position-Based Crossover,PBX)………………… 133

5.2 各种处理工具………………………………………….………………………… 136

5.2.1 选择(Selection)技术 ………………………………………………………137

5.2.1.1 精英选择(Elitism)…………………………..…………………………138

5.2.1.2 稳态选择(Steady State Selection)…….………………………… 138

5.2.1.3 适应性比例选择(Fitness Proportionate Selection)……………… 138

5.2.1.4 赌轮选择(Roulette Wheel Selection)……………………………… 138

5.2.1.5 随机遍及取样(Stochastic Universal Sampling)……………………… 139

5.2.1.6 锦标赛选择(Tournament Selection)………………………………… 140

5.2.2 变比技术(Scaling Techniques)…………………………………………… 142

5.2.2.1 排名变比(Rank Scaling)……………………………………………… 142

5.2.2.2 西格玛变比(Sigma Scaling)………………………………………… 143

5.2.2.3 波兹曼变比(Boltzmann Scaling)……….………………………… 146

5.2.3 其它杂交算子 ………………………………………………………………… 147

5.2.3.1 单点杂交(Single-Point Crossover)………………………………… 147

5.2.3.2 两点杂交(Two-Point Crossover)……………………………………… 147

5.2.3.3 多点杂交(Multi-Point Crossover)…………………………………… 148

5.2.4 子群技术(Niching Techniques)………………………………………… 150

5.3 总结……………………………………………………..………………………… 151

5.4 练习……………………………………………………………………………… 151

 

第6章 登月也不难 ………………………………………………………… 152

6.1 创建和处理矢量图形…………………………………………………………… 153

6.1.1 顶点和顶点缓冲 ……………………………………………………………… 153

6.1.2 顶点变换 ……………………………………………………………………… 155

6.1.2.1 平移(Translation)………………………………………………………156

6.1.2.2 变比(Scaling)…………………………………………………………157

6.1.2.3 旋转(Rotation)…………………………………………………………157

6.1.2.4 综合运用………………………………………………………………… 159

6.1.3 矩阵魔法(Matrix Magic)……………………………………………………161

6.1.3.1 矩阵究竟是什么?……………………………………………………… 161

6.1.3.2 矩阵的乘法…………………………………………………………… 162

6.1.3.3 单位矩阵………………………………………………………………… 163

6.1.3.4 用矩阵变换顶点………………………………………………………… 163

6.1.3.5 奇妙部分来了…………………………………………………………… 165

6.2 矢量是什么?……………………………………………………………………… 166

6.2.1 矢量加、减法 ………………………………………………………………… 168

6.2.2 计算矢量大小 ………………………………………………………………… 169

6.2.3 矢量的数量乘 ………………………………………………………………… 170

6.2.5 矢量的分解(投影)………………………………………………………… 171

6.2.6 奇妙的点积(Dot Product)…………………………………………………172

6.2.7 SVector2D实用工具类 ……………………………………………………… 173

6.3 绝顶聪明的牛顿………………………………………………………………… 173

6.3.1 时间(Time)…………………………………………………………………174

6.3.2 长度(Length)…………………………………………………………………175

6.3.3 质量(Mass)…………………………………………………………………175

6.3.4 力(Force)…………………………………………………………………176

6.3.5 运动-速度(Velocity)…………………………………………………………177

6.3.6 运动-加速度(Acceleration)……………………………………………… 178

6.3.7 感觉到了力,真快活 ………………………………………………………… 180

6.3.8 引力(Gravity)…………………………………………………………………180

6.4 登月工程-人控制的…………………………………………………………… 181

6.4.1 Ccontroller类的定义………………………………………………………… 182

6.4.2 CLander类的定义 ………………………………………………………… 183

6.4.3 UpdateShip函数 ………………………………………………………… 185

6.5 遗传算法控制的登月艇………………………………………………………… 191

6.5.1 为基因组编码 ………………………………………………………………… 191

6.5.2 杂交和变异操作 ……………………………………………………………… 193

6.5.3 适应性函数(Fitness Function)……………………………………………… 194

6.5.4 更新函数(Update Function)…………………………………………………196

6.5.5 运行程序 ……………………………………………………………………… 199

6.6 小结……………………………………………………………………………… 199

6.7 习题……………………………………………………………………………… 199

 

第三部分 神经网络 …………………………………………… 201

第7章 用平常语言讲神经网络…………………………………………… 202

7.1神经网络介绍 ……………………………………………………………………… 202

7.2 一个生物学的神经网络-大脑 …………………………………………………… 203

7.3 数字版的神经网络……………………………………………………………… 206

7.3.1 现在需要一些数学了 ………………………………………………………… 208

7.3.2 我知道什么是神经细胞了,但用它来干什么呢?…………………………… 210

7.4 聪明的扫雷机工程……………………………………………………………… 212

7.4.1 选择输出 ……………………………………………………………………… 213

7.4.2 选择输入 …………………………………………………………………… 215

7.4.3 隐藏的神经细胞要多少?………………………………………………… 216

7.4.4 CNeuralNet.h文件……………………………………………………… 217

7.4.4.1 SNeuron结构 ……………………………………………………… 217

7.4.4.2SNeuronLayer结构 ………………………………………………… 219

7.4.4.3 CNeuralNet类……………………………………………………… 219

7.4.5 神经网络的编码 ……………………………………………………………… 224

7.4.6 遗传算法 ……………………………………………………………………… 225

7.4.7 扫雷机类(CMinesweeper Class)………………………………………… 226

7.4.7.1CMinesweeper::Update函数 ………………………………………… 228

7.4.8 CController类……………………………………………………………… 230

7.4.8.1CController::Update方法 ………………………………………………233

7.4.9 运行此程序 …………………………………………………………………… 235

7.4.10 功能的两个改进 …………………………………………………………… 236

7.4.10.1 改进一号……………………………………………………………… 236

7.4.10.2 改进二号……………………………………………………………… 239

7.5 最后说几句……………………………………………………………………… 241

7.6 练习题…………………………………………………………………………… 241

 

第8章 为你的Bot提供知觉器 …………………………………………… 242

8.1 回避障碍物……………………………………………………………………… 243

8.1.1 认识环境 ……………………………………………………………………… 243

8.1.2 适应性函数 ………………………………………………………………… 246

8.2 为您的Bot提供一个记忆器(memory)…………………………………… 248

8.2.1适应性函数 …………………………………………………………………… 255

8.3本章小结 …………………………………………………………………………… 256

8.4 练习题 …………………………………………………………………………… 257

 

第9章 有监督的训练方法 ………………………………………………… 258

9.1 异或函数(XOR Function)…………………………………………………………258

9.1.1 反向传播(BP)怎么工作?……………………………………………………259

9.1.1.1 调整输出层的权重 ……………………………………………………… 261

9.1.1.2 为隐藏层调整权重 ……………………………………………………… 262

9.1.1.3 一个例子 ……………………………………………………………… 262

9.1.1.4 改变成CNeuralNet代码……………………………………………… 265

9.2  RecognizeIt - 鼠标手势的识别 ……………………………………………… 270

9.2.1 用向量来表示一个手势 ……………………………………………………… 271

9.2.2 训练网络(Training the Network)…………………………………………… 273

9.2.3 记录并变换鼠标数据 ………………………………………………………… 275

9.2.4 增加新的手势 ………………………………………………………………… 277

9.2.5 CController类………………………………………………………………… 278

9.3 一些有用的技术和窍门 ………………………………………………………… 281

9.3.1 增加动量(Momentum)……………………………………………………281

9.3.2 过拟合(Over Fitting)…………………………………………………………282

9.3.3 柔性最大激励函数 …………………………………………………………… 284

9.4 监督学习的应用 ………………………………………………………………… 285

9.5 一个现代寓言 …………………………………………………………………… 286

9.6 练习题 ………………………………………………………………………………287

 

第10章 实时演化 ………………………………………………………… 288

10.1 聪明的外星人(Brainy Aliens)…………………………………………………288

10.1.1 程序实现 …………………………………………………………………… 290

10.1.1.1 Roswell再现了:外星人大脑的尸体解剖 …………………………… 290

10.1.1.2 外星人的演化 ………………………………………………………… 295

10.1.1.3CController::Update方法 ………………………………………… 299

10.1.2 运行Brainy Aliens程序………………………………………………… 301

10.2 练习题  ………………………………………………………………………… 302

 

第11章 演化神经网络的拓扑 …………………………………………… 303

11.1 竞争约定(competing convention)问题 ……………………………………… 304

11.2 直接编码 ………………………………………………………………………… 305

11.2.1 GENITOR(基因子)…………………………………………………… 305

11.2.2二进制矩阵编码 …………………………………………………………… 306

11.2.2.1 几个相关问题 ………………………………………………………… 307

11.2.3 基于节点的编码 …………………………………………………………… 308

11.2.4 基于路径的编码 ………………………………………………………… 311

11.3 间接编码 ……………………………………………………………………… 311

11.3.1 基于文法的编码 ………………………………………………………… 312

11.3.2 二维生长编码 ………………………………………………………… 313

11.4 NEAT(拓扑扩张的神经演化)………………………………………………… 314

11.4.1 NEAT基因组 ……………………………………………………………… 315

11.4.1.1 SLinkGene结构 …………………………………………………… 315

11.4.1.2SNeuronGene结构 ………………………………………………… 317

11.4.1.3 CGenome类…………………………………………………………… 319

11.4.2 算子和创新(Operators and Innovations)……………………………… 322

11.4.2.1CGenome::AddLink方法 …………………………………………… 324

11.4.2.2CGenome::AddNeuron方法 ………………………………………… 329

11.4.2.3 创新怎样帮助我们设计一个有效的杂交操作 ……………………… 336

11.4.3 物种形成(Speciation)………………………………………………………341

11.4.3.1 兼容性测试 …………………………………………………………… 342

11.4.3.2 CSpecies 类…………………………………………………………… 345

11.4.4 Cga换时代方法(Cga Epoch Method)…………………………… 348

11.4.5 将基因组转变为表现型 …………………………………………………… 354

11.4.5.1 SLink结构 …………………………………………………………… 355

11.4.5.2 SNeuron结构 ………………………………………………………… 355

11.4.5.3 把所有东西组合在一起 ……………………………………………… 357

11.4.5.4 CNeuralNet类 ……………………………………………………… 358

11.4.6 运行Demo程序 ……………………………………………………………363

11.5本章小结 ………………………………………………………………………… 364

11.6 练习题  ………………………………………………………………………… 365

 

第四部分 附录 ………………………………………………… 366

附录A WEB资源 …………………………………………………………… 367

A1 相关的URL地址……………………………………………………………… 367

A2 新闻组 …………………………………………………………………………… 368

 

附录B 参考书目及推荐读物 ……………………………………………… 369

B1 技术书 ……………………………………………………………………………… 369

B2 论文 ………………………………………………………………………………… 370

B3 能激发思想的书 ………………………………………………………………… 371

B4 好得见血的科幻小说!…………………………………………………………… 372

 

附录C 光盘上有些什么?………………………………………………… 373

技术支持 …………………………………………………………………… 374

后记 ………………………………………………………………………… 375

索引 ………………………………………………………………………… 376


 

 

来自系列丛书编辑的信
(Letter fromthe Series Editor)

作为Premier 游戏开发系列丛书的编辑,我很少有时间来自己编写技术书籍。所以,我必须找到那些真正热爱这个行业并有真才实学可以传授给人的人来写这些书。如果你曾经阅读过我写的游戏编程书籍,你会发现,我总是用大量篇幅来阐述AI部分 —从状态机到模糊逻辑 — 但我从来也没有足够的时间来写一部关于AI方面的专著。因此,我们开始为写出世界上最好的AI专著寻找合适的作者。现在,这本书已经完成了,我简直不能相信,我们真的把它完成了!Mat不仅写出了我所希望有的这个专题著作,而且,远远超出了我的期望。他写的这本书有着超越时代的价值,并且会在游戏行业产生深远的影响,不仅如此,这本书对计算机工程,生物计算,机器人制造,最优化理论及其他科学领域都将具有指导作用。

我从来没有看到过有哪本书能够把神经网络和遗传算法结合在一起,并用这些技术来构作真实的演示程序。在过去的20年里,我一直在使用AI技术,但我所惊讶的是,没人意识到这一切其实是那么简单 —这并不是一门火箭科学(rocket science),而只是一种做事情的新方法。如果你曾经看过有关AI的那许多理论书籍,你会发现这些书非常难以理解 —大量的数学,理论,除了让你输入一些系数,然后观察神经网络或遗传算法工作的迭代过程外,完全没有一个实际的真正可操作的程序— 统统是些无用的信息。

当我开始计划该书时,我希望能找到这样一个作者:他不仅要完全了解自己的技术,并且还要是一个厉害的程序员,一个艺术家,还有最关键的是,他必须是一个完美主义者。 Mat和我在该书的目录单上花了不少时间,以决定本书应该涵盖的内容。同时,我们两个都绝对认为本书应该在每个章节都有实例并图文并茂,我们认为必须利用大量的插图(figure)、图例(illustrations)和直观化的东西(visuals)来帮助读者把概念落实。最后,我可以毫不犹豫的说“这是世上有关AI应用技术的最棒的书!”

我敢说任何人都无法拿出比Mat这本书更好地教述理论知识,并把理论知识结合实际让读者能了解并运用于现实的书。我保证当你读完这本书,无论你是一个程序员,工程师,生物学家,机器人科学家或其他专业的人,你会立即迫不及待地把这些技术运用到你的工作中去— 这本书就是有那样的神奇。

同时,这本书也将会让你获得把AI技术应用到其他实际领域,诸如机器人(robotics)、工程学(engineering)、武器设计(weapon design)等,的工具。我敢打赌,这本书发行6个月左右后,网上就会出现有许多非常可怕的Quake机器人!!!

总之,无论你对计算的哪个领域感兴趣,你不能不阅读一下这本书。当你发现你己有可能创造出有思考能力的机器时,你会感到震惊和喜悦— 机器人除了构作在硅材料的数字世界里、在技能上不如我们人之外,其余和我们人并没有什么更多的差别,他们也是有生命(alive)的,就看你怎么来定义生命。 — 数字化生物(Digital Biology)时代的到来将取决于我们 — 对生命的崭新定义,到底何谓生命,和由此开始的各种争论— 生存在物质世界的人类和有机体不能单方面地给生命和感知能力下片面的定义。就象Ray Kurzweil在“灵魂机器时代”(Age of Spirtual Machines)里说的那样,“再过20年,一个标准的台式机的运算能力将超越人脑。”当然,这个结论只是单纯地从莫尔定律出发得出,还没有把量子计算和其他各种未来必定要发生的革新技术考虑进去。我的预测是,到2050年,一个价值一便士、仅有针尖大小的芯片的计算能力将超越这个星球上的人脑运算能力的总和。可能我的预测是完全错误的,说不定这一芯片的能力还有可能大一百万倍,不过我现在仍是一个悲观者。

总而言之:我们确实处于一个新时代的起点,这里,有生命的机器就要诞生,这是不可避免的。了解本书的相关技术是到达那里的第一步。这就是简单法则的应用、演化算法、和以我们的生物为模型的基本技术,就可以帮助我们创造出这些机器,或者更讽刺些的话,创造我们未来的祖先。

Andre' LaMothe

Premier游戏开发丛书系列编辑


 

 

引言(Introduction)

   考虑一下有多少傻瓜能作微积分演算,要让任何其他傻瓜去掌握看来是更困难或更繁琐的微积分技巧就令人惊奇了。

有些微积分技巧是相当容易的,但有些则非常难。那些编写了高等数学教课书的傻瓜 — 他们都是些最聪明的傻瓜 — 很少会劳神向你说明简单的微积分有多么简单。相反地,他们采用了最最艰难的方法来处理相关内容,好象就是刻意要让你牢记,他们那无比的智慧。

由于我是一个出名的傻家伙,我始终不学那些困难的技巧,我现在也要求为我的傻瓜读者提供那些不难的部分。彻底地掌握这些以后,其余的也会随之而来(follow)。我相信,一个傻瓜能干的,其他傻瓜也一定能干。

Silvanus P. Thompson,《简易微积分》导言,1910初版

 

家用电脑从Sinclair ZX80演变到现在已经历了很长的一段路程。硬件速度越来越快,而电脑组件的价格则越来越低。在短短几年时间里,我们所看到的游戏的图形质量有了飞速的提高。不过,到目前为止,这几乎就是游戏开发所有努力要解决的重点— 提供更好的视觉享受,而在我们最喜爱的电脑对手的AI方面,却改进得甚微。

然而,时代在改变。计算机的硬件现已到了这样的转折点,它已能为游戏开发者创建AI提供更多的时钟周期。同时,游戏的玩家们的品位也愈来愈复杂。人们已经不再希望在游戏中看到诸如Doom 和 Quake这些曾经是最心爱的早期游戏中所看到的那种蠢笨怪兽了。他们也不希望再看到计算机控制的游戏角色在那里盲目地蹒跚着寻找根本不存在的路径,不时地被卡在那些拐弯处,或是在没有资源的地方开发矿藏,傻头傻脑地撞在周围的树上。游戏玩家想要从游戏中获得更多的乐趣。他们希望从电脑生成的对手(或盟友)那里看到合情合理的、有智能的行为。

基于这些原因,我坚定的认为,在未来的几年里,AI技术将会大幅度起飞。象Black & White 和 Halo这样的游戏已经让我们为其AI技术而倾心,游戏玩家们正期待更多的此类游戏。此外,基于AI技术和人造生命的全新游戏流派也在最近几年里开始出现,如Steve Grand的Creatures,这个游戏的销售量超过100万份的事实让他本人和其他所有人都吃惊。但如果你认为这是很多了,那么你再看看由Electronic Arts 制作的Sims的销售,到目前为止,Sims及其服务器软件(add-on packs)的销售已经高达一千三百万份!这是一个巨大的销售收入,而同时也是一个重要指示:玩家对这类技术有多么浓厚的兴趣。这个趋势只可能继续。

创造智能幻影(illusion)的技术有多种,本书主要探讨两个方面:遗传算法和人工神经网络。这两项技术讨论的地方很多,他们无疑正是当前的热点论题,但是被误解的地方也相当多。就拿神经系统网络来说,经常会发现游戏开发者误认为神经网络是极其复杂的东西,因而会占用太多的处理器时间,导致游戏速度降低。或者相反,他们可能过度地追求神经网络的能力,企图去创造一个有感觉的类似HAL的人工生命,其结果必然是失败而告终。我希望本书能帮助他们减少类似的曲解。

上面我引用Silvanus Thompson所著的受到人们喝彩的《简易微积分导言》中的那一段话可以成为本书的完美的开端(谢谢,Silvanus!),因为,神经网络和遗传算法和微积分一样,对初学者来说,可以是非常难入门的,尤其对那些没有接受过正规专业教育的人来说如此。而已有的所有此类著作都是由学院式专家为学院式读者所写,其中充斥着(非本专业人)看不习惯的数学公式和难于理解的术语。因此,我写了一本是我刚开始对这些课题感兴趣时所想要读到的那种书:一本由傻瓜写给傻瓜看的书。相信我,如果我刚开始涉足该领域时能够得到这样一本书,我就用不着为搞清那些学究们到底是在讲什么而花那么多时间、受那么多挫折了!

经过这些年,我已经读了有关这个课题方面的很多书和论文,它们几乎都没有能给出真实的例子,没有东西可以让你牢靠地掌握并对自己说“啊!这就是我能拿来运用的东西!”。比如,关于遗传算法的书差不多总是向你提出这样的问题:

最小化下面的函数
f(x1,...,x5) = x1sinx1 + 1.7x2 sin x1 -1.5x3 - 0.1x4cos(x4 + x5 - x1) + 0.2x52- x2 –1

其中
-100 ≤ x1,…,x5 ≤ 100

我的意思是说,这是一个完全可以用遗传算法来解决的问题,但是上面的提法却让我们这些凡人实在难于理解其中的意义。除非你有一个很好的数学基础,这样的问题很可能会显得过于抽象,会立即让你感觉到不舒服,对继续学下去也就没有趣味。

但如果给你的问题是这样:

请允许我向你介绍Bob。今天对Bob来说可不是什么好日子,他已深陷到一个迷宫中,而他的妻子正期待他能早点回家一起分享她花了整个下午制作的晚餐。我来告诉你如何使用遗传算法帮助他找到迷宫出口,以挽救他的婚姻。

你的大脑就有一个可以与之联系的着落点(anchor point)。你也立即会对这样的题目感觉到舒适。不仅如此,这也是一道有趣的题目。你一定很想知道我们怎样来帮他呢?由此你就会打开书本,继续学下去,在学习中感受到乐趣。

这就是我在本书中用来阐明概念所使用的一种类型的题目。如果我的做法正确有效,如何把你的想法运用到你的游戏和项目里就会变得显而易见。

对于我的读者,我只做一个假设,那就是读者了解如何编程。我不了解会有些什么样的读者,但是有时,我当我买了一本书而发现其中仅有一部分我不了解,以至于必须去买另一本书来解释第一本书里我所不懂的内容,就会让我感到失望。为了防止这样的事情发生在读者身上,我努力确保这本书能解释代码所说明的一切— 从Windows GDI、矩阵、和矢量数学的使用,直到物理学和2D图象学。我知道事情通常都有其两面性,很可能一些读者已经掌握了这些图形学、物理学和GDI的相关知识,那么,你们可以跳过这部分而只阅读那些你们更感兴趣的部分。

注:创建演示程序

演示程序是很容易编译生成的。首先把你所需的源程序复制到你的硬盘里(译注:因编译一般需要用到其他的一些文件,你在复制源文件时,应把源程序所在文件夹中所有的文件整个地从光盘复制到硬盘)。如果你用微软的Visual Studio来编译,只要点击工程的workspace文件(译注:即以.ws为后缀的那个文件)就可以开始进行编译并最后生成可执行程序。如果使用其他的编译器,你应该创建一个新的Win32 工程(确保winmm.lib在你的工程设置里),并在按编译按纽之前,先在工程文件夹里加上相关的源程序和资源文件。所有要做的就是这些。用不到添加额外的路径、DirectX 或OpenGL。

在所有的例子里,我尽量使代码编写的尽可能简单。使用的是C++语言,但是我希望C语言程序员也能理解我的代码。所以,出于这方面的考虑,我没有使用C++所固有的诸如继承、多态一类的东西(stuff)。我使用了很简单的标准模板库(STL,Standard Template Library)功能,但是在我引用STL功能的地方,会在边框里进行解释。使用简单代码的一个出发点是不使我所要阐述的原理显得晦涩。相信我,这本书所涵盖的有些内容一开始并不容易掌握,所以我不想把因为在例子中使用了高级代码而把事情弄得更复杂。我已尽我所能恪守老管理顾问的信条:K.I.S.S (Keep It Stupidly Simple,让一切尽可能地简单)。

好了,不再罗索了,让我们来开始冒险吧...



你可能感兴趣的:(游戏编程中的人工智能技术:前言、目录、序言等)