評価関数・評価値とは

シェアする

  • このエントリーをはてなブックマークに追加

昨日、第一期将棋叡王戦が終わりましたね。

私は大阪出身であり、ニコ生であまり見られない関西棋士の山崎八段を応援していたので結果には大満足でした。

ただ、フルセット見たいという気持ちもありましたが。(ソフトvsタイトルホルダーは、もしソフト2勝となると気持ち的に微妙なので、まだ実現しなくてもいいかな、という気持ちでした)

決勝三番勝負は2局ともponanza評価値が大きく動く熱い終盤で楽しかったです。

ところで、叡王戦(やコンピュータ将棋の大会、最近の竜王戦ニコ生など)で表示される「評価値」とは何でしょうか。

今日はソフトの思考方法の要である評価値について書こうと思います。(と思ったものの、今日の内容だけでは終わりません)

ソフトは数字しか判断できない

将棋の上手な人が将棋を指す時には、駒の損得に加えて玉形(玉周辺の状態)や駒の働き(飛車や角は広く利いているか、遊び駒はないか、など)、隙の有無や詰ましにくさなど、さまざまなことを考えています。

しかし、コンピュータプログラムに局面を渡して「この形はバランスが取れている」とか「この銀が仕事していない」とかを判断させるのは難しいです。

コンピュータプログラムは、数値計算は非常に得意ですが、数値計算しかできません。

そこで、局面から「有利さを表す数値」を計算するための計算式を作ります。この計算式が「評価関数」であり、ある局面を渡したときの評価関数の値が「評価値」です。

数学っぽく言うと、評価関数は、定義域を全局面の集合、値域を有限の整数値とする写像です。ちなみに、局面には盤面、先後それぞれの持ち駒、現在の手番、が含まれます。

しかし、将棋の局面から「有利さ」を計算する完璧な数式など存在しません。存在すれば、何十年あってもコンピュータで計算できません。

ですので、第一線で活躍する将棋プログラマは「正確かつ高速な評価関数を作ること」が第一の目標なわけです。

その方法には、Bonanzaの「Bonanzaメソッド」や技巧の「Bishop Learning」など、様々なものがあります。ベースとなっているのは「最急降下法」や「確率的勾配降下法」という学習方法です。

先読みして最善手を探す

例えば、駒の損得のみを評価する評価関数を作ったとしましょう。歩は100、香車は300、桂馬は400、銀は600、金は700、角は900、飛車は1000などとして、得している駒をプラス、損している駒をマイナスとして計算するのです。

評価値は「先手から見た評価値」を考えます。互角なら0点です。後手から見た評価は、評価値をマイナス1倍して考えます。

では、「先手は、全部の合法手(ルールに違反しない指し手)の中から、次の局面の評価値を最大にする手を指す」というソフトで、以下の局面を考えてみましょう。(盤面画像生成にはhttp://shogipic.jp/を利用しました)

後手が飛車を追い返そうと、交換した歩を打った局面。

符号を並べると、初期配置から▲2六歩△8四歩▲2五歩△8五歩▲7八金△3二金▲2四歩△同歩▲同飛△2三歩となった局面です。相掛かりの基本的な出だしで、叡王戦第1局そのままです。

このとき、普通は「次に飛車を取れる位置に歩を打たれたが、とられるわけにはいかない。しかしこの歩を飛車で取ると相手に金で飛車を取られてしまい、歩と飛車の交換で先手大損だ。いったん飛車を下まで引いて逃げるか」と考えて▲2八飛などとします。

しかし、「手を指した局面での評価値(駒得のみ判断)を最大にする」という思考だと、この歩を取ってしまうかもしれません。この瞬間、先手+100です。

もちろんそんなことをすると次に金で飛車を取られて、先手-900となります。大悪手です。

したがって、「直後だけ見るのではなく、次の相手の行動も考えて手を選ぶ必要がある」ということになります。

このとき、勝ちたいソフトや人間は、「先手なら評価値を上げるような手を指し、後手なら評価値を下げるような手を指す」と考えることができます。

したがって、例えば「先手は評価値を上げようとし、後手は評価値を下げようとしたとき、互いに最善手を指し続けたときに5手先の局面で評価値が最大になるような手」を選ぶようにすることが考えられます。

このような考え方は、ゲーム木探索における「ミニマックス法(Mini-Max法)」と呼ばれます。「先手番では評価値が最大(Maximum)になる手を、後手番なら評価値が最小(Minimum)になる手を選ぶことを交互に繰り返す」からです。

ミニマックス法については図や擬似コードを使って解説する必要がありますが、ちょっと今日は面倒なので後日に回します。

ちなみにプログラミングコンテストのAtCoder Beginner Contest 025のC問題でミニマックス法の問題が出ました。問題:双子と○×ゲーム 解説:ABC025解説

ただし、ミニマックス法は無駄な計算が非常に多くなるので、持ち時間内でたくさんの局面を読まないといけないゲームでは、無駄を省く高速化が常に求められます。これが将棋プログラマの第二の目標です。

以上のように、将棋(あるいは他の完全情報ゲーム)プログラマは常に「正確かつ高速な評価関数の作成」と「探索の高速化」を目標に考え続けているのです。

続きは次回。とりあえず探索について簡単に書いてから、具体的な評価値の内容について書きたいです。書けるかな。

スポンサーリンク
レクタングル(大)
レクタングル(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする