オセロ
久しぶりに何か作りたくなったので、C言語でコーンソールオセロゲームを作成。AlphaZeroにあやかりAlphaOthelloと命名。
似非UIは昔作った将棋プログラムのソースを流用。
とりあえず、ルールを実装。将棋とは違って左上基準で横にabc…fgh、縦に123…678とカウント。a1からh8までの64マス。左上基準だと、二重配列にした盤面へのアクセスがシンプルで助かる。将棋は右上基準なので変換に苦労した記憶が。
さらに配列アクセスが楽になるよう、壁も盤面に加えて10×10の盤面に。
一人でも遊べるようにコンピュータとの対戦を可能に。
将棋もだが、オセロはもっと初心者なので定石がわからない。そこで、深く考えずにモンテカルロ法を採用。要はランダムに打った手の中で一番勝率の高いものを選択するだけ。長所は、そこそこな手が打てること。短所は、相手が最善手を選び続けるとあっさり負ける。
完全解析され後手必勝が証明されている4×4のオセロをモンテカルロ法で自己対局したところ、以下のように先手が勝ちになった。だめだこりゃ。
白白白黒
白白黒黒
白白黒黒
黒黒黒黒
将棋でも試しにモンテカルロ法を採用してみたら、とんでもない手ばかり指すした。プロは本当に有力な手を見抜く能力が高いからこそ、強いのかもしれない。
本当は最善手候補を絞ってからモンテカルロ法をしてもよいのだが、最善手を絞る方法が思いつかなかったのであきらめる。
時間があるときに評価関数でも組み込もう。個人的には探索して評価するのが腑に落ちないのだけれど。その瞬間の盤面のみで評価できないものだろうか。探索した結果を今の盤面の状態が内包していると思うのだけれど。
さて、とりあえず、完成したので対局してみる。私は素人なので、強い相手を探す。
最初以下のサイトと対局しようとしたが、時々サイトが反応しないので中止する。
そして以下のサイトと対局。
こちらは可能な手1手につき20000回のランダム対局した勝率(勝ち+引き分け)から手を選択。約90秒。それに対して相手は最も強くしても瞬時。
結果、+8石負け。
最初は接戦だったが角を取られたあたりから雲行きが怪しくなってしまった。終盤、最後の抵抗を試みるも逆転できず終了。こちらの手の選択肢を狭めてくるのがうまい。
以下、棋譜。
先手(黒):AlphaOthello
後手(白):オセロサイト
c4e3f6e6f2c5c6d3c3d2d6e2f1e1d1f5f3b4b3f4g5g4g3g6h6b5a3a4a5h4h3h2g2h1g1h5c1c2h7g7b1b2a6a7a1a2b6c7a8e7d7c8g8h8f7b7e8f8b8d8
全然関係ないが、はたらく細胞というアニメが面白かった。ほのぼのしたタイトルに似合わず、血しぶき舞い散る超展開。主人公の赤血球(この時点で面白い)の特徴のある声が、花澤香菜さんかな、と思ったら、やっぱりそうだった。