将棋ベーシック改の仕様書を書くか迷っているから

 書き始めるか。

 先のブログ記事で将棋ソフトをIF~ELSEの塊であると考える人は多いと書いた。では、そうでないなら何なのかの前に、IF~ELSEで書いてみたことがあるかというと、これは考える段階で将棋には無数の手があるのでIFの列挙が事実上終わらないということが分かり切って他の作戦を考えて実装している。

 どうするかというと、局面を81マスのメモリBASICのCHAR型81個の配列として、空きマスから先手歩香桂銀金王飛角後手同じく歩から角に背番号を振って表現している。こういう風にコンピュータにまず盤面をメモリで覚えさせる。

 次にメモリ上の盤面を合法手で動かすことを考える。81マスは配列としては直線であるから、歩を突くとなると一段繰り上がりメモリ上では9キャラ分前に移動することとなる。それを盤面の外に出ていないか、相手の駒を取る手か、自分の駒なら進めないというルールに従って、IF~ELSEではじいたものが「合法手」である。

 この厄介な合法手生成は多くチェスソフトから改造したと言われているが、将棋ベーシックではIF~ELSEで愚直に書いた。それから6年の歳月を経て、CHAR配列から駒の有無だけを1ビットで表現した81ビットのビットボードを使い、試行錯誤の結果として飛車角以外はチェスプログラムとほぼ合意かまたは将棋ベーシック改がやや縮めるくらいまで来た。

 そうして、ある局面から合法手が全て求まると、メモリ上で自己対局が可能となる。モンテカルロ法というのは指し手を決めるときに事前に乱数を使って乱数手対乱数手のゲーム内ゲームを行い、勝った指し手を求めてから、遡って勝ちにつながった現局面からの1手を指すというものである。

 対して、将棋ベーシック改は乱数を使わず、全合法手を1手進め、1手先からまた1手の合法手つまり相手の手を進め、さらに1手の合法手を試し、その三手の自己対局の結果として、三手では勝敗が決まらないので、メモリ上の駒に得点を与え、合算して相手の合算と差し引きで駒を得したかという評価値を算出する。

 三手先の評価値が求まったら、1手巻き戻して、次の合法手を進める。これを全合法手に対して行い、三手先で駒を最も得した手。マイナスの最大値から、三手進めて評価値が上回っていたら、それを最善手として手順をメモリして、超えたら上書きする。

 この処理は再帰処理とかネストと呼ばれる入れ子の処理なので、ここまで出来たら三手でも五手でも七手でも15手でも同じプログラムの1行のチューニングで片付くのだが、7手くらいからとてもじゃないが自己対局の結果を待てないほど長くなる。

 機械学習界隈では、それでも事前に長手数を読ませて、結果をメモリして対局時には自己対局ではなくメモリから指し手を引く。学習と探索は入れ子になって、長手数読ませたての方が強いなら、長手数から算出したメモリから候補を引いてさらに先を読ませるということも出来る。

 ここまで分かると、残念なことに古くからあるコンピュータ将棋はこれらの考え方をみな踏襲しており、俺が分かるまで色々の将棋開発者の方が見守って下さったということ。

 やねうら王は将棋を駒得でいかに長手数よませるか「だけ」で決着するという論理に基づき、探索部の高速化とマシンスペックの向上の両輪で駒得だけを計算するプログラムらしい。だが、俺は家庭用のシンクパッドやマックブックや富士通ノートを使ってきているので、長手数は譲って評価関数の複雑化も実験してみて、強くはなった。

 今でもコンピュータ将棋について考えるときは考えるが、長手数を読ませてメモリしてまた長手数読ませる反復深化に特化したものでめちゃめちゃ強いらしく、まだ自己対局1局分しかプログラミング出来ていないのは出遅れも感じている。原理は同じだが、その原理から演繹的に求めるところがまだまだなのだろう。

 まあ、優勝者でも無いのに解説文とは小生意気に思われるごく一部の人しか読まないのではという気もするけれど、IF~ELSEと将棋AIはどう違うの?というところの答えにはなったのではないでしょうか。


🄫1999-2023 id:karmen