ひよこカルロメソッドII

ひよこカルロ将棋v0.18で序盤をどうやって改善したのか、少しメモを残しておきます。


・ひよこカルロメソッドIIとは?


まず、駒と駒がぶつからないシミュレーションはシミュレーションとして現実性がないので、意味がないと思いました。ここで、普通はプロ棋士棋譜などから指し手の統計をとって、実際に指されやすい指し手というものを調べて、その確率的な分布に従って指し手を選ぶという方法が普通の研究態度なのですが、そんなことはやっていると何ヶ月もかかりそうだったので今回は採用しませんでした。


結局、駒と駒がぶつかりあえばいいということで、成駒は敵玉のほうに寄せる手に加点したり、攻めの銀を敵玉のほうに運ぶ点を加点したり、まあ、そんな感じで加点、加点と加点しまくりました。

あと、ただで取られるような指し手も減点しなくてはならないのですが、これがそう容易ではなく、一番簡単な実装は以下に書く方法だと思うので、真似たい人は真似てください。


1) その指し手で1手進める。
2) capture(捕獲)する手をすべて生成してSEEが最大のものを調べる
3) 局面を1)に戻す
4) その指し手の価値 = 捕獲する駒があるならその交換値 + 成るなら成りによる価値の上昇値 - 2)の値 + 指し手への加点(成駒を敵玉のほうへ寄せる手etc..) + RandN(16)
5) 4)の指し手の価値が最大の指し手を選択

とまあ、これがすべてです。

RandN(16)は0から15までの乱数を発生させるの意味です。4bit乱数にしているのは乱数を発生させるコストもただじゃないので32bitの乱数をMT(Mersenne twister)で発生させて、それをちびちび使うからです。

それで、4)のようにすれば、同じ価値の指し手があっても乱数で加点されるのでランダムに指し手が選ばれますし、また、一番大きな評価値のものが100で、その次が30というように、いくぶん1番目と2番目が離れている場合は、一番大きな評価値のものが採用されます。

5)の過程でソートする必要もありませんし、また、2)を見ているのでタダ取られする変化に飛び込むこともありませんし、そこそこ小さな計算量で計算できるなかなか優れたシミュレーションだと思います。

このときに使う乱数の幅を変えることによりシミュレーションの性質を変化させることが出来ます。

あと、序盤で香を上げる手とか、角を4段目以上に移動させる手とか、金を角の移動範囲に移動させる手とか、その手の、まあそんな手指さないだろうというような手は適当に減点させることにより、シミュレーションの精度を上げることが出来ます。

その昔、谷川先生と羽生さんのタイトル戦で盤上で駒が前進(敵陣に向かう)しなかった指し手がない対局があったと思いますが、結局、短手数でplayoutに持って行こうと思えば、駒を前進させてぶつけあって、それで決着をつけるのがそこそこ良いシミュレーションなのかなぁと思います。