電王トーナメントでコンピューター将棋に熱い視線が向けられる昨今、将棋の思考エンジンに興味を持つ人も多く、教育的なソースコードが求められていると思う。
このツイートが1000RTされたら、C++で1000行程度で書かれた、将棋所から思考エンジンとして使える、Bonanza6より強い将棋ソフト(やねうら王mini)を作って、そのソースコードを公開します! 1000行で書けるのかどうかは知らん…。 2、3000行になったらゴメン。
— やねうら王 (@yaneuraou) November 20, 2015
1000行というのは、短めでという程度の意味で、コメントを無理に削除して、無理に改行を詰めて1000行に収めてもそれは全く教育的ではない。そういうことは何も意味を成さない。今回の目的として「教育的な」ということが最も優先されるべき事項だ。
そこで、行数をカウントするとき、コメント行はノーカウントとする。また、enumの各定数に対しても改行を入れながらコメントを書いていきたい。しかしそれだとenumの中身は本来ならば、1行であっても複数行に渡ってしまう。こういうのを無理に1行に収めたくはない。
そんなわけで、無理に行数を詰めることはしない。コメントを削ればだいたい1000行か2000行ぐらいで収まるんじゃね?ぐらいのアバウトさで理解してもらいたい。
Bonanza6のソースコードは、空行を除くと25,863行。 最新のAperyのソースコードは、空行と//によるコメント行を除くと9,612行。 結構あるんだな…。 もしかして1,000行程度でBonanza6と同等の棋力って、結構ハードル高いのか?秘術の限りを尽くすわ…。
— やねうら王 (@yaneuraou) November 26, 2015
それより重要なのはBonanza6より強いということだ。これも「教育的」であることと同じぐらい重要なことだ。
Bonanza6より弱いソフトは、すべてうんこであると私は思っている。
…いまコンピューター将棋開発者の半数ぐらいを敵にまわしたような気もするが、ご寛容にお願いしたい。
いくら教育的なコードとは言え、やねうら王miniをうんこにはしたくないのだ。どれだけ美しくコードを書こうとも、Bonanza6の棋力にすらないなら、それは現実世界で全く通用のしない、間違った教育なのだ。私はそういう偽りの教育が大嫌いなのだ。
…などと理想を高く高く掲げるのは簡単だが、Bitboardを使った場合、テーブル初期化と指し手生成だけで500行ぐらいあるんだよな。
かと言って指し手生成にBitboardを使わないのはいまどきありえない。行数を縮めるのが今回の目的ではないのだ。ちゃんと現実世界で通用するプログラム。このあと作りこんでいけばちゃんとトップレベルのソフトに匹敵する棋力となるプログラムの作れる土台となるプログラムが必要なので、Bitboardを使わないという選択肢はない。
「速度10%ぐらい遅くなるけどこっちのほうがソースコードが短くなるのでこっちにしとこう」などというプログラムは1行も書きたくないのだ。
私としてはやねうら王miniのソースコードにそのまま書き足して、やねうら王(2016)にしたいわけだ。やねうら王(2016)にするときにソースコードがまた大改造になるのは嫌なのだ。
そこで、1000行を大幅に超えようとも、Bitboardは用いる。逆に、静止探索やSEE、1手詰・3手詰めなどはあえて書かないかも知れない。私はそれらは必須とは思っていないからである。
もちろん、並列化もいまどきYBWCなんか流行らないしな。そんなトップソフトが採用していないような並列化の手法を採用しても仕方がないと思う。最新版のStockfishのようにちゃんと書く。
とまあ、ここまでの要点として
- 行数が多くなろうとBitboardは使う
- 高速化にそこそこ真面目に取り組む
- やねうら王(2016)とある程度共通のコード
- 探索の並列化はする
- 探索の並列化にYBWCを使わない
- 強さはBonanza6以上
- それでもコメント行を除き、2000行には収めたい(収まる予定)
こういうことである。
次に、Aperyの評価関数バイナリを使おうと思っていたのだが、いくつか問題が出てきた。
まず最新のAperyの評価関数バイナリには手番が入っているので、以前のものの倍のサイズがあるということ。(1GB超え) 開発時に読み込みに時間がかかるのは嫌だ。冬場、寒くなってきたので布団に入りながらノートパソコンで開発したいのだが、このノートパソコンがメモリ1GBしか積んでいない。評価関数が読み込めないわけであるな。
あと、Piece番号の振り方がやねうら王と少し違うので、わざわざAperyの評価関数バイナリを読み込むために変換部を書くのも嫌だ。
そこで、やねうら王miniの評価関数バイナリはやねうら王のものを使うことにする。3駒関係、あまりうまく学習できたものがないのだが、まあいいや…。Bonanza6ぐらいにはなるっしょ…。(適当)
そんなわけで
- ソースコード、バイナリともにMIT License(予定)
- 搭載メモリ1GBのPCでも動く(予定)
- Visual C++2015でビルド可能(私がその環境で開発しているため)
- CPUはHaswell以降が望ましい。開発用のノートPCでも動かないと嫌なのでCPUがSSE4までサポートしていれば一応は動くようにしてあるが、それだとめちゃんこ遅い。
やねうら王miniのソースコード公開と同時ぐらいに「やねうら王miniソースコード完全解説」というのをこのブログに書く。(気が向いたら)
やねうら王miniは年内公開に向けて着々と準備中である。
>やねうら王miniを年内に公開するので、まずは鎮座して待たれよ。
鎮座しておりますが、少々足がしびれてまいりました。
そうして、なりよりこのままの姿で年を越すのだけはいやでございます。
ズボンは履いておいてくださって大丈夫ですよ?
やねうら王miniですが,学習部のコードは載せない予定でしょうか? 強さはさておき,自分で用意した棋譜から学習させたソフトというのはロマンがあり,それも開発の楽しみであると思ってるのですが.
学習部のコードはいずれはつけたいと思っていますが、年内公開の時点ではつけないと思います。いま新しい学習方法を考え中で、そのへんの成果が出れば、やねうら王miniのほうに、やねうら王(2016)からportingしてきます。
>そこで、行数をカウントするとき、コメント行はノーカウントとする。
これは!RBB&YaneLisp復活の布石でしょうか……
http://labs.yaneu.com/20090905/
いまどきの評価関数は利きを使うので利きの計算が遅いと不利になるので、(やねうら王miniも含めて)時代はApery型のBitboardのレイアウトですね。
>MIT License
という事は、商用利用を含めて、各自のコードを公開せずに やねうら王mini を利用可能という事ですね。
太っ腹ですね。(体形では、ありません。)
コンパクトで棋力の高い実行ファイルなら、スマホ用アプリとか出てきそうな気がします。
棋力はそんな…期待しないでください。
Bonanza6よりは強くしますけども、そこが主眼ではなくて、多くの人に興味を持ってもらうのが狙いです。
楽しみです。
3流の自分にも理解できるものであるといいなー。と思います。
しかし、まぁ、そんなことは置いといて、思いうぞんぶん妙技をふるってください。
解析は任せろ~。バリバリ~。
解説記事も並行して書いていくのでプログラム経験のある人なら理解できる&改造していけると思いますよ。
Aperyの評価関数バイナリにはGPLv3ライセンスは及びません。
棋力が主題では無いとの事ですので、Aperyの評価関数バイナリを使わない方が変換とか無しで済んで良さそうに思います。
おお、そうなんですか!本文修正しました!(`・ω・´)ゞ
> それから評価関数バイナリのほうのライセンスが(おそらく)GNU GPLv3である。私はやねうら王miniのソースコードをMIT Licenseにしたいのだ。評価関数バイナリがGNU GPLv3だと、二次利用してもらうときに障壁となる。
この一文削除。
SSE4だとめちゃんと遅い。
>apery(最新版)だと平岡さんが配布してるバイナリはSSE4でもそこまで遅くならないですが
遅くなるのとそこまで遅くならない違いはどこで生じるのでしょうか?
詳しい理由については、連載やねうら王miniで遊ぼう!1日目にあります。
やねうら王大好きです。結婚してください。
やねうら王 ← 将棋ソフト / 結婚できない
やねうらお ← 個人 / 結婚できる
でも、日本の仕様では、フラグが2本立っちゃうのはバグなんでしょ?w