読者です 読者をやめる 読者になる 読者になる

TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

アタリから逃げる手

前回の囲碁プログラムにノード選択とプレイアウト時にアタリから逃げる手が選ばれやすくなるように修正を行った。

ランダムプレイアウトとの対戦とGnuGoとの対戦では勝率が上がったが、自分で対戦してみると簡単にシチョウにはまるので弱くなったと感じる。

理由はアタリから逃げた後の1手のみで死活を判断しているからだ。
シチョウを回避するには数手先まで読む必要がある。

探索時にボードを元に戻す必要があるが、1手ごとにコピーしては処理に時間がかかりそうなので、
手を戻せるように検討が必要そうだ。
探索時に石を取る処理が入ると元に戻す処理が複雑になるが、石を取った場合はその時点で死活の判断を打ち切るようにすれば、あまり複雑にはならなそうなので次に実装してみることにする。

AlphaGoでもシチョウはSLポリシーネットワークとバリューネットワークの特徴に含まれているので、囲碁プログラムにおいてシチョウの探索は避けて通れないのだと思う。


アタリから逃げる手として、はじめ呼吸点が1つの場所のみを候補にしていたが、
それだけではかえって弱くなってしまった。
相手の石を取って助ける手も候補に含める必要があった。

相手の石を取って助ける手の場所を探すには、アタリになっている連に隣接する相手の連を調べる必要があるので、
連の構成要素に隣接する相手の連を加えるようにした。

処理を加えたことで1.38倍ほど遅くなってしまったが、
ビットボードの処理をチューニングして元の速度以上で処理できるようにできた。

コンパイラオプションで速度が変わるかも試してみたが、
拡張命令の有効化は効果がなかった。浮動小数をほとんど使ってないので当然か。
効果があったのは、C++例外を使用しないオプション。
5%程改善した。


現在のところ、19路の1手目、10000プレイアウト、Core i7-3770で1.2秒で処理できている。


github.com