温故知新(4)

意外に続いているシリーズになってる。

今回は割と具体的に手を動かす作業。

  

Java将棋のアルゴリズム―アルゴリズムの強化手法を探る (I・O BOOKS)
 

 

実は買い置いていたのだが全く手に取っていなかった。コンピュータ将棋界のレジェンドのひとりである池さんの著書で一番新しいものを選んだ感じである。

とりあえず,ソースが出版社のサイトにあるので落としてきた。

実は随分久しぶりにJavaを触る。一番遊んだのがBD-JBD-REに書き込んでPS3で動かしていたころで,一番最近は青い本でGroovyをちょっと試したころか。

ということでJDKのインストールからである。

せっかくなので11.0.2ってのが最新らしいので入れてみる。思えば遠くに来たもんだ。

 

ソースを落としてコンパイルをしてみる。クラスパスってなんだっけ?古い記憶が適当すぎるのが分かって愉快なレベルである。

エンコードもShift-JISなのでvscodeが化ける化ける。

で,最近のJavaは色々厳密になってきてるらしくてVectorの型アノテーションJava用語で間違ってたらゴメン)が無いと叱られる。ってことで,TeやらKyokumenやらと型を明記してコンパイルを通す。

CPU対戦がやっとできたのだが,HandHashSeedの配列があふれているらしい。適当に大きくして戦ってみた。コマンドライン入力の対戦とは久しぶりである。

なぜか飛車先の歩をそのまま成らせてくれて勝てた。

CPU対CPUをやったときに非合法手で反則負けをしてたので,もしかしたらどこかに不具合があるのかもしれない。遅いマシンでは発生しなかったのだとしたらHash衝突の可能性もある。

 

本題はここから。

まず見どころは二章,合法手生成。駒の移動先・駒の種類に対して移動可否の配列を定義している。booleanである。Javaだとこういうの速いのかな?

これを筋・段・移動先の三重forループで回して生成している。うちで年末年始で作ったものはmerom686さんのコードを参考にしており似たような雰囲気である。理由は行数が少ないからだ。当然bitboardとかの方が速いだろうが長いのは嫌い。

 

他にもTeやKyokumenなどベタなネーミングのオブジェクトが満載でこれは池さんが初心者を意識して書かれたものと思われる。初期配列などもソース量が増えるにも関わらず初心者向けにベタな記述になっている。

 

六章,高速化のところではいくつかの高速化手法が理由を明記しながら説明されている。具体的な計測例などがあればうれしいが初心者向けではないか。高度な高速化に関しては読者への課題と記載されているがうさぴょん2などには実装されているのであろう。

 

七章,定跡データがバイナリファイルなのがちょっと惜しい。対戦で気になった手順などは手早く編集して対戦に戻りたいのでテキストファイルの方が扱いが良いと思う。まぁ,私がやねうら王ライブラリ勢なんだが

 

八章九章は序盤中盤の評価法。古典的なのでまぁ,そういうのもあるのかと。

十章は枝狩りの話が少し。もう少し高度な話が合っても良いかと思ってしまうが,初心者向け初心者向けと心を落ち着かせる。

十一章TTの話。30bitはやはりぶつかってそうな気がする。

十二章,CSAプロトコルの実装。今はUSIプロトコルを実装して将棋所で管理するのが主流なのでおすすめできない。当時は将棋所がまだ無かったのだろうか。

 

最終章,ここが個人的には一番面白かった。非常に残念だが引用されているサイトなどが現在閲覧不可能なものがあって惜しい。

 

最後にjava.util.Randomなどを駆使してlong(つまり64ビット)にして256Mエントリー与えてみたんだがハッシュ衝突をうまく回避できなかった。残念である。