TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

【囲碁プログラム】 シチョウの判定

前回のプログラムにシチョウの判定を入れてみた。

シチョウを判定するには、アタリを助けた後の呼吸点が2の場合、数手先まで読んで呼吸点が1になるか、3以上になるか確認する必要がある。

数手先まで読む際、ボードのコピーを行うと処理時間がかかるので、手を戻せるようにする。
連の状態を元に戻すのは複雑になるので、シチョウの判定中は連の管理は行わないようにした。
シチョウから逃げている間にできた連を取るような手は、シチョウに関係ない手なので連の状態を管理しなくても問題ない。

シチョウ判定をプレイアウトで行うと処理時間への影響が大きいので、UCTのノードの選択時のみとした。
ノードを展開した時点で各ノードのシチョウ判定をして、その結果をノードに覚えさせておき、プレイアウトのたびに判定しないようにした。
19路の1手目、10000回のプレイアウトでは処理時間への影響はまったくなかった。
展開したノードでシチョウが現れる局面は1つも作られていなかったので、
対局中にシチョウになる局面に遭遇しない限り影響はなさそうだ。

バグ取りに苦労したが、シチョウになるパターンとならないパターンでテストして、下図のようなパターンでもちゃんとシチョウから逃げられると判断できるようになった。

f:id:TadaoYamaoka:20160430121858p:plain


ランダムプレイアウトとの対戦では勝利が上がるようになったが、GnuGoとの対戦では勝率は変わっていない。
アタリを助ける手以外の手の質も向上させないと勝率には結びつかないようである。

次は、AlphaGoのrollout policyと同様のパターンの適用を行ってみるつもり。

github.com