レベル10を追加するためにやったこと
オセロレベル10を追加するにあたって、地味に色々大変だったのでここに記しておきます。
やったことをまとめると次のようになります。
- 既存のオセロのコードをリファクタ(機能をそのままに運用しやすいコードに書き換える)
- オセロの演算部分(石を置ける場所や石をひっくり返す処理)をビットボードに変更
- モンテカルロ木探索での思考部分の調整
1. コードのリファクタ
従来のオセロのコードが素人時代に突貫で書いたものなので書き換えが難しく、実現するためにテストコードを追加し、振る舞いが変化しないようにチェックしながら書き換えを進めました。
2. 盤面のビットボード化
続いて、2. オセロの演算部分の変更です。
オセロの盤面は 8×8
の 64マス で構成されています。
64bit、つまり8バイトの変数を使うことで、自分の石の位置、相手の石の位置を2個の変数で盤面を表現することができます。
|
|
みたいなデータで石がある位置を表現すると、石を置ける場所とかひっくり返す処理がビット演算だけでめっちゃ高速に書けます。
ただし、このオセロは JavaScript で書かれていて、 64bit をそのまま盤面として表現することが難しく、32bit 変数を2つ使って、一つの盤面を表す方法を採用しました。
具体的には、盤面の上側を x
, 盤面の下側を y
とし、 (x, y)
の組で盤面全体を表すという感じです。
この記事には大変お世話になりました。
ビットボード化が一番時間がかかりました。 普通に配列で書いていた計算部分を全部置き換えることができ、高速化できました。
3. モンテカルロ木探索の調整
あとは、3. モンテカルロ木探索の調整です。
CPU同士自己対戦して強さを調べたり、弱いながらも自分で軽く打ってみてどのくらい強いか調べたりしました。
作成途中、何回やっても弱いはずの自分が勝ってしまい、「いや、接待せんでええから」と突っ込みながらバグを直したりもしました。
レベル9とレベル10の自己対戦だとレベル10が毎回勝つので、そこそこ手応えはあります。
もうちょい、改善点としては、プレイアウトの評価関数で確定石の判定を入れたいです。
おそらく、これを入れると「筋の良いプレイアウト」をできるようになり、より強くなると考えられます。