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

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

2013年06月17日

オセロゲームを作る!終盤の全読みロジックその2

 やっと20万~30万手くらいのデータがたまった。

 週に1回ペースでディスククラッシュが続き、週に2回くらいしかバックアップを取っていなかったので何度も3,4日前の状態にもどって全然進まず。

 3年近く使い続けたPCなので寿命とみてHDDを交換したら壊れないは劇的に速くなるはディスク容量は倍(1TB)になるはでいいことばかり。

ほかのオセロソフトとの対戦ではとりあえず20手目くらいまではDB内の棋譜データに沿った打ち方ができるが、それ以降はDBにない状態に。

中盤ロジックは適当なので、その状態になると大負けに。

同じ手を打つようなソフトだと何度か対戦するうちにデータベースに棋譜データがためって勝てるけどデータ不足。

解析の進捗が想定以上にスローペースなので終盤の全読みロジックを見直すことに。

1000回くらいの平均をとると最終11手読みで30秒くらい、12手読みで1分強、13手読みで3分~4分。

4コアのPCなので4つ同時に動かしても1日2000件~3000件しか進まず。

全読みロジックでは相手の手で現在の最良手より良い手を出した場合検索を中断するようにしている。

しかし、おぼろげな記憶では30年前に作った時は自分の手で現在の最良手より悪い手を出した時も中断していたような気がするので真面目に検討してみた。

結論から言うと中断して問題なかった。中断するロジックとしないロジックで何パターンも比較したが結果は同じになった。

そのロジックを入れると劇的に速くなった。2手分ほど同じ時間で余分に読めるようになった。

まだ数十回しかやっていながだいたい、最終13手読みで1分弱、14手で1分~2分、15手で3分くらい。

ただ中断ロジックがまったく効かないパターンだと15手で10分かかった場合も。

中断ロジックを効率的に使うために最初の探索は最適手で打つ必要がある。

とりあえず中盤戦用の盤面ポイントのロジックでいい順に打つようになったらかなりの確率で最適手を最初に打てるようになった。

いいかげんな盤面ポイントなのではずれることも多いけど。

結局は中盤ロジックもきっちり作らないとだめかもしれない。

本棚から昔買ったオライリーの「アルゴリズムクイックリファレンス」という本が出てきたので読んでみた。

いまやっている終盤ロジックはミニマックス法と言って、相手の時も自分のときも中断していいと書いてあった。

ミニマックス法よりプログラムがすっきりして効率的なNegMax法というのがあるらしい。

が、自分のソースコードをNegMax法に置き換えるとMiniMax法より複雑になりそうな感じ。なんか作りが間違っているのかも。

色々載ってて真面目に全部読めばいいことがあるかも。

オライリーサイトにはPDF版もあった。Kindleで持ち運べていいかも。


プログラミング
オセロ