囲碁のルールについてのメモ

 Miacisをコンピュータ囲碁にも対応させようかと思って調べてみているが、意外と詰まるところが多そうだ。やっぱりあまり知らないゲームの実装は難しい。とりあえずここまでの考えをメモしておく。

プロトコル

 基本的にはGo Text Protocolに対応していれば良いのだろうか。

 まだちゃんと把握しているわけではないが、ボードサイズを可変にできるようにしないといけないとしたら少し実装を考えないといけないかもしれない。

ルール

 ルールがとにかく大変。プログラム的に実装しやすいのは中国ルールだと聞いたことがある気がするので「囲碁 中国ルール」などで調べてみたが、それでも問題が全くないわけではなさそう。

 というかそもそも終局判定が難しく、「パスが2回続いたら終了」が基本路線になるのだろうか。ただ気になるのは、自分の眼を潰すような手もルール上非合法手ではないとしたら、「パス = 合法手0」ではなくなる。自分の眼に打つと二眼がなくなるので相手に取られるようになり、でも相手もまたいずれ二眼を自ら潰すので……ということで合法手からランダムに選択するエージェント同士では何手やっていても合法手が0にならなさそう。

 コンピュータ将棋が基本的に歩とか香車の不成を生成しないのと同じようなノリで自分の眼には打つ手は生成しないということにするのだろうか。そうなると合法手生成自体にいくらか思考が混じっているような感じがして少し心地悪い感じがある。実際に自分の眼に打つことがときに有効手となったりしないのかどうか、囲碁に詳しくないのでさっぱりわからない。

 とりあえず

  1. 自分の眼には置かないという条件で合法手生成をして、その合法手が0だった場合のみにパスをする
  2. パスが連続したら終局とし、中国ルールで勝敗を計算する

という基準でなら想像する限りなんとかなりそうではある。当面はこれを実装予定。

 余談だが、仮にこれが正しいとすると、合法手がなくなるまで打つエージェント同士の対局の最後は、自分の陣地に打ち合うようなあまり勝敗に影響しない手が多くなりそうではある。AlphaZeroが自己対局において勝率予測95%だかなんだかで投了(自己対局の5%では予測が合っているか確認するために最後まで打つ)みたいな処理をしていたのはそういう理由があったからなのかなと思ったりした。将棋では入玉形にでもならない限り正直そういうことをする意義があまりない気がする(実際にMiacisでは簡単な詰み探索を入れつつ最後まで指すようにしている)。

 さらに余談。全くのゼロから強化学習をすることを想定すると、「合法手からランダムに選択するエージェント同士の対局が終わらない」ようなゲームは鬼門だったりするんだろうか。適当な手数で打ち切るとしても、途中局面での勝敗が決定できないとするとまともな報酬を得るのが難しそう。報酬が疎であるような環境の一種と言えばそれだけのことではあるのかもしれないが。