評価関数
int evalute() { make_list() for(..) { PcOnSq() } score += sum;score /= FV_SCALE; score += MATERIAL; return turn ? -score:score }
make_listの中身
score += kkp[sq_bk0][sq_wk0][ kkp_hand_pawn + I2HandPawn(HAND_B) ];
sq_bk0/wk0は王様の座標みたい。
王と王の位置で、持ち駒の評価を変えている?
n2 = 0; bb = BB_BPAWN; while ( BBToU(bb) ) { sq = first_one( bb ); Xor( sq, bb ); list0[nlist] = f_pawn + sq; list2[n2] = e_pawn + Inv(sq); score += kkp[sq_bk0][sq_wk0][ kkp_pawn + sq ]; nlist += 1; n2 += 1; }
Bitboard方式をやってない人には見慣れないと思いますが、
first_oneは初めにビットが立つ位置を見つける関数(きっとアセンブラ)
歩兵のビットボードの初めにビットがたっている位置=sq
歩兵のビットボードとXorすると、sqの位置は0になり、他はOR
これは王と王による歩兵の位置評価みたいですね
kkp配列は、王と王による○○が格納されている学習評価関数らしい
make_listで評価した駒の数だけ(返値nlist)
sum += PcPcOnSq( sq_bk, k0, l0 );
sq_bkは王様位置なので
王様の位置毎に、駒と駒の位置を評価している(駒は先手後手混在)
これは3駒の位置評価で、隣接駒じゃなくて、すべての場合で駒と駒の位置評価?凄い
estimate_score_diff() diff = -(int)PcOnSq( ibk, aipos[15+ipc_cap]+ito );
evaldiff.cではPcOnSqはこういう呼び方を
ibkはSQ_BKING
bitboardでも結局はbanとかboard配列いるよね。みたいな話だったと思うけど
bonaのevalではそういうのがない。
bitboardで駒の数x価値とすればmatrialは求まるし、
bitboardさえあれば、盤の配列はいらない。考えてみればたしかにそうだよね。盲点盲点 orz