對弈類遊戲的人工智慧 2 學習演算法

2021-06-29 12:04:22 字數 2441 閱讀 6566

前言:

對弈類遊戲的智慧型演算法, 網上資料頗多, 大同小異. 我寫這篇文章, 一方面是對當年的經典<<pc遊戲程式設計(人機博弈), 本文著重講述學習演算法, 以及效能優化和遊戲性問題.

分析:

評估函式的引入, 為遊戲ai提供了理論基礎.

1

g(s) = a1 * f1(s) + a2 * f2(s) + ... + an * fn(s)

但評估函式的選定並非簡單, 其面臨的問題如下:

1). 評估因素的選擇, 如何挑選, 因素是否越多越好

2). 對評估因素得分的歸一化處理

3). 如何進行合理的權重係數分配

這些都是需要思考和優化的地方, 歸納而言就是特徵(因素)選擇, 權重係數學習.

有人提到了強化學習, 通過與環境的互動反饋來學習模型, 參見博文: "幾種智慧型演算法在黑白棋程式中的應用∗". 

當然機器學習中的隨機演算法:模擬退火/遺傳演算法, 也是有效的方式, 而且其更簡單, 也更容易理解, 作者將在這邊重點闡釋.

遺傳演算法:

遺傳演算法(ga)是模擬自然界的進化過程而實現的."物競天擇, 適者生成"是其永恆的定律.

首先讓我們來定義個體向量(染色體):

1

評估函式各個特徵的權重係數構成權重向量 (a1, a2, a3, ..., an), 視為個體向量

其必須滿足的約束如下:

• 權重向量中的係數和恒為1(a1 + a2 + ... + an = 1)

• 經變異/交叉操作後, 係數權重和不為1, 則歸一化過程統一為:

1ai' = ai / ∑ ai (i = 0, 1, 2, ..., n)

再來定義操作子:

複製: 下一代拷貝上一代的權重係數向量即可

變異: 隨機選定某個權重係數ai, 其值設定為某個(0~1)的隨機值, 再進行歸一化處理

交叉: 選定兩個個體向量, 按概率進行對位權重係數交換, 再進行歸一化處理. 

適應度函式: 個體與其他個體的互相pk, 總得分即為其適應度值.

1).初始階段: 選擇n個隨機值的向量個體

2).互相pk階段: n個向量互相pk, 獲取各自的適應度值

3).進化階段: 按適應度值排序, 引入淘汰率/變異率等, 進行複製/變異/交叉操作, 誕生新的n個個體 

持續迭代2), 3)兩階段, 直到選取合適的個體. 

該過程能達到我們的學習需求, 當然我們可以繼續做如下優化: 

引入陪跑員機制: 依經驗挑選精英個體, 參加pk階段, 用於評估個體的適應度, 但不參與進化(複製, 變異, 交叉)過程. 

按適應值概率進化: 防止群體中極少數適應度高的個體被複製和遺傳而達到區域性最優解的情況.

複製/變異/交叉的比率, 以及群體數, 都會影響迭代次數和收斂效果.

總結:

使用遺傳演算法進行引數學習後, 可以合理地分配權重係數, 那事先說好的特徵挑選呢? 簡而言之, 通過篩選掉權重係數近似為0的特徵即可, ^_^.

原本想繼續講下遊戲ai的等級分類, 對博弈樹的高階優化寫在最後:

如果你覺得這篇文章對你有幫助, 請小小打賞下. 其實我想試試, 看看寫部落格能否給自己帶來一點小小的收益. 無論多少, 都是對樓主一種由衷的肯定.

遊戲開發中的人工智慧

今天非常開心,cocos官方直播居然在幾千人中中獎,可以買彩票了。言歸正傳,所謂的人工智慧,也就是大家常說的ai artificial intelligence 一說到ai可能就會讓人覺得比較深奧,其實也就是非玩家角色思考和行為的綜合。比如,在什麼樣的條件下,觸發什麼樣的行為。其實我們在遊戲開發中的...

遊戲程式設計中的人工智慧 補

先抱怨下windows 64bit下的交叉編譯簡直折磨死人,倒騰了幾天之後決定還是切到linux下算了。虛擬機器雖然不給力,但是好歹能看出來優化後的結果。本文沒什麼講的,只是將上文說到的掃雷機的進化過程中耗時最長的函式用c重新寫一遍後比較下執行速度,廢話不多說,直接貼 看結果。原來判斷兩條直線ab和...

Unity遊戲人工智慧學習筆記

最近在學一些遊戲人工智慧的東西,之前對c 也是一知半解,所以收集實際學習中遇到的一些問題 1.c 中的get set訪問器 詳細解釋為什麼要使用get set訪問器 起了個濾網的作用 還有個寫的比較詳細的 舉例說明,比較易懂 應該注意的問題,說是只能用 來賦值不能用 這個我還不是很懂 幾種作用 個人...