評価関数
将棋に置いての評価関数
評価関数とは
「評価関数」とは、読んで字の通り、評価する関数である。
何を評価するのかと言うと、ゲームの場合、「現在の局面が有利か不利かを数値にして比較が出来るように評価する」ことが目標となる。評価関数がもしも素晴らしい出来で、その局面が勝ちか負けかを正確に返してくるなら、1手先読みして、そこでの局面を評価関数にかけることで、完璧なプレイをするプログラムが作れる。
もちろん、そんなすばらしい評価関数は(簡単なゲームならばともかく)、将棋のような複雑なゲームでは作成できないか、作成が著しく困難である。
ただし、9章で作成する「詰め将棋ルーチン」を呼び出して「詰む」ようなときは話は別で、この場合は勝ちか負けかがはっきり分かる。
一般的に、二人零和完全情報ゲームのプログラムは、「評価関数」と「先読み」からできている。何手、あるいは何十手か先を読んで、相手がどう応じてもいちばん有利になるような手を探してその手を指す、というのが基本的なプログラムの仕組みになる(「先読み」の仕組みについては、4章で解説する)。
ここで、もしも評価関数が局面の評価…有利不利を間違えるようなら、プログラムはその間違った有利不利に基づいて動くことになってしまう。従って、思考ゲームプログラミングでは、評価関数が非常に重要になる。
評価関数を作成するには、局面の有利不利を決める要素…将棋ならば、「駒得か駒損か」「玉の守りの堅さはどうか」「攻めているか」などのいろいろな要素をそれぞれ評価して、足し算で足し合わせるなり、掛け算(は扱いが難しいが)で掛け合わせるなどの方法が考えられる。そして、より局面を正確に評価する関数=より多くの要素を正確に反映した評価関数ほど、性能が良い関数になると考えられる。
しかし、一方で、将棋のようなゲームでは、深く先を読むことが重要になる。あまりに複雑で、計算に時間がかかる評価関数を作ってしまうと、先読みが浅くなって、単純な評価関数で深く読むプログラムよりもかえって弱くなってしまうことすら考えられる。結局、ここでもバランスを取ることが必要になってくる。
それでは、将棋の局面の評価関数を作り始めてみよう。最初は簡単に…そして、徐々に複雑に。