模糊逻辑在 AI 中的应用
今天收到人民邮电出版的杨海玲同学寄来的几本书,首先感谢一下。看来短期内是没有那么多精力全部去读了,所以先随便翻翻感兴趣的章节。
在《游戏人工智能编程案例精粹 》 和 《 Windows 游戏编程大师技巧 》 中都分别有一章谈及模糊逻辑。记得前几年我的同事 Soloist 同学曾经研究过一小段时间,给我做过简单介绍,我便仔细把这两章书读了一遍。感觉都是点到为止,所以又翻了一下 Wikipedia 的 Fuzzy Logic 的介绍。午饭时跟做 AI 的同事交流了一下,觉得可以做一点笔记记录理解的部分。
在游戏人工智能编程中举了个实际的例子来说明这个问题:在一个 FPS 游戏中,NPC 有多种武器可供选择,这些武器的威力、射程等有所差异;策划决定根据 NPC 和玩家的距离以及 NPC 武器弹药的余量,两个因素来考虑 NPC 当下应该选择哪一种武器对抗玩家。这个例子不错,不过我有另一个自己的例子:在 MMO 中,NPC 在追击玩家时可能会考虑几个因素:离开他的出生点的距离,以及玩家的实力,或是自己的 HP 量等等。下面我用自己的例子来说明问题。
先甩开模糊逻辑是什么不谈,我们在做 AI 定制的时候会遇到怎样的很难决策的问题呢?
策划往往会定义规则:当 NPC 距离出生点很远时,他们停止攻击玩家并返回出生点。
这里有一个问题,即使是最新手的策划也看得出来,这个规则描述是不严谨的。到底什么叫“很远”。所以通常,需要加一个定义,追击半径,变成“当 NPC 距离出生点超过追击半径时,他们停止攻击玩家并返回出生点”。然后,在策划表格里估计就会多出一个表项:追击半径 40 米 之内的东西。
顺便吐槽:把设计这个规则(追击条件),和填写这个数字( 40 米追击半径)的工作分开,分别称做系统策划和数值策划,我怎么看都是件极不靠谱的事情。
程序不难实现,规则也很清晰。可如果规则多于一条,就不那么简单了。
假设我们加了一条规则:当 NPC 的 HP 很少(比如以 20% 为界限),他们不再追击玩家。
NPC 做决策就需要考虑两个因素,这两个因素导出的决策结果可能截然相反,这时怎么办更合理?比如,当 NPC 的 HP 充足时,它们应该追击玩家;可 NPC 可能离开出生点已经太远了,以距离原则来讲,它又应该放弃追击。
在黑白分明的逻辑判断角度讲,我们可以简单的定义出严格的规则。比如两条规则去交集,只有都满足才追击,否则放弃。但你能发现其中不合理之处么?
如果我们以 20% 的 HP ,或距离 40 米为分界线。某一个条件上,19% 和 20% 的细微差别,或是 39 到 40 米的变动,都足以改变决策结果。但是又有些看起来巨大的差异,比如 1% 到 19% ,或是 1 米到 39 米却对结果无影响。
一个更生动(更接近人)的决策行为可能是这样的:当其中一个条件处于边界左右时,我们更多的考虑另一个条件的影响。比如,当 NPC 的 HP 在 20% 左右时,无论是 19% 还是 21% 都对决策结果影响不大,这时,距离成了更重要的参考依据。反之亦然,无论 NPC 离开出生点 39 米还是 41 米,影响决策结果更多的是他的 HP 值。
要做到这点,不是简单的 if else 就可以达到效果的。无论用什么方案,都会增加 AI 的计算量。决定在何种环境下为哪些 NPC 附加这种 AI 是另一个问题。我们先不谈成本,仅说说怎样做到。
我的第一反应和中午饭局上许多同学的反应一样,为每个决定因素加上一定的概率因子。不再以 40 米为分界非 0 即 1 ,而是让追击概率成为和距离有关的一个函数。把几个影响决策结果的因素的概率全部算出来,然后用随机数去模拟决策过程。
但,模糊逻辑并不依赖随机的模拟。简单说,利用模糊逻辑决策,所有的输入都确定的情况下,一定会得到确定的结果。所谓的模糊指那些边界条件是模糊的。
一般我们会给每个变量定义三档强度标准,比如对于距离远来说,我们可以定义 10 米算近,20 米算有一定距离,40 米算远。那么低于 10 米都算很近了,而超过 40 米都算很远了。但介于 10 米到 20 米之间的,即可以算很近也可以算有一定距离;而 20 米到 40 米之间则可以算有一定距离,称之为远亦尚可。画在坐标图上,是左右两个半梯形,和中间一个三角形的形状。事实上,用曲线来表现也可以,但不利于计算,一般不会采用。
从数值上分析,可以看作,低于 10 米就 100% 算近,而远于 40 米则 100% 算远。处于 20 米的地方则 100% 算保持一定距离。中间状态则是平滑过渡的。
然后,对结果的期待程度也可以分成三类。就追击而言,可以分为,完全不想追击、希望追击、强烈希望。用同样的方式定义出来。
最后,我们可以排列出所有的规则,比如:
当离开出生点很远,且 HP 很少时,完全不想追击。当离开出生点一定距离,且 HP 很多时,强烈希望追击。当离开出生点一定距离,且 HP 适中时,希望追击。等等。
由于我们有两个条件,每个条件有三档状态,所以完整的规则会产生 9 条。定义这些规则需要策划的专业知识。但略微有偏差的规则不会让结果突变,缺少一些条件和规则,计算也能进行下去。
我们把参数依次代入所有的规则,可以得到决策结果分别处于“完全不想,希望,和强烈希望”三个类别中的置信度。这里,一条规则中引用两个条件时,我们取教小的值。假设,当 NPC 距离出生点为 30 米时,对于“很远”的置信度为 0.5 ;而 HP 为 30% 时,对于“HP 很少”的置信度为 0.4 ;那么,对于完全不想追击的置信度为 0.4 和 0.5 中较小值 0.4 。
计算完所有的规则,取那些重复的决策结果中较大的一个。即若超过一条规则的推导结果是强烈希望追击的话,就取最大的一个数。最终,我们会得到“完全不想、希望、强烈希望”三档分别的置信度。
到底最终决策的期望度有多高,这是一个被成为去模糊化的过程。简单的说,它是对前面得到的三挡置信度形成的图形取质心的过程。我不想详述。
采用模糊逻辑,可以让 AI 在同一时刻能做出的所有反应都计算得到一个期望实施的程度值。如果我们可能需要 NPC 去判断,是应该追击玩家,还是原地防御,或是逃跑做一个选择;又或者要根据自己的 HP MP 量,对手的状态等,在自己可以释放的若干技能中做一个合理选择;那么,只需要单独为每个决策都按配置好的模糊规则做一个计算,选择最强烈的倾向即可。
可以看出,采用这种方法,决策结果和决策条件是严格对应的。对于决策条件较少的情况,我们完全可以用配表的形式,以及设计调整合理的公式的方式达到同样的效果。但是随着决策条件的增加,复杂度会发生组合爆炸,人力不可控制。
当决策条件太多时,一个明显的问题是规则的组合爆炸。我们需要描述每个条件处于每种状态时,决策结果应该是怎样的。而 Combs method 可以帮我们应对这种情况。通俗说,我们可以把“当离开出生点很远,且 HP 很少时,完全不想追击。”这条规则分解成两条独立规则“当离开出生点很远,完全不想追击”以及“当 HP 很少时,完全不想追击。”
用这个方法简化规则,有时会产生矛盾或是违反直觉。但实践表明,用这种一维的规则列表,会得到与前面那种完整的规则组合非常近似的结果。
ps. 我没想过通过短短一小篇文字就把这个问题讲清楚,因为那是不可能的。学习从来不是件轻松的事情。
建议继续学习:
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:云风的 BLOG 来源: 云风的 BLOG
- 标签: AI 模糊逻辑
- 发布时间:2013-03-11 13:48:34
- [56] IOS安全–浅谈关于IOS加固的几种方法
- [56] Oracle MTS模式下 进程地址与会话信
- [55] 如何拿下简短的域名
- [54] 图书馆的世界纪录
- [53] android 开发入门
- [53] Go Reflect 性能
- [50] 读书笔记-壹百度:百度十年千倍的29条法则
- [50] 【社会化设计】自我(self)部分――欢迎区
- [39] 程序员技术练级攻略
- [33] 视觉调整-设计师 vs. 逻辑