カテゴリー別アーカイブ: ゲームプログラミング

【自分用メモ】とうぶつしょうぎ > KKM テーブル

次にKKM(※ M は持ち駒を表す)
KKP 同様に、KK 分の場合の数は 6*7 = 42。

持ち駒は6種類で、値は 0~2 なので、short KKM[6][7][6*3]; で充分。
が、よく考えると、持ち駒の歩が無いのと持ち駒の角が無いのを重複して評価する必要は無いので、
持ち駒数が 1, 2 の場合のみテーブル化し、持ち駒数0 は KK だけで共通化するとよい。

short KK[6][7];
short KKM[6][7][6*2];

要素数は 42*(12+1) = 546 となる。

【自分用メモ】とうぶつしょうぎ > KKP テーブル

先手玉位置を k1, 後手玉位置を k2, 玉以外の盤上の駒タイプ・位置の識別番号を p とするとき、
short KKP[12][12][12*8]; を作っておけば、KKP[k1][k2][p] で評価値を計算できる。
要素数は 12*12*12*8 = 13,824 だ。
先手玉位置が盤面の右側にある場合は左右反転すれば、先手玉位置の場合の数は 8 に減る。
さらに、評価関数は先手番で呼ばれるため、先手玉が相手陣地に入っている場合は既に終局となっていて、
評価関数が呼ばれることは無い。したがって、先手玉位置の場合の数は 6 にな。
同様に、後手玉位置も9に減る。
先手・後手玉が隣接している場合、相手玉を取って終局となるので、これも評価関数で評価する必要は無い。
ただし、テーブルとしては最大数を用意しておく必要があるので、後手玉位置の場合の数は7になる。
玉以外の盤上の駒については、双方の玉位置には配置できないので、その分場合の数が減り、10*8 = 80 となる。

よって、KKP 配列は short KKP[6][7][80]; と宣言でき、要素数は 3,360 となる。
最初の要素数の約3分の1だ。

【自分用メモ】どうぶつしょうぎ KKP KPP 評価関数

盤面が12箇所しかないので、本将棋に比べるとテーブルはかなり小さくなる

KKP

対称形を排除するため先手玉位置を左または中央列のみとする。右列にあった場合は左右反転を行なう。
これで、場合の数が8に減少する。
後手玉位置は先手局位置以外の11箇所なので、場合の数は 8*11 = 88 となる。
盤上の玉以外の駒をPとすると、位置は10箇所、駒の種類はと金を含めて8なので、
KKPの場合の数はトータルで 88 * 10*8 = 7,040 となる。
KK が両方共中央にある場合は、P を左に寄せることが出来る。もう少し場合の数が減る。

KKM

持ち駒はMで表すことにする。
持ち駒の種類は6。それぞれ [0, 2] の3つの状態があるので、場合の数は 6*3 = 18。
よって、KKM の場合の数はトータルで 88 * 18 = 1,584 となる。

これはかなり少ない数なので、KKMM を採用するのもありかもしれない。
場合の数は 88 * 18 * 5*3 = 23,760

KPP

KKP と同じく、玉の位置は左によせる。ただし、先手玉と後手玉があるので、場合の数は 8*2 = 16 だ。
P は8種類で位置は11または10なので、場合の数は 8*11 = 88, 8*10 = 80 で、
トータルの場合の数は 16*88*80 = 112,640 となる。

KPM

持ち駒の場合の数は 6*3 = 18 なので、
KPM の場合の数は 16*88*18 = 25,344 だ。

KMM

KMM の場合の数は 16*18*15 = 4,320 だ。

場合の数をすべて合計すると、

7,040 + 1,584 + 23,760 + 112,640 + 4,320 = 149,344

となる。評価値を2バイトで保持すれば充分なので、約300Kバイトで事足りることになる。

これらの線形和を計算すれば、かなり正確な評価関数になるように思われるのだが、どうだろうか?

んで、問題は約15万個の値を高速かつ正確に計算するにはどうしたらいいのか?ってことである。