コンピュータ将棋開発の思い出を振り返ってみた。

「コンピュータ将棋 Advent Calendar 2016」のトップバッターの平岡です。よろしくお願いします!
「コンピュータ将棋 Advent Calendar 2016へのリンクはこちら。
http://www.adventar.org/calendars/1457



コンピュータ将棋を初めて6年弱になるので、色々とダラダラ振り返っていこうと思う。



僕がコンピュータ将棋を始めたきっかけから。
2008年に大学卒業して会社に入り、しばらくして、お仕事でプログラミングする事になったので、Cの勉強してた。
ちょうどBonanzaソースコードが公開されたのでCの勉強がてらBonanzaを読んでいた。
GUIのアプリとか作れる気がしなかったし、Bonanzaは複雑だけれど、コマンドラインのアプリとして丁度よかった。
C++ではなくCだったのも、当時は読む為の心理的障壁が少なくて良かった。
仕事で良く読んでいた、H.264 reference software の JM (http://iphome.hhi.de/suehring/tml/) に比べれば大抵のプログラムのソースコードは綺麗で読みやすい。
ぼんやりコンピュータ将棋は面白そうだと思いつつ、いきなりは難しそうなので練習でオセロのプログラムを作ったりした。
その後C++を勉強し、ようやくAperyの開発を始めたのが2011年の1月。
今思えばいきなりコンピュータ将棋を始めても良かった気もするが、
Aperyが最初からそこまで破綻したプログラムにならなかったのは、長い準備期間のお陰かも知れない。
始めたきっかけはそんな感じ。




開発ではまずはMagic Bitboardを作ろうと思い、Ponanzaの一成さんの発表していたスライドとかを参考にした。
しかしすぐに困った事に。
どうしても2九、6九の位置の飛車のマジックナンバーがランダム生成で見つからずに、一成さんの当時のブログで質問した。
するとすぐに解決策を教えて貰って感動したのを覚えている。
Aperyのコードには今もその部分が残っている。

// Magic Bitboard で利きを求める際のシフト量
// RookShiftBits[17], RookShiftBits[53] はマジックナンバーが見つからなかったため、
// シフト量を 1 つ減らす。(テーブルサイズを 2 倍にする。)
// この方法は issei_y さんに相談したところ、教えて頂いた方法。
// PEXT Bitboardを使用する際はシフト量を減らす必要が無い。
const int RookShiftBits[SquareNum] = {
    50, 51, 51, 51, 51, 51, 51, 51, 50,
#if defined HAVE_BMI2
    51, 52, 52, 52, 52, 52, 52, 52, 51,
#else
    51, 52, 52, 52, 52, 52, 52, 52, 50, // [17]: 51 -> 50
#endif
    51, 52, 52, 52, 52, 52, 52, 52, 51,
    51, 52, 52, 52, 52, 52, 52, 52, 51,
    51, 52, 52, 52, 52, 52, 52, 52, 51,
#if defined HAVE_BMI2
    51, 52, 52, 52, 52, 52, 52, 52, 51,
#else
    51, 52, 52, 52, 52, 52, 52, 52, 50, // [53]: 51 -> 50
#endif
    51, 52, 52, 52, 52, 52, 52, 52, 51,
    51, 52, 52, 52, 52, 52, 52, 52, 51,
    50, 51, 51, 51, 51, 51, 51, 51, 50
};


色々と作りながら困ったりしたけど、基本的に一人でコード書いてたのが楽しかった。
完全なる自己満足だけで作っていたが、最初に将棋所でAperyが動いた時は感動した。
当時僕はコマンドラインのプログラムしか書けなかったが、GUIに反映されて動いているのがとても楽しかった。




2012年5月に初めて世界コンピュータ将棋選手権に出場した。
コンピュータ将棋関係の多くの方々とはこの時に初めてお会い出来た。
同じ趣味を共有する楽しさ、競い合う楽しさ、将棋の楽しさが詰まっていた。
棋士の勝又さんに初めてAperyの将棋をニコ生解説してもらったのとても思い出深い。相手はSeleneだった。
この大会は、上位5ソフトが電王戦に出られるという事で、トップ層の争いも見ていてとても楽しかったし、憧れた。
この時の大会が本当に楽しかった。これがあったからこれまで大会出場し続けているのだと思う。




初めての大会の後はモチベーションも上がり、翌年には将棋電王トーナメントも始まり、楽しく開発と大会出場を続ける事が出来た。
その中で色々な経験をする事が出来て良かった。
完全にフロックだけれど選手権優勝したり、他にも電王戦に出たり、Aperyを公開して沢山の方々に使って貰ったり、
お名前オークションや学習データ生成を皆さんに手伝ってもらったり。
プログラミングのお勉強で始めたのに、結果的に沢山の方に会ったり出来たのは本当に良かった。




僕はコンピュータ将棋をかなり楽しんだ方だと思う。開発と、それ以外の色んな経験で。
楽しんだというか、楽しませて貰った面も大きい。
本当に人や運に恵まれていると感じる。
しかしそんな楽しいコンピュータ将棋だが、最近は全く開発をしていない。
ちょっと疲れてしまった。いつの間にやら30代おっさんである。
開発はやったら楽しいし、まだ評価関数も強く出来そうだし、探索も強く出来るだろうけど、まあ趣味というスタンスを崩したくないので、
やりたくて仕方なくなるまで放置が良さそう。
次の選手権はどうしようか。出るだけ出るか。う〜ん。




色々他にもやりたい事があるからバランスが難しい。
もっと能力が高ければ色々手を出しても大丈夫なんだろうけど。
他の開発者の方々では、結婚しててお子さんもいる人はなかなか開発時間が取れなくて、強くするのは大変らしい。
やっぱり開発時間は正義。みんな時間の捻出から真剣に考えている。




最近思う事として、Aperyを公開したのは本当に良かったと思う。ソフトウェアは使われてなんぼ。
コンピュータ将棋が進歩しているのが、大会後に公開されるソフトが毎回どんどん強くなっている事で、
皆さんに肌で感じて貰えたのは良いことだと思う。
最初に公開したApery電王戦FINAL版と比べて、最新版は99%くらい勝つんじゃないだろうか。(実験してないけど。)




ただ、Aperyを公開してライブラリ登録してから、大会でそれを使えば簡単に勝てるのは競技としてどうかという意見がある。
しかし新しいアイデアを試すには最新の将棋ソフトが誰でも使えた方が良い。
コンピュータ将棋の発展と大会の発展が矛盾する可能性があるのは、ある意味仕方ないが、しかしどうにか出来ないかと思った。
とりあえず公開してからは、ライブラリ使ってるソフトには負けないように頑張って開発した。
ライブラリを使う事を否定するつもりは全然ないし、僕だって昔はBonanzaライブラリを使っていたし、
ライブラリを使っている人だってそこから独自の改良をいれようと努力しているのも知っている。
だけどまあライブラリ使えば勝てるという事だけは否定したかった。独自に強くしないと勝てない事、競技として成り立つ事を示したかった。
Aperyライブラリが使えた大会は、過去に3回。
第3回将棋電王トーナメント、第26回世界コンピュータ将棋選手権、第4回将棋電王トーナメント
これら全部でAperyライブラリ使ってるソフトには負けなかったし、頑張れば勝てるし競技として成立はすると言えるんじゃないかな〜って思って貰えたら嬉しい。




コンピュータ将棋は本当に本当に楽しい。大会の放送とか見て、楽しそうって思って興味持って貰えたら最高。
プログラミングに興味持って貰えたらもっと最高。大会に出ると多分さらに最高になれるよ。
将棋に興味持って貰えても嬉しい。将棋を指す人がいるから、将棋ソフトを作るモチベーションにもなるのだ。




これからコンピュータ将棋はどんな風に強くなるのか?新しい画期的なアイデアは生まれるとしたらそれはどんななのか?
自分が今後頑張るかは分からないけれど、今後どんな進歩を遂げるかとっても楽しみ。
まだまだ強く出来る鉱脈は残っていると思うし、今からコンピュータ将棋を始めてもきっと遅くないし、楽しめる所は沢山あると思うから、
コンピュータ将棋開発をやってみるか迷っている人がいるなら、是非最初の一歩を踏み出して欲しいなと思う。