KPPの差分評価メモ
3駒関係(KPP:[王][駒1][駒2])の計算部分は簡単に書くと以下のようになる。
for ( i = 0; i < nlist; i++ ) { for ( j = 0; j <= i; j++ ) { sum += PcPcOnSq(sq_bk0, list[i], list[j]); } }
listに駒種+駒位置情報を入れて2重ループを回す。
KPPの対称性から、j <= iの条件となる。
2重ループの計算が重いのと、make_moveしてもlistは1〜3個
くらいしか変わらないので、毎回、全部まともに計算する必要は
ない。そこでlistが変わった場合だけを差分計算する。
list[1]の寄与を取り除く場合は、以下の赤い部分を引けばよい。
PcPcOnSqは対称なので、上記の赤の総和は以下の部分の総和と同じ。
listを同時に二つ更新する場合も同様だけど、以下のように重なる
部分が生じる。このときは重なった部分を足してやればよい。
ボナンザは毎回listを生成しなおしているけど、
非ビットボードのsimkにとっては辛いのでlistを差分更新にした。
KKP+KPPハッシュ(局面ハッシュとは別物)との絡みもあるので
面倒だったが、なんとか動いている模様。
全体で30%くらい速くなった。