今回は、やねうら王を使って定跡を作る方法について解説します。
定跡コマンド(makebook)をサポートしているエディションのやねうら王が必要となります。(現時点であれば、やねうら王2016 Midの実行ファイルがお勧め。)
やねうら王で用いる定跡のフォーマット
やねうら王では以下のフォーマットを採用しています。
棋譜をそのまま定跡とする方法
やねうら王2016 Midを起動して、
> makebook from_sfen book.sfen standard_book.db moves 16
のようにすれば、book.sfenという棋譜ファイルがそのまま16手目までを定跡としてstandard_book.dbに書き出します。
sfenファイルが必要となりますが、これは、以下で紹介しているツールを用いて他の形式から変換するのが良いでしょう。
定跡ファイルの配置フォルダ
book/standard_book.db
のように、やねうら王の実行ファイル配下に book という名前のフォルダを作成し、そこに配置することになっています。
ファイル名は、決め打ちですが、以下のようになっているので、例えば user_book1.db としておけば、思考エンジンの設定ダイアログで「ユーザー定跡」を選べば、その定跡が使えます。
- standard_book.db 標準定跡
- yaneura_book1.db やねうら大定跡(公開用1)
- yaneura_book2.db やねうら超定跡(公開用2)
- yaneura_book3.db やねうら裏定跡(大会用)
- user_book1.db ユーザー定跡1
- user_book2.db ユーザー定跡2
- user_book3.db ユーザー定跡3
特定の局面で思考させ、その指し手をそのまま定跡とする方法
まず、何スレッドで探索するかを設定します。論理スレッドが8スレッドあるなら8スレッドで探索するのが一番効率が良いです。8スレッドの各スレッドがそれぞれ個別の局面を探索しますので、4スレッドを指定しようが8スレッドを指定しようが、探索結果はほぼ変わりません。(1つの局面を担当するのは1スレッドだけなので)
それで、このスレッド数は、USIのoptionで指定します。
> setoption name Threads value 8
ところが、これは冗長なので、やねうら王ではUSIのoptionは、以下のように省略して書くことが出来るようになっています。
> threads 8
※ Threadsの”T”をこのように小文字で書いてもきちんと認識します。
また、探索するときのMultiPV(1局面での候補手の数)もUSIのoptionで指定します。
> setoption name MultiPV value 10
あるいは
> multipv 10
とすれば同じ意味となります。
MultiPVの値が10だと候補手を10手探索するので、候補手が1手のときの10倍近い探索時間がかかります。
次に置換表のサイズの設定をします。これは全スレッドで共用しているのでなるべく大きなメモリを割り当てたほうが良いと思います。例えば、4096MB(=4GB)割り当てるのであれば4096を指定します。
> setoption name Hash value 4096
あるいは
> hash 4096
と書きます。
ThreadsとMultiPV、Hashの設定が終わったら、思考させます。
> makebook think 2016.sfen yaneura_book.db moves 16 depth 32
この場合、2016.sfenで与えられた局面について16手目までを探索深さ32(≒32手読み)で調べて、yaneura_book.dbに書き出します。yaneura_book.dbがすでに存在するときは、思考した局面の指し手だけを上書きします。
- 定跡ファイル上に、すでにそれ以上深い深さで探索した結果がある場合は、その局面については探索しません。
- 同じ深さの場合、登録されている手の数がMultiPVで指定されている手の数以上登録されている場合もその局面については探索しません。
- Hash、Threads、MultiPVの設定に従い思考されるので、事前にこれらのパラメーターを適切な値に設定してある必要があります。
- ‘.’が1局面終わった合図。’S’がセーブ(ファイルに保存)したという合図。セーブは30分ごとに発生。中断するときはこの’S’マークが出たのを確認してから終了させると良い。保存中に終了させるとファイルが破損する可能性がある。前回から新たな指し手が追加されていないときは’s'(小文字)を表示して、ファイルには書き出さない。
例)
Hashメモリ4096MB、スレッド数8(それぞれのスレッドが1局面ずつ担当して検討)、MultiPV 5(それぞれの局面で候補手5手書き出し)、棋譜2016.sfenの16手目までを深さ32で探索して定跡ファイルuser_book1(すでに存在すれば該当局面のみを上書き更新)を生成する。
1 2 3 4 |
Hash 4096 Threads 8 MultiPV 5 makebook think 2016.sfen user_book1.db moves 16 depth 32 |
上のように書いてテキストエディタなどに書いておき、そこからコピペすると楽ですね。また、開始手数の指定はstartmovesで指定します。(次例)
> makebook think 2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32
startmovesを指定すると、思考対象局面をそこからにします。(省略時は1が指定されているものとみなされます。)
上の例だと、(初期局面を1手目として)5手目から16手目の局面を思考対象とします。
定跡のマージ機能
> makebook merge yaneura_book1.db yaneura_book2.db yaneura_book3.db
yaneura_book1.dbとyaneura_book2.dbとをマージ(合体)させてyaneura_book3.dbを作成します。
・1つの局面に対して、深く探索されたほうの結果を優先。
・1つの局面に対して、2つの定跡ファイルがどちらも同じ深さで探索されている場合は、候補手(MultiPV)が多いほうを採用。
makebook thinkコマンドで自動生成した定跡に対してマージするのに用います。
定跡のソート機能
> makebook sort book_src.db book_sorted.db
sfen文字列でソートします。上例では、book_src.dbを読み込み、並び替えられた、book_sorted.dbを出力します。
定跡をメモリに丸読みしたくないときには(BookOnTheFly機能)、並び変わっていないといけません。(sfen文字列順でソートされていないとバイナリサーチが出来ないため。)
全体の流れ
- 他ソフトとの対局棋譜などをコンバーターでsfen形式に変換。
- やねうら王を起動してThreadsとMultiPV、Hashを設定。
- makebook think コマンドで思考させる。(30分に1回自動保存するので、それ以外のタイミングであれば途中で中断しても良い。)
- 場合によっては他のPCで生成していたりするので本体定跡に makebook mergeコマンドでマージする。
- makebook sortコマンドでソートしておく。(BookOnTheFlyで使いたいので)
- 生成された定跡ファイルをリネームするなどして、bookフォルダに配置する。
定跡ファイルは常時受付てます!
上の手順で、思考させた定跡ファイルを送ってもらえれば、やねうら大定跡のほうにマージさせてもらいます。
ただし、以下の条件を満たしている必要があります。
・上位ソフトとの対局およびプロの対局棋譜に対して、32手目までの局面について(moves = 32以下)
・やねうら王2016Midを用いて、MultiPV = 10 , depth = 32 以上 で思考させてあること
・思考させた局面数 = 100局面以上
まあ、年々ソフトは強くなるので、1年おきぐらいに古い定跡は捨てて、丸ごと定跡を生成しなおしていくことになると思います。あまり気合入れて定跡作っても仕方ない気もしますので、肩肘張らずに取り組んでいきたいですね。
定跡ファイルをこれから作るところですが、対象の棋譜をやねうらおさんがとりかかっている棋譜と別の物にしたいと思っています。
出来ればどの棋譜を対象すればいいか教えて欲しいです(2015年のfloodgateのポナンザをやってねみたいな)。
あるいは、自分のPCで技巧と魔女を対局させた物で大丈夫であればやねうらおさんとかぶらなくてすむのですが…
別に被っても良いよというのであれば自分で適当に選んでおきます(好きな棋譜を選ぶので四間飛車ばかりになるかも)。
9手目以降、深さ32で探索したものはまだしばらく着手する見込みがないので
makebook think XXX.sfen YYY.db startmoves 9 moves 16 depth 32
のようにして、9手目以降を生成していただければと。
ちなみに中盤でのdepth 32は1局面10時間ぐらいかかるかも、です。
やねうら王のほうは、定跡生成まわり色々いじったので、このあと、やねうら大定跡とともにアップしておきますのでそれを使っていただければと。
上位ソフトはfloodgateでRがどのくらいあれば上位ソフトなのでしょうか?やねさん、教えてください。
いまのところ、R3400ぐらいあるのが上位ソフトではないかと思います。やねうら王2016Midはギリギリあるのでセフセフ。今年の年末には「R3600以下は上位ソフトにあらず」とか言ってるかも知れませんが。(๑´ڡ`๑)
勝った棋譜だけ、定跡にそのまま使って、負けた棋譜は思考すればいいのでは無いでしょうか?
やねうら王(2013)の局後検討機能はそうなっていました。
しかし、勝った棋譜とは言え悪手はふんだんに含まれていることがわかり、そのまま定跡にするのは危なく、結局、(局後などに)まんべんなく深い探索をしてそれを定跡の指し手とするほうが勝率が良いことがわかり、現在はそのようにして定跡を作成しています。
あと、定跡を作ってみたのですが、トータルが0ノードになってました。
どうしてですか?
すみません解決しました。
嬉野流の定跡を作りたく相手が何を指したとしても先手なら68銀、56歩、57銀後手なら42銀、54歩とさすようにしたいのですが、どうすれば良いのですか?
(まふさんだったか忘れましたが、シンデレラ定跡?の中に嬉野流があったのですが、古い嬉野流で、新嬉野流でなく、且つ先手だけだったので、作ろうと思いまして・・・。)
それ手作業でやろうとすると大変ですなー。(´ω`)
お手軽にやるとしたら、やねうら王のほう改造してif (gamePly == 1) { bestmove = make_move… } みたいに書いてしまうか、あやねる使って、合法手生成しながら、その嬉野流の指し手を指すような定跡ファイルを書き出すかですなー。
例えば、あやねるをラッパー?、ブリッジ?のようにして、現局面に対して68(42)銀や79(31)角、56(54)歩のような嬉野手を指した後の局面を先にやねうら王に考えさせて、その時の相手の評価値が高くなければ(≒直前の嬉野手がそこまで評価値を下げなければ)採用するみたいな事はできそうですか?
(GPS将棋が似た様に候補手の先の局面を考えさせてると何処かで聞いたような…)
できます。(あやねる側、完全に無改造だとできないかもしれないですが、その場合は、少し手を入れてくだされ..)
お返事頂きありがとう御座います。
そのやねうら王の改造のやり方をpythonやらc/c++に興味本位に手をだして悲鳴を上げている素人にでもわかる程度に教えて頂きたいのですが・・・・。
http://yaneuraou.yaneu.com/yaneuraou_mini/の「やねうら王miniで遊ぼう」の連載の4日目を見ると指し手の表現の仕方がわかると思うので、yaneuraou-search.cppのMainThread::search()の適当なところに if (rootPos.game_ply() == 5 /*手数*/ ) { rootMoves.push_back(指し手); rootMoves[0].score = 0; goto SKIP_SEARCH; } のように書いてビルドしなおせば、なんとか…。
お返事どうもありがとうございます(๑´ڡ`๑)
一度試させて頂きたいと思います。
自分で棋譜を作ってsfenファイルに変更してからmakebookコマンドを使おうとしたんですけど評価値ってどうやって入力するんですかね?
kifファイルかsfenファイルに評価値を入力する方法を知りたいです
sfenファイルにしちゃうとその時点で評価値はなくなりますなー。
ShogiGUIの定跡形式からやねうら王の定跡形式に変換するプログラムって、ShogiGUIの人が作ってたような?
https://github.com/ai5/BookConv
kif→ShogiGUIの定跡に変換したあと、これでやねうら王の定跡形式にすればどうでしょう?
なるほど、そんなやり方があったんですね
ありがとうございます