游戏AI之模糊逻辑(4)

if(condition)
  then dosomething...

这次主要围绕的是游戏AI该如何模仿人类地判断条件(condition)。

人类的逻辑

人类的逻辑思考是复杂的,模糊的。

一些人类逻辑思考的例子:“把面包切成中等厚度”,“这波我很强”,“你好骚啊”,“小A有点高”....

而对于计算机,它只认识离散的数值:

假设在一个问题中,智商划分了3个集合:笨拙 = {70~89},平均 = {90~109},聪明 = {110~129}

如果比较一个智商89的人和智商90的人,则但因为计算机很难识别这些模糊的概念(“中等厚度”,“很强”,“好骚”,“笨拙”..),

所以只能根据普通集合得到结论是:89那人是笨拙的,而90那人不是。

这显然有点不符合人类的逻辑。

为了让计算机也能有类似人类的模糊逻辑,引入了模糊集合这个概念。

模糊变量

在介绍模糊集合之前,先介绍它的基本构成——模糊变量。

隶属函数

模糊变量是由若干个属性代表的隶属函数定义的,y值为隶属度,隶属度范围为[0,1]。

当某个属性的隶属度越高,则说明该变量越接近这个属性。

例如IQ是一种模糊变量:IQ = {笨拙,平均,聪明},由三个隶属函数(分别代表蓝线,橙线,灰线)定义边界。

当某个人的IQ为95时,它对"笨拙”的隶属度为0.25,对"平均"的隶属度为0.75,对“聪明”的隶属度为0

隶属函数除了上面这种形状,也可以有其他函数形状:

此外,需要注意的是,模糊逻辑规定,对模糊变量的任意X值,所有隶属函数值之和应等于1。

限制词

使用限制词可以修饰一个隶属函数的形状,变成一个新的隶属函数。

主要有两种修饰:

  • “非常”:FVery(x) = F(x)2
  • “有点”:FFairly(x) = √F(x);

当我们需要在IQ这个模糊变量需要“非常聪明”的隶属函数时,

可以直接引用“非常”修饰词来修饰“聪明”的隶属函数。

在之前的例子中,

“非常笨拙”的隶属度 = “笨拙”的隶属度的平方 = 0.25^2 = 0.0625。

模糊集合

模糊集合则是1~n个模糊变量构成的集合,而这些集合一般都是用来进行一些运算获得新的集合。

例如:“聪明”取反运算即是“不聪明”的集合;“高”和“聪明”的与运算即是又“高”又“聪明”的集合。

模糊集合运算符

  • OR或 : F1(x) OR F2(y)= max{F1(x),F2(y)}
  • AND与 : F1(x) AND F2(y) = min{F1(x),F2(y)}
  • NOT反 : F(x)‘ = 1-F(x)

在计算集合的具体隶属度的时候,便使用上面运算规则来计算隶属度。

例如:当“高”的隶属度为0.7,“聪明”的隶属度为0.5,则“高”AND“聪明”的隶属度应为min{0.7,0.5} = 0.5

模糊规则

在引入模糊集合后,现在可以根据模糊集合来制定模糊规则。

这里不做定义阐述,就用举例直接理解模糊规则:

举例,有一个模糊集合:

  • 模糊变量1:敌人距离 = {近,中,远}
  • 模糊变量2:子弹数量 = {低,合适,超载}

其中制定了4条模糊规则:

  • 规则1:if(子弹数量低 AND 敌人距离远)then 不期望攻击
  • 规则2:if(子弹数量低 AND 敌人距离中)then 不期望攻击
  • 规则3:if(子弹数量低 AND 敌人距离近)then 期望攻击
  • 规则4:if(子弹数量合适 AND 敌人距离近)then 非常期望攻击

通过规则,我们能够计算出每条规则中条件的隶属度,然后归纳为期望结果的隶属度:

  • 规则1中:不期望攻击的隶属度 = “子弹数量低” AND “敌人距离远” 的隶属度
  • 规则2中:不期望攻击的隶属度 = “子弹数量低” AND “敌人距离中” 的隶属度
  • 规则3中:期望攻击的隶属度 = “子弹数量低” AND “敌人距离近” 的隶属度
  • 规则4中:非常期望攻击的隶属度 = “子弹数量合适” AND “敌人距离近” 的隶属度

模糊推理

假设当前敌人距离是12.5,子弹数量是7.5。

  • 敌人距离近的隶属度 = 0.5
  • 敌人距离中的隶属度 = 0.5
  • 敌人距离远的隶属度 = 0
  • 子弹数量低的隶属度 = 0.25
  • 子弹数量合适的隶属度 = 0.75
  • 子弹数量超载的隶属度 = 0

由此计算每条规则的期望结果的隶属度:

  • 规则1:不期望攻击的隶属度 = 0
  • 规则2:不期望攻击的隶属度 = 0.25
  • 规则3:期望攻击的隶属度 = 0.25
  • 规则4:非常期望攻击的隶属度 = 0.5

