Bonanza4の評価関数はどのようなものか【fv.bin編】

■ Bonanza4の評価関数はどのようなものか【fv.bin編】


前回、Bonanzaの駒割の評価部を説明した。


残るは、「3駒相対」の部分であるが、この3駒は、
・2玉 + 駒
・1つの玉 + 2駒
の二つの組み合わせがある。


Bonanzaでは、このどちらも評価している。


ここでは前者をKing-King-Pieceを略してKKP、後者をKing-Piece-Pieceを略してKPPと呼ぶことにする。


実際、Bonanzaのソース上に、kkpという配列があり、この評価のための値が格納されている。これは、data.cにて宣言されている。

// 評価値計算用テーブル
short pc_on_sq[nsquare][pos_n];
short kkp[nsquare][nsquare][kkp_end];

pc_on_sqのほうは、KKPではなく、KPPのほうを評価するためのテーブルである。このテーブルへは、次のマクロを用いてアクセスする。


nsquare = 81(盤面の広さ)である。kkp_endやpos_nについては詳しい解説を要するので今回は説明を割愛する。

#define PcPcOnSq(k,i,j)     pc_on_sq[k][(i)*((i)+1)/2+(j)]

また、この二つの配列kkp,pc_on_sqにデータを読み込むのは、ini.cのload_fv関数である。この関数は、"fv.bin"というファイルから読み込む。


fv.binの前半は、pc_on_sq用のデータが格納されており、後半には、kkp用のデータが格納されている。


ini.cのload_fv関数の該当部分を示す。

  pf = file_open( str_fv, "rb" );
  if ( pf == NULL ) { return -2; }

        // 評価値の計算用テーブルをファイルから読み込む。
  size = nsquare * pos_n;
  if ( fread( pc_on_sq, sizeof(short), size, pf ) != size )
    {
      str_error = str_io_error;
      return -2;
    }
…
  size = nsquare * nsquare * kkp_end;
  if ( fread( kkp, sizeof(short), size, pf ) != size )
    {
      str_error = str_io_error;
      return -2;
    }

  iret = file_close( pf );


■ Bonanzaが読み込む外部ファイル


Bonanzaでは次の3つの外部ファイルを読み込む。
・fv.bin(KKP,KPP用)
・hash.bin(同一手順で負けるのを防止するための局面ハッシュ格納用)
・book.bin(定跡)
今回は、fv.binについてその説明をした。


逆に言えば、これら以外のデーブルに関しては、ini.cのini_tablesで動的に生成(初期化)が行なわれているので、テーブルの値がどうなっているのか知りたいときは、そちらを見れば良い。


■ まとめ


Bonanzaの評価関数は
・駒割 -- material関数
KKP(二つの王と1駒による3駒相対) -- make_list関数
・KPP(王と2駒による3駒相対) -- evaluate関数
の3つから構成されている。


今回は、KPP,KKPで用いるテーブルの読み込みについて解説した。
KPP,KKPについて詳しい解説は次回以降に行なう。