評価関数 (1)

前回書いた学習によって決定された評価パラメタの値を使用して、局面の評価が行われる。
これを実行するのは、evaluate()である。この関数は、引数で指定された手番(turn)側から見た評価値を返す。手番側が有利であればプラス、不利ならマイナスになる。
評価する項目は、

  1. 駒割(駒の損得)
  2. 駒の位置関係

の二種類だけである。

この二つの項目間の重み付けは、FV_SCALE(=32)で与えられる。FV_SCALEは固定値であり、ゲームの進行等によって変化することはない。

評価値 = 駒割 + 駒の位置関係 / FV_SCALE

駒割は、駒の種類ごとに与えられる価値(これは評価パラメタ)に、敵味方の駒の数の差を掛けたものを、全ての駒の種類で合計した値である。駒が盤上にあるか、持駒であるかは関係ない。
学習時にパラメタの初期化を指定した場合は、以下の値に初期化されて学習を開始する。

100
300
300
400
500
600
700
400
成香 400
成桂 400
成銀 500
800
1000

(* 私は、と、成香、成桂、成銀、金の価値を同じにしていない理由が未だわかっていない。成駒を相手に取られるときには、成駒の価値+元の駒の価値だけ変化させているのだから)
駒割は、evaluate()の呼び出し毎に実際に計算するわけではなく、一手を指して局面が進行(MakeMove())する時点で値を更新している。