やねうら王の定跡生成コマンド

昨日公開した駒得のみの評価関数にしたやねうら王*1の定跡編集コマンドを公開します。

  • 定跡の生成コマンド

makebook depth 14 record -1

records.sfenから定跡を自動生成する。
あと、records1.sfen , records2.sfen , ..を配置してあると、そちらもrecords.sfenに連結されているものとみなして読み込む。

depth : そのときの探索深さ。default = 14。この深さで探索して -500以上ならば定跡に登録。
moves : 定跡化する最大手数。default = 32。
record : 使う棋譜の数。-1ならすべて
eval : この評価値以上ならば定跡に登録。default = -10000。
// defaultではすべて登録するが、-200以下になる指し手は採用しないのでこれはこれで構わない。
init : 定跡DBを初期化してから読み込む
skip : 棋譜のうち、最初の指定数の局だけ読み飛ばす。

makebook skip 100
なら101局目から開始。
skipmoves : 定跡の最初のN手をskipする。

makebook skipmoves 4
なら初手から数えて4手skipする。

mergebook
"shogi_book.db3"と"shogi_book2.db3"とを前者にマージする。
後者は前者を別のPCで定跡を生成してリネームしたものとする。
同じ局面の同じ指し手では探索depthが深いほうを採用する。

// depthが前者に登録されている局面のほうが深い場合skipする。
// このとき'.'を表示する。
// また、深いdepthだったので指し手をoverwriteしたなら'*'、
// その指し手が新規挿入なら'+'を表示する。


特別に以下の指し手はあまりにひどいので定跡DBにhitしたときに評価値を-10000しています。(ソースコードより抜粋)

auto gamePly = game.Searches.RootPos.game_ply();
vector removes;
switch (gamePly)
{
case 0 : // 先手の初手

// 検討モードで動かすことも考えてhashもチェックしたほうがいいか。
// てか検討モードでgamePly == 0を渡してくる将棋所がおかしいんだよな..
// gamePly = 0のときだけ局面のhash値もチェックすべきか…。
if (key == 650845876563499746ULL)
{
removes.push_back(make_move(SQ_59, SQ_68)); // 68玉
removes.push_back(make_move(SQ_39, SQ_48)); // 48銀
removes.push_back(make_move(SQ_49, SQ_58)); // 58金右
}
break;

case 1: // 後手の初手

// いかなる局面でも62銀と42玉は最善手ではないと思う。
removes.push_back(make_move(SQ_71, SQ_62)); // 62銀
removes.push_back(make_move(SQ_51, SQ_42)); // 42玉
break;
}

将棋所でPVの表示

seldepth
→ : 自ら定跡の局面で思考した指し手
← : 現在の対局で採用された指し手


例) 定跡学習させたい棋譜をrecords.sfenに用意して、やねうら王をダブルクリックして実行してコマンドラインから
makebook init moves 32 depth 24
と入力すれば、探索深さ24まで探索して、各対局棋譜の初手から32手目までを定跡として学習します。(initは定跡DBを開始前に初期化する指定)


参考記事)
コンピューター将棋の定跡をデザインする
http://d.hatena.ne.jp/yaneurao/20141114#p1