P小二 P小二
← 返回文章 游戏AI 约 6 分钟

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 往期回顾:**

07.游戏AI方法之行为树

06.游戏AI方法之分层状态机

05.游戏AI方法之有限状态机