对于同种结果的隶属度,我们一般使用或运算进行合并隶属度。

得到隶属度结果:

不期望的隶属度 = 0.25,期望的隶属度=0.25 ,非常期望的隶属度 = 0.5

然后我们还得另外准备一个模糊变量:期望变量

修剪:将形状中限制在隶属度结果的线下

通过修剪的方法将期望集合和这些隶属度结果合成为一个新的模糊形状:

这就是我们的推理结论。

去模糊化

最后一步就是去模糊化,把模糊推理之后得到的形状结果变成一个具体准确的值(到底是做这个动作还是不做)。

最大值平均

最大值平均是一种去模糊化的方法:

输出值 = 每个形状的最大隶属度以及其代表期望值的乘积的的平均值。

三角形形状的代表期望值很容易找,就是它的顶点的x值。

含高台形状的形状(例如梯形,左/右肩形),这个值是在高台开始的x值和高台末尾的x值的平均。

在上面的例子,

不期望形状的最大隶属度0.25对应代表值21.875,

期望形状的最大隶属度为0.25对应代表值为50,

非常期望形状的最大隶属度为0.5对应代表值为81.25.

所以它输出期望值:(0.25*21.875+0.25*50+0.5*81.25)/(0.25+0.25+0.5) = 58.59375

中心法

中心法是一种最准确的去模糊化方法,但也是最复杂的计算方法:输出值 = 形状的中心值,

所谓中心也就是把它放在一把尺子上能保持平衡的位置。

一般的,它使用采样方法来获取近似中心值:

在X轴上平均分布N个点进行采样,计算再每个采样点对总体隶属度的贡献之和,再除以采样的隶属度之和。

N越大,其结果越准确。

如图,对9个点进行采样:

计算出输出期望值:

(0*0.25+12.5*0.25+25*0.25+37.5*0.25+37.5*0.5+50*0.25+62.5* 0.75+75*0.5+87.5*0.5+100*0.5)/(0.25+0.25+0.25+0.5+0.25+0.75+0.75+0.5+0.5)

= 57.03125

库博方法

可以看到,在制定模糊规则的时候一个主要问题是随着模糊变量的增加,其规则数量则以指数级的速度增加。

假设每个模糊变量有3种属性。一个有3个模糊变量的模糊集合,完整的规则应该是有9个规则。而对于5个模糊变量的模糊集合,就已经需要125个规则了。更别说更多模糊变量..

库博方法的工作原理也很简单,只需把变量的复合(一般是指和运算)拆分成单个变量的规则:

  • if("聪明"和“长”)then 非常期望
  • if("聪明"和“中”)then 非常期望
  • if("聪明"和“短”)than 期望
  • if("平均"和“长”)than 非常期望
  • if("平均"和“中”)than 期望
  • if("平均"和“短”)than 期望
  • if("笨拙"和“长”)than 期望
  • if("笨拙"和“中”)than 期望
  • if("笨拙"和“短”)than 不期望

可以拆分为:

  • if("聪明")then 非常期望
  • if("平均")than 期望
  • if("笨拙")than 不期望
  • if(“长”)than 非常期望
  • if(“中”)than 期望
  • if(“短”)than 不期望

对于N个变量,用一般方法需要O(N2)个规则,库伯方法则只需要O(N)个规则。

虽然上这种拆分表面上看对原规则语义几乎是颠覆,

但是实际实验结果,用库博方法计算出来的期望值与一般方法计算出来的期望值相差不多。

当使用大的规则库时,牺牲部分准确性而使用库博方法绝对是值得的。

结语

实际上对AI的行为使用一定范围的随机数而不是模糊逻辑也是可行的,

但是可能会偶尔导致一些愚蠢的行为,除非反复验证并确定好随机数范围从而保证不会出现意外的愚蠢。

意外的愚蠢例如:一个中立的NPC因为随机到了某个仇恨值,有时可能会对主动攻击玩家,有时该攻击时却不主动攻击,这显然是不对的。

但是利用模糊逻辑,它能根据各种潜在因素(玩家的犯罪记录,声誉,距离,衣着魅力等等)而不是随机因素来确定仇恨值,从而达到更加逼真的攻击行为。

原文地址:https://www.cnblogs.com/KillerAery/p/10344557.html

时间: 2024-10-07 05:27:10

游戏AI之模糊逻辑(4)的相关文章

棋牌源码搭建教程之棋牌游戏AI算法

棋牌游戏客户端实现采用Flash 9开发,服务端采用Win32+VC6开发(基于IOCP),数据库网关采用Win32+VC6开发(基于IOCP,MySQL5实现了处理线程池和数据库连接池).虽然服务器端去年就已经完成,但相应的机器人AI算法一直没有能力去实现.今天把它拿到Blog上来希望有机会和感兴趣的兄弟们探讨下. Kevin在他的Blog上给出了他的实现,其给出的算法思想是用宽度优先生成一棵搜索树,再根据玩牌的技巧进行剪枝与判权,机器人的AI能够像养成类游戏那样,实现在蹂躏下慢慢成长,水平逐

