ヴァルヘルのソフト開発日記

動画管理や録画予約、本の発売予定などの便利ツールの開発状況のお知らせ

2013年09月23日

オセロゲームを作る!盤面を評価する

 終盤全読みは、コーディングの無駄を省いてさらに1手ほど深く読めるようになった。

また、勝つか負けるかだけ読むようにして、いまのところ19手先・・・42手目からは完全読みするようにできた。

しかし、この19手読みは速いときは1分かからないけど読み間違えると十数分・・・ひどいときは1時間くらいかかってしまう場合がある。

最速で先読みするには、正解の手を最初から最後まで打たないといけない。

正解の手を打つには今の盤面を評価するしかない。

盤面評価ロジックを考えるのがめんどくさいのでDBに定石データをためる方式にしたのに、結局やらなくては先に進めないというジレンマ・・・。

とりあえず図書館にオセロの本があったので借りて、どんな盤面がいいのか勉強をしてみる。

(なぜか本屋にはオセロの本がまったくなかった)

よいと言われる形

オセロの良い形

エッジの部分の形で「山」と「囲み」

悪いと言われる形

オセロの悪い形

これもエッジの部分。「ウィング」とかいうらしい。

どっちつかず

オセロの双方C型

白・黒どちらが有利かわからないらしい。

これらや角の石、Xの石(角の斜め隣)のパターンの出現回数を数えて得点計算する。

ほかに確定石の数、石の全部の数、打てる手数、開放度を数える。

打てる手数は、その盤面で白・黒両方を計算。

厳密にはどちらかが打つと手数がわかるけど、通常はそんなに増えたり減ったりしないので誤差とする。

開放度は石が空きマスに接している数らしい。少ないほうが良い。

ほかに空きマスが奇数のエリアが偶数箇所のほうが有利という話も本にあったが、とりあえず空きマスを数えるのが面倒なので保留。

これらを得点化する重み計算を回帰分析で計算してみる。

回答は最終的な石差。プラスなら勝ち、マイナスなら負け。

DBから20万~40万手くらい取りだしてEXCELで計算してみた。ただEXCELの制限で変数は16個しか使わせてくれなかった。

有利・不利なパターンを30パターンくらいピックアップしたが足りないのでまとめることにする。

また白・黒わけなくてもよさそうなものは合算して編巣を減らした。

(確定石の数は白マイナス黒とか・・・結果的に白と黒は同じものは全部引き算してもよさそうだった)

49手目の回帰分析

オセロの回帰分析49手目

E1Wとかが白のエッジの形、C1は角。係数がプラスになっているのはいい手、マイナスは悪い手。

自分の点数はプラス、相手はマイナスにしているので重みは同じ符号になっている。

角の重みが低いのは盤面を解析するのに90°ずつ回転させ、さらに鏡面反転させているので1コマ角にあると2回かぞえられてしまうから、実際は2倍の重みになる。

コマ数はマイナスになっているので49手目でも自分の駒が多いと悪いらしい。

R2は0.75。

41手目の回帰分析

オセロの回帰分析41手目

R2は0.56・・・ギリギリ使える?

41手目では全読みさせていないので、データ精度が悪い。

ここで出た係数をプログラムに組み込み1手目が正解になるか検証してみたが、ならない・・・。

5番目以内には最良手がくるから、適当にやっていたときよりはましだけど、全読み改善にはあまりつながらない・・・。

EXCELだと変数に16個制限があるしデータサンプルも100万行の制限があるので、とりあえず自前で回帰分析するか・・・。


プログラミング
オセロ