優化黑白棋估值引數

2021-04-01 05:13:16 字數 1276 閱讀 4302

實際是個統計工作。但這裡不打算講模板引數的計算,因為模板估值本身可能不少人還不了解,另外,模板引數計算起來非常複雜,雖然其原理並不難,詳細原理請參考

http://.cs.ualberta.ca/~mburo/ps/improve.pdf ,本文實際是對這篇**的簡化和個人理解。順便說一下,

http://.cs.ualberta.ca/~mburo/publications.html 這裡有很多關於黑白棋的**,要寫黑白棋的朋友不可不看。

相信大家對穩定子、行動力、潛在行動力的概念都已經很清楚了。所以在此考慮乙個簡單的估值模型。f(p)=w1*f1(p) + w2*f2(p) + w3*f3(p),其中p為乙個局面,f1是穩定子個數,f2是行動力,f3是潛在行動力,w1,w2,w3是他們的權重。要估值準確,就需要設定w1,w2,w3的值,通常我們都是猜測他們的值,或根據經驗來設定。但是這樣不能達到最優。實際上,我們可以統計大量的已知結果的棋局,來求出他們的值。對於已知的棋局,其結果是已知的,那麼對於大量的棋局,我們要使得每個局面下通過f(p)計算得到的值盡量接近最終結果,這就是乙個多元線性擬合問題。最終的目的是使每個局面的估值誤差的平方和(我認為絕對值的和也可以)達到最小化。

對於這類問題,一般可以用多元線性回歸來求解,求解乙個方程組。但對於這裡的情況而言,由於樣本數量巨大,可達數百萬個局面,直接求解方程組已經不可能。只能採用逐次逼近的辦法。用w來表示向量(w1,w2,w3),f表示向量(f1,f2,f3),逼近迭代式如下

w(t+1)=w(t)-b(grad(e(w),w))*w(t),其中b>0是乙個重要引數,控制了迭代速率。

其中e(w)=sigma(delta(w,k)^2)/n,k=1...n

delta(w,k)=局面k的估值和局面最終結果的差值,delta(w,k) = r(pk) - (w1*f1(pk) + w2*f2(pk) + w3*f3(pk))

n是總局面數,sigma是求和

grad(e(w),w))是對e求w的偏導數,注意,這裡是向量

結果是 -2*sigma(fi(pk)*delta(w,k))/n

因此,最終的迭代式就是

wi(t+1)=wi(t) + 2*b*sigma(fi(pk)*delta(w,k))/n,k=1...n

其中wi的初始值可以選擇0,但我對其中b的取值還不知道如何去估計,只能隨便給了乙個,注意,b取值過大可能導致迭代不收斂。

以上講了乙個簡單的估值模型,實際應用中,估值引數在不同的遊戲階段有很大的不同,因此需要分段處理,但處理方法一樣。比如將遊戲分為20個階段,根據局面中棋盤上剩餘的空格數來分段,或者乾脆分為60個階段,每一步都是乙個階段。

黑白棋遊戲

黑白棋遊戲 time limit 10000ms memory limit 65536k total submit 9 accepted 5 case time limit 1000ms description 問題描述 黑白棋遊戲的棋盤由4 4方格陣列構成。棋盤的每一方格中放有1枚棋子,共有8枚白...

黑白棋遊戲

用c 封裝了一下,只完成了乙個雛形,有很多功能沒有新增上,但 的行數已經縮短了很多了。include include include includeusing namespace std class chess int counter 計數器,計算棋子個數 const friend void dra...

黑白棋遊戲

include include using namespace std char e 30 30 int a 30 30 int c 30 int x 30 int y 30 intf int n,int sum int pos sum 2 n int cnt 0 int flag 0 int w ...