評価関数 (1)
前回書いた学習によって決定された評価パラメタの値を使用して、局面の評価が行われる。
これを実行するのは、evaluate()である。この関数は、引数で指定された手番(turn)側から見た評価値を返す。手番側が有利であればプラス、不利ならマイナスになる。
評価する項目は、
- 駒割(駒の損得)
- 駒の位置関係
の二種類だけである。
この二つの項目間の重み付けは、FV_SCALE(=32)で与えられる。FV_SCALEは固定値であり、ゲームの進行等によって変化することはない。
評価値 = 駒割 + 駒の位置関係 / FV_SCALE
駒割は、駒の種類ごとに与えられる価値(これは評価パラメタ)に、敵味方の駒の数の差を掛けたものを、全ての駒の種類で合計した値である。駒が盤上にあるか、持駒であるかは関係ない。
学習時にパラメタの初期化を指定した場合は、以下の値に初期化されて学習を開始する。
歩 | 100 |
香 | 300 |
桂 | 300 |
銀 | 400 |
金 | 500 |
角 | 600 |
飛 | 700 |
と | 400 |
成香 | 400 |
成桂 | 400 |
成銀 | 500 |
馬 | 800 |
龍 | 1000 |
(* 私は、と、成香、成桂、成銀、金の価値を同じにしていない理由が未だわかっていない。成駒を相手に取られるときには、成駒の価値+元の駒の価値だけ変化させているのだから)
駒割は、evaluate()の呼び出し毎に実際に計算するわけではなく、一手を指して局面が進行(MakeMove())する時点で値を更新している。