08.游戏AI方法之模糊逻辑
GameAI专栏:08.游戏AI方法之模糊逻辑
模糊逻辑(Fuzzy Logic)是一个处理灰色区域的数学技术,这和我们前面几期介绍的决策算法很不一样。前面的决策算法,要么真要么假,没有模糊的空间,而模糊逻辑就是处理真假之间的区域。
模糊逻辑

模糊逻辑是由 Lotfi Zadeh 在 1960 年代首先提出的,开始是为了解决计算机处理自然语言理解的问题,后来模糊逻辑用来模仿人类的推理和认知,非常适合处理那些决策不明确的情况。
在游戏AI中,模糊逻辑主要是用来模糊两种状态之间的界限。
比如,我们有一个在危险环境中移动的角色AI,在有限状态机中,它只有两种状态: 谨慎和自信。
当角色保持谨慎状态时,它会缓慢地偷偷溜走,留意可能出现的危险。
当角色处于自信状态时,它会正常行走。
当角色移动通过关卡时,它将在这两个状态之间切换,这就会出现一个很奇怪的情况,这种状态的切换非常的生硬。角色可能还匍匐前进,突然就正常行走了,这也和一般在熟悉周边情况后才逐渐变勇敢这个常识不符。
模糊逻辑概念
模糊逻辑有一个模糊集合(Fuzzy Set)的概念,其数值被称为隶属度( DOM)。在模糊逻辑中,将常规数据转换为隶属度的操作称为模糊化,而反向转换为解模糊化。
在使用模糊逻辑用来做决策时,我们可以使用传统的逻辑AND NOT 和OR等规则。
我们用驾驶汽车为例,汽车可用的操作包括转向和速度控制。链接输入输出的是一组模糊规则,主要是以下的结构。
IF 输入状态1 AND … AND 输入状态N THEN 输出状态
类似汽车的规则:
- - ```
IF 追逐 AND 进入拐角处 AND 行驶速度很快 THEN 刹车IF 前进 AND 进入高速路 AND 行驶速度很慢 THEN 加速
我们把它变成两个输入,简单一些:
IF 进入拐角处 AND 行驶速度很快 THEN 刹车IF 驶出拐角处 AND 行驶速度很快 THEN 加速IF 进入拐角处 AND 行驶速度很慢 THEN 加速IF 驶出拐角处 AND 行驶速度很慢 THEN 加速
如果隶属度:
进入拐角处 = 0.1
驶出拐角处 = 0.9
行驶速度很快= 0.4
行驶速度很慢= 0.6
按照规则计算的结果:
刹车 = min(0.1, 0.4) = 0.1
加速 = min(0.9, 0.4) = 0.4
加速 = min(0.1,0.6) = 0.1
加速 = min(0.9,0.6) =0.6
所以,刹车的最终值为0.1,而加速的最终值是0.6。
**模糊逻辑的实现**
先创建两个基类:
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- ```
using UnityEngine;using System.Collections;public class MembershipFunction: MonoBehaviour { public int stateId; public virtual float GetDOM( object input) { return 0f; }}using System.Collections;using System.Collections.Generic;public class FuzzyRule { public List stateId; public int conclusionStateId;}
然后是FuzzDecisionMaker类:
using UnityEngine;using System.Collections;using System.Collections.Generic;public class FuzzDecisionMaker: MonoBehaviour{ public Dictionary MakeDecision(object[] inputs, MembershipFunction[][] mfList, FuzzyRule[] rules) { Dictionary inputDOM = new Dictionary(); dictionary outputDOM = new Dictionary(); MembershipFunction memberFunc; foreach ( object input in inputs ) { int r,c; for ( r = 0; r 往期回顾:**