前言:
對弈類游戲的智能算法, 網上資料頗多, 大同小異. 我寫這篇文章, 一方面是對當年的經典<<PC游戲編程(人機博弈)>>表達敬意, 另一方面, 也想對自己當年的游戲編程人生做下回顧.
上一篇博文:對弈類游戲的人工智能(1)--評估函數+博弈樹算法, 着重講述了評估函數+博弈樹, 本文着重講述學習算法, 以及性能優化和游戲性問題.
分析:
評估函數的引入, 為游戲AI提供了理論基礎.
G(s) = a1 * f1(s) + a2 * f2(s) + ... + an * fn(s)
但評估函數的選定並非簡單, 其面臨的問題如下:
1). 評估因素的選擇, 如何挑選, 因素是否越多越好
2). 對評估因素得分的歸一化處理
3). 如何進行合理的權重系數分配
這些都是需要思考和優化的地方, 歸納而言就是特征(因素)選擇, 權重系數學習.
有人提到了強化學習, 通過與環境的交互反饋來學習模型, 參見博文: "幾種智能算法在黑白棋程序中的應用∗".
當然機器學習中的隨機算法: 模擬退火/遺傳算法, 也是有效的方式, 而且其更簡單, 也更容易理解, 作者將在這邊重點闡釋.
遺傳算法:
遺傳算法(GA)是模擬自然界的進化過程而實現的."物競天擇, 適者生成"是其永恆的定律.
首先讓我們來定義個體向量(染色體):
評估函數各個特征的權重系數構成權重向量 (a1, a2, a3, ..., an), 視為個體向量
其必須滿足的約束如下:
• 權重向量中的系數和恆為1 (a1 + a2 + ... + an = 1)
• 經變異/交叉操作后, 系數權重和不為1, 則歸一化過程統一為:
ai' = ai / ∑ ai (i = 0, 1, 2, ..., n)
再來定義操作子:
• 復制: 下一代拷貝上一代的權重系數向量即可
• 變異: 隨機選定某個權重系數ai, 其值設定為某個(0~1)的隨機值, 再進行歸一化處理
• 交叉: 選定兩個個體向量, 按概率進行對位權重系數交換, 再進行歸一化處理.
適應度函數: 個體與其他個體的互相PK, 總得分即為其適應度值.
1). 初始階段: 選擇N個隨機值的向量個體
2). 互相PK階段: N個向量互相PK, 獲取各自的適應度值
3). 進化階段: 按適應度值排序, 引入淘汰率/變異率等, 進行復制/變異/交叉操作, 誕生新的N個個體
持續迭代2), 3)兩階段, 直到選取合適的個體.
該過程能達到我們的學習需求, 當然我們可以繼續做如下優化:
• 引入陪跑員機制: 依經驗挑選精英個體, 參加PK階段, 用於評估個體的適應度, 但不參與進化(復制, 變異, 交叉)過程.
• 按適應值概率進化: 防止群體中極少數適應度高的個體被復制和遺傳而達到局部最優解的情況.
復制/變異/交叉的比率, 以及群體數, 都會影響迭代次數和收斂效果.
總結:
使用遺傳算法進行參數學習后, 可以合理地分配權重系數, 那事先說好的特征挑選呢? 簡而言之, 通過篩選掉權重系數近似為0的特征即可, ^_^.
原本想繼續講下游戲AI的等級分類, 對博弈樹的高級優化, 發現篇幅受限, 那就放到下一篇吧.
寫在最后:
如果你覺得這篇文章對你有幫助, 請小小打賞下. 其實我想試試, 看看寫博客能否給自己帶來一點小小的收益. 無論多少, 都是對樓主一種由衷的肯定.