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