使用行为树(Behavior Tree)实现游戏AI

原地址:http://blog.csdn.net/akara/article/details/6084786 [原创]使用行为树(Behavior Tree)实现游戏AIby AKara 2010-12-09 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM)

对弈类游戏的人工智能(5)--2048游戏AI的解读

前言: 闲得没事, 网上搜"游戏AI", 看到一篇<<2048游戏的最佳算法是?来看看AI版作者的回答>>的文章. 而这篇文章刚好和之前讲的对弈类游戏AI对应上. 于是有了想法, 想把它作为一个实例来进行解读, 从而对之前偏理论的文章做个总结. 承接上四篇博文: (1). 评估函数+博弈树算法 (2). 学习算法 (3). 博弈树优化 (4). 游戏AI的落地 可能有些人会疑惑? 2048并非对弈类类型? 传统的博弈树模型是否能应用于此? 客官莫急, 让我们来一

实现简易而强大的游戏AI——FSM,有限状态机

http://blog.friskit.me/2012/05/introduction-of-fsm/ 在很久很久以前,受限于计算机性能和图形效果,游戏往往是以玩家为唯一主动对象的,玩家发出动作,游戏响应结果.除此之外,不需要系统在玩家没有发出动作时产生响应.可以说,玩家的动作与游戏是“同步”的. 随着计算机的处理能力的发展,更绚丽的游戏逐渐产生.玩家就不能只满足盯着屏幕上静态的一张张图片进行游戏.也就是说,游戏应该有自己的方式能够与玩家主动沟通.这样才能使游戏更加生动,虚拟的环境显得更加真实.

如何建立一个完整的游戏AI

http://blog.friskit.me/2012/04/how-to-build-a-perfect-game-ai/ 人工智能(Artificial Intelligence)在游戏中使用已经很多年了,并且到现在越来越完善.如果你不在你的游戏中加入完善的游戏智能,那么别人就认为你的游戏缺少可玩性.在游戏中,AI并不一定要包括神经网络,学习系统和复杂的数学结构,游戏AI只是游戏中一个重要部分,它是活动的,并不是科学性质的.我认为如何建立一个游戏AI,最主要的就是要明白你想在游戏中实现什么效

用Cocos2d-x3.x和C++11编写2048游戏以及游戏AI

话说,年仅19岁的意大利人Gabriele Cirulli于2014年3月完成并发布在github上,游戏设计来自于<1024>,而<1024>灵感来源于<Threes!>的移动端游戏.然而游戏飙升的人气超乎他的想象,人们忘记了Flappy Bird, 2048成了 网络上"最上瘾的东西". 我是完全为了熟悉Cocos2d-x3.x版本,才写这个游戏的.这个游戏的玩法如下: 该游戏使用方向键让方块上下左右移动.如果两个带有相同数字的方块在移动中碰撞,

游戏AI之A*寻路(2)

前言:寻路是游戏比较重要的一个组成部分.因为不仅AI还有很多地方(例如RTS游戏里操控人物点到地图某个点,然后人物自动寻路走过去)都需要用到自动寻路的功能. 本文将介绍一个经常被使用且效率理想的寻路方法--A*寻路算法,并且提供额外的优化思路. 图片及信息参考自:https://www.gamedev.net/articles/programming/artificial-intelligence/a-pathfinding-for-beginners-r2003/ A*算法介绍 寻路,即找到一

游戏AI(二)—行为树优化之

上一篇我们讲到了AI架构之一的行为树,本篇文章和下一篇文章我们将对行为树进行优化,在本篇文章中我们讲到的是内存优化 问题 上一篇中我们设计的行为树由于直接采用new进行动态内存分配,没有自己进行管理.因此行为树各节点的存储位置会散布在内存空间的各处,行为树在不同节点中切换时会导致Cache频繁失效. 通过内存管理改变行为树节点的内存分布,可以显著提高行为树的内存性能. 解决办法 我们可以在BehaviorTree中引入一组内存分配的API来保证各节点尽量分配在连续的内存上,代码如下 Behavi

游戏AI之感知(1)

感知 视觉感知 视觉感知是一种常见的感知. 在许多即时战略游戏或者类DOTA游戏里,一个单位的视觉感知往往是圆形范围的. 当然在其他大部分俯视角游戏里,一个智能体的视觉感知应该是类似现实人眼观看的扇形范围 对于横板游戏,可以把视野"竖"起来,检测方式无多少差别. 对于空间更加复杂的3D游戏,可能需要视锥体形状(6个平面)检测而不是扇形或者圆锥形. 潜在的优化是照样做成扇形检测,只是再额外增加高度差检测(即看作2.5D处理). 但是视野实际还需考虑阻挡问题. 这里提供两种解决视野遮挡的思