if(condition) then dosomething...
此次主要围绕的是游戏AI该如何模仿人类地判断条件(condition)。函数
人类的逻辑思考是复杂的,模糊的。spa
一些人类逻辑思考的例子:“把面包切成中等厚度”,“这波我很强”,“你好骚啊”,“小A有点高”....3d
而对于计算机,它只认识离散的数值:
假设在一个问题中,智商划分了3个集合:笨拙 = {70~89},平均 = {90~109},聪明 = {110~129}
若是比较一个智商89的人和智商90的人,则但由于计算机很难识别这些模糊的概念(“中等厚度”,“很强”,“好骚”,“笨拙”..),
因此只能根据普通集合获得结论是:89那人是笨拙的,而90那人不是。code
这显然有点不符合人类的逻辑。
为了让计算机也能有相似人类的模糊逻辑,引入了模糊集合这个概念。htm
在介绍模糊集合以前,先介绍它的基本构成——模糊变量。blog
模糊变量是由若干个属性表明的隶属函数定义的,y值为隶属度,隶属度范围为[0,1]。
当某个属性的隶属度越高,则说明该变量越接近这个属性。游戏
例如IQ是一种模糊变量:IQ = {笨拙,平均,聪明},由三个隶属函数(分别表明蓝线,橙线,灰线)定义边界。get
当某我的的IQ为95时,它对"笨拙”的隶属度为0.25,对"平均"的隶属度为0.75,对“聪明”的隶属度为0it
隶属函数除了上面这种形状,也能够有其余函数形状:
此外,须要注意的是,模糊逻辑规定,对模糊变量的任意X值,全部隶属函数值之和应等于1。
使用限制词能够修饰一个隶属函数的形状,变成一个新的隶属函数。
主要有两种修饰:
当咱们须要在IQ这个模糊变量须要“很是聪明”的隶属函数时,
能够直接引用“很是”修饰词来修饰“聪明”的隶属函数。
在以前的例子中,
“很是笨拙”的隶属度 = “笨拙”的隶属度的平方 = 0.25^2 = 0.0625。
模糊集合则是1~n个模糊变量构成的集合,而这些集合通常都是用来进行一些运算得到新的集合。
例如:“聪明”取反运算便是“不聪明”的集合;“高”和“聪明”的与运算便是又“高”又“聪明”的集合。
OR或 : \(F_{1}(x)\) OR \(F_{2}(y)\) = max{\(F_{1}(x)\), \(F_{2}(y)\)}
AND与 : \(F_{1}(x)\) AND \(F_{2}(y)\) = min{\(F_{1}(x)\), \(F_{2}(y)\)}
NOT反 : \(F(x)^{`} = 1-F(x)\)
在计算集合的具体隶属度的时候,便使用上面运算规则来计算隶属度。
例如:当“高”的隶属度为0.7,“聪明”的隶属度为0.5,则“高”AND“聪明”的隶属度应为min{0.7,0.5} = 0.5
在引入模糊集合后,如今能够根据模糊集合来制定模糊规则。
这里不作定义阐述,就用举例直接理解模糊规则:
举例,有一个模糊集合:
其中制定了4条模糊规则:
经过规则,咱们可以计算出每条规则中条件的隶属度,而后概括为指望结果的隶属度:
假设当前敌人距离是12.5,子弹数量是7.5。
由此计算每条规则的指望结果的隶属度:
对于同种结果的隶属度,咱们通常使用或运算进行合并隶属度。
获得隶属度结果:
不指望的隶属度 = 0.25,指望的隶属度=0.25 ,很是指望的隶属度 = 0.5
而后咱们还得另外准备一个模糊变量:指望变量
修剪:将形状中限制在隶属度结果的线下
经过修剪的方法将指望集合和这些隶属度结果合成为一个新的模糊形状:
这就是咱们的推理结论。
最后一步就是去模糊化,把模糊推理以后获得的形状结果变成一个具体准确的值(究竟是作这个动做仍是不作)。
最大值平均是一种去模糊化的方法:
输出值 = 每一个形状的最大隶属度以及其表明指望值的乘积的平均值。
三角形形状的表明指望值很容易找,就是它的顶点的x值。
含高台形状的形状(例如梯形,左/右肩形),这个值是在高台开始的x值和高台末尾的x值的平均。
在上面的例子,
不指望形状的最大隶属度0.25对应表明值21.875,
指望形状的最大隶属度为0.25对应表明值为50,
很是指望形状的最大隶属度为0.5对应表明值为81.25.
因此它输出指望值:
OutPut = \(\frac{0.25*21.875+0.25*50+0.5*81.25}{0.25+0.25+0.5}\) = 58.59375
中心法是一种最准确的去模糊化方法,但也是最复杂的计算方法:输出值 = 形状的中心值,
所谓中心也就是把它放在一把尺子上能保持平衡的位置。
通常的,它使用采样方法来获取近似中心值:
在X轴上平均分布N个点进行采样,计算再每一个采样点对整体隶属度的贡献之和,再除以采样的隶属度之和。
N越大,其结果越准确。
\(OutPut = \frac{\sum\limits_{i=1}^N{(x_{i}\sum\limits_{j=1}^M F_j(x_{i}))}}{\sum\limits_{i=1}^N{\sum\limits_{j=1}^M F_j(x_{i})}}\)
M为被剪裁后的形状(函数)的数量
如图,对9个点进行采样:
计算出输出指望值:
OutPut = \(\frac{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个规则了。更别说更多模糊变量..
库博方法的工做原理也很简单,只需把变量的复合(通常是指和运算)拆分红单个变量的规则:
能够拆分为:
对于N个变量,用通常方法须要O(N²)个规则,库伯方法则只须要O(N)个规则。
虽然上这种拆分表面上看对原规则语义几乎是颠覆,
可是实际实验结果,用库博方法计算出来的指望值与通常方法计算出来的指望值相差很少。
当使用大的规则库时,牺牲部分准确性而使用库博方法绝对是值得的。
实际上对AI的行为使用必定范围的随机数而不是模糊逻辑也是可行的,
可是可能会偶尔致使一些愚蠢的行为,除非反复验证并肯定好随机数范围从而保证不会出现意外的愚蠢。
意外的愚蠢例如:一个中立的NPC由于随机到了某个仇恨值,有时可能会对主动攻击玩家,有时该攻击时却不主动攻击,这显然是不对的。
可是利用模糊逻辑,它能根据各类潜在因素(玩家的犯罪记录,声誉,距离,衣着魅力等等)而不是随机因素来肯定仇恨值,从而达到更加逼真的攻击行为。
目前来讲,在游戏AI里,模糊逻辑并很少用。
游戏AI 系列文章:https://www.cnblogs.com/KillerAery/category/1229106.html