昨晩あたりから強くなるなら何でも出来ることからしてみようと触りだした。
まずビットボードを試してみたが早く結果が欲しくて改変を急いだらバグが出た。
昨晩は晩飯にビールを飲んだ後もいじっていて、バグの原因が分からず巻き戻し。
実装してみて、バグるものの速くなった感はあった。ただそのままだと先の改変が難儀になる。ビットボード自体は速いのだが、盤面に変更がかかるたびボードを更新する処理をすべてビットボードも更新せねばならないので、全体的な改変になる。
そのため、まずは将棋盤が0〜80なのか1〜81なのか、VBで画面を作るときに何も考えずボタン1〜81を作ってメモリは0〜80でプログラム中に1を足したり引いたりしながら作り進めていたが、本当にクリティカルなボタン名(修正に手間がかかる)以外は0〜80とした。
そうして整理すると駒利きの簡単な改良を加えやすくなり、評価関数もいじって強くなった。
ビットボードは巻き戻した。対局でない以上は持ち時間は自分が待てばよい。結果を良くして結果が良いなら最後に加速を考える。まずはビットボードの前に盤面から駒を探すループの戦闘で空きなら次というループを入れた。今までは「自駒か」「敵駒か」「次」だったのが「空き地か」それから駒が見つかると「自駒か」「敵駒か」にしたので、ビットボードを再構築したら「空き地か」の処理がすっ飛ぶことになる。
ビットボードには空き地をすっ飛ばすだけでなく、自ターンは自駒、相手ターンは相手駒だけサーチするので81マスループ中上手くいくと54マス分の空ループをすっ飛ばす。
だが、指し手には影響しない。それでもそうしたほうが良いのは対局が持ち時間切れ負けであるから、同じ読みなら短い時間で、同じ時間ならより深い探索を可能とするからだ。
次はInt64をふたつつないだ0/1でのビットボードでなく、クラスを使ってビットボードを設計する予定だ。クラス化しておくことで、まずは平易に作って効果を検証してから後に実装部分を改良する作業を切り分けることが出来る。
まだまだ、将棋ベーシック改のコードはスパゲッティモジュールである。プログラムコードを文字列ではなく電線に例えると、テレビの裏とビデオデッキとか電源コンセントのタコ足みたいに美しくなくがんじがらめに絡まっている様相を思い描くのでそう呼ぶ。
あと忘れてはいけないのでメモし直すと不成の処理がすっ飛んでいる。ここもスパゲッティ。
昨晩から今日の15時くらいまでに今までは何だったのと思うくらい仕事がはかどった。
だが評価関数の複雑化は微妙な思考時間の増加を生んでいて、このままでは上位互換的に強くなったとは言えない。ビットボードも完成させて、同じ時間でより良い手になるか、ならないか。そこんとこだと思う。
既にコンピュータの読み筋は自分の思考を超えているので、読ませてみて「どんな手を指すか」は完全な御神託と化している。それでも負け筋は分かっているので、それにならないように序盤は「こう指せ」と評価関数をいじるのだが、それが余計な仕事な気もする。
電竜戦にはサラリーマンをしながら休暇をつぶして参加している方もいる。俺も以前はそんな感じでゲーム開発など趣味でしていたけど、今はこの没頭できる環境を用意してくれている家族をはじめとする皆様に感謝をしています。
そんなカッコいいこと言ってもね、たぶん1週間も経ったらまたゲーム機とかで遊ぶんだよ。