Skip to content

思考エンジンオプション

yaneurao edited this page May 8, 2022 · 34 revisions

思考エンジンオプションとは?

思考エンジンオプションとは、将棋所やShogiGUIなどのエンジンオプションの設定画面に出てくる項目のことです。 ここでは、各オプションの意味について解説します。

通常対局に関係するエンジンオプションで最重要なもの

以下では、通常対局で用いるエンジンオプションのうち、最重要なものに関して説明します。これらを設定しておけば、対局自体は普通にできます。

USI_Hash

置換表サイズを設定します。単位は MB (メガバイト)です。

🖋 置換表とは、探索した局面の情報を格納しておく表のことです。このサイズが小さいと探索した局面の情報を残しておけないので長時間思考させる時に、探索効率が悪化します。(棋力が低下します) 空きメモリの許す限り大きな値を設定することをお勧めします。

👉 1GB (ギガバイト)を割り当てるのであれば、1024を指定します。(1024 MB = 1 GB なので)

💡 やねうら王では、他の将棋ソフトにあるように、この数値が2の累乗でないといけないという制約はありませんし、また、サイズ制限も実質的にありません。128 GBでも1 TBでも空きメモリの許す限り確保できます。(タスクマネージャーで見ながら、空きメモリが枯渇しない範囲で設定しましょう。)

⚠ この値はデフォルトでは16 MBとなっていて、ほとんどメモリを消費しませんが、その代わり、現代のPCでは少なすぎます。かならず、お使いのPCの空きメモリに合わせた値を設定してください。 ⚠ ふかうら王では、現状(V7.50で)、このオプションは未使用です。今後使用するようになるかも知れませんが、現在このオプションの値は用いられません。ふかうら王では使用するメモリ量はNodesLimitで調整してください。

Threads

思考に用いるスレッド数を設定します。

🖋 スレッドとは、並列探索を行う時の並列数のことです。この値を4にすれば、4並列で探索します。例えば、CPUが「32コア64スレッド」であれば、64を設定するとCPUを完全に使い切ることができます。(少し余力を持たせたい時は、それより少し小さな値に設定します。) CPUが何コア何スレッドであるかは、CPUの名前で検索すればメーカーなどのページでその仕様を知ることができます。

👉 64スレッド(64並列)を割り当てるのであれば、64を指定します。

💡 スレッド数が2倍になると単位時間当たりに調べられる局面の数がおおよそ2倍になりますが、実効(実際の効果)が2倍あるわけではありません。例えば100スレッドで並列探索しても実効はその平方根である10倍程度の価値しかないと言われています。すなわち、100スレッドで1秒思考させるのは、1スレッドで10秒思考させる程度の価値しかありません。

⚠ スレッド数を増やすとCPU負荷も上がります。CPUに長時間100%の負荷をかけ続けるとそういう動作を想定されていないようなノートパソコンなどではCPUが熱暴走したり、最悪CPUが焼けて故障する場合があります。CPU温度を見るツールなどでCPU温度を見ながら、CPU温度が上がりすぎないように注意しましょう。

USI_Ponder

ponderを有効にするかどうか。

🖋 ponderとは、相手番で思考することです。

👉 有効にするなら true 、無効にするなら false を設定します。

💡 相手の次の一手を予想した指し手は、日本語では「予想手」と呼ばれますが、これをコンピュータ将棋では、「ponderの指し手」と呼びます。また予想手が当たることを「ponderがhitした」と言います。

💡 やねうら王では思考時間制御(今回に使用する時間の計算)の時に、USI_Ponderがオンであるかどうかを見ています。なぜなら、USI_Ponderがオン(true)であれば、ponderがhitした時に思考時間を節約できるからで、時間があまり気味になることが予想されるので、それを見越して、1手に通常より少し多めに思考時間を割り当てて良いと思われるからです。

⚠ USI_Ponderに関する注意点

USI_Ponderがオン(true)の時は、思考エンジンは相手の予想手も返すことになっています。通常、思考が完了した時に、最善と思われる指し手XXを

bestmove XX

の形でGUIに返すのですが、この時に、USI_Ponderがオンであれば、相手の予想手YYを付随して

bestmove XX ponder YY

のように返します。

しかし、やねうら王ではUSI_Ponderの設定値に拘わらず、常に"ponder YY"の部分も返すようにしています。なので、実際はこのオプションはやねうら王に対してponderの指し手を促す効力は持ちません。

では、何のためにこのオプションがあるかと言うと、これをGUI側でオンに設定すると、GUI側が相手番で、思考エンジンに対して、直前に予想手として返した指し手を指したあとの局面について思考するように局面を送ってきてくれます。(USIプロトコルの"go ponder"コマンド) そういう意味では、これはエンジンに対する司令ではなく、GUIに対する特別なオプションであるとも言えます。

Stochastic_Ponder

確率的ponder。

💡 dlshogiにある同名のオプションと同じ。ponderについては、USI_Ponderの説明を読むこと。

🖋 "go ponder"(ある局面に対してponderで思考せよという司令)でponderする時に、1手前の局面(相手番)で思考することによってそこからすべての指し手が探索されるので、ponderの指し手(予想手)のハズれがなくなり、dlshogiでは通常のponder動作より効率が良い(こうしたほうが強い)とされています。

⚠ やねうら王で、これをオンにしたほうが通常のponderより強くなるのかは計測できていないのでわかりません。ふかうら王では、これをオンにしたほうが強いと思われます。

⚠ これを有効化するとponderの1手前(相手番)の局面で思考しているため、GUIに表示される読み筋はおかしくなります。(GUI側に相手番のときにその1手前の局面でgoコマンドで思考させてくれる機能があると良いのですが…。)

MultiPV

その局面で評価値が良い上位N個の候補手を出力する機能です。

💡デフォルトではこの値は1に設定されているため、一番良いと思う指し手しか出力 しません。

🖋 ShogiGUIの場合、検討モードで「候補手」の数を変更すると、ShogiGUIから思考エンジンに、このMultiPVの値を変更する指示がきます。そうして、複数の候補手とその読み筋を出力しています。

⚠ この値を2以上に設定した場合、2つ目以降の指し手についても読み筋を調べないといけないため、やねうら王においては棋力が低下します。ふかうら王においては棋力はほぼ低下しません。

💡 MultiPVについて詳しい説明は、やねうら王公式ちゃんねるの動画 将棋ソフトで複数の読み筋が見たい時はどうすれば良いのか?がわかりやすいです。

EvalDir

評価関数用のファイルの配置フォルダ。

💡 デフォルト値は "eval"となっています。なので、思考エンジンの実行ファイルが存在するのと同じフォルダに"eval"という名前のフォルダが存在していて、そのなかに評価関数用のファイルが配置されていることを想定しています。

💡 絶対Pathでの指定もできます。例) "C:/YaneuraOu/Eval"

⚠ 開発者向け情報 : USIプロトコルの"isready"コマンド(GUI側から送られてくる、思考エンジンに対して準備が出来ているかを尋ねるコマンド)が送られてきてから評価関数ファイルを読み込むので、起動後"isready"までに"setoption"コマンドでこの設定を変更しないと効果がありません。

定跡関係のエンジンオプション

定跡関係のエンジンオプションは複数あり、用いる定跡ファイルの種類によっても最適値は異なるので、単純ではありません。

USI_OwnBook

本思考エンジン側の定跡を有効にするか。

⚠ このオプションは、デフォルトでtrueなので、デフォルトで思考エンジン側の定跡は有効になっています。

💡このエンジンオプションは、USIプロトコル原案に書いてあり、ShogiGUI、ShogiDroidがこのオプションに対応しているので、本エンジンでもサポートをすることにしました。

BookDir

定跡ファイルを配置しているフォルダ。

👉 思考エンジンの実行ファイルが存在するフォルダ相対で指定する。(絶対pathでも指定できる)

💡 デフォルトでは、"book"なので、思考エンジンの実行ファイルが存在するフォルダ内に"book"というフォルダがあり、そこに定跡ファイルが配置されていると想定している。

BookFile

定跡として読み込むファイルの選択。

選択した値 内容
no_book 定跡なし
standard_book.db 標準定跡
yaneura_book1.db やねうら大定跡(公開用 concept proof)
yaneura_book2.db 超やねうら定跡(大会用2015)
yaneura_book3.db 真やねうら定跡(大会用2016)
yaneura_book4.db 極やねうら定跡(大会用2017)
user_book1.db ユーザー定跡1
user_book2.db ユーザー定跡2
user_book3.db ユーザー定跡3

💡 standard_book.dbは以前公開していた。yaneura_book1.db~yaneura_book4.dbは、『将棋神やねうら王』に収録した。(かも)

👉 一般ユーザーは、自分の用意した定跡ファイルを"user_book1.db"のようにファイル名を変更してBookDirオプションで指定しているフォルダに配置すると良いと思う。

BookOnTheFly

定跡ファイルをメモリに丸読みしない機能。

このオプションをオン(true)にすると、定跡ファイルを丸読みせず、その局面での思考を開始する時にファイルの必要な箇所だけ読みに行きます。

💡 やねうら大定跡のような巨大な定跡を試合開始時に読み込まれるとその読み込みに時間がかかるため、対局中、1手指すごとにファイルを読みに行くためのものです。

⚠ この機能をオンにする場合、定跡は事前にソートされている必要があります。これはmakebook sortコマンドで行なえます。

💡 なお、やねうら王の公式サイトで配布している定跡ファイルはすべてソートされています。

💡 定跡ファイル内をバイナリサーチで調べているのでファイルサイズが10GBを超える超巨大な定跡でも取り扱えます。

💡 ランダムアクセスに近いアクセスになるので、このオプションを用いるならHDDよりはSSDのほうが好ましいです。

⚠ このオプションをオンにした時に、32bit環境で2GB以上の定跡ファイルが扱えないのはOSの制限によるもので、仕様です。64bit環境でならこの制限はありません。

NarrowBook

実現確率の低い定跡の指し手を採用しない。

💡 Bonanzaに採用されていた同名のオプションと同じ。

👉 このオプションをオン(true)にするとその局面で、指された回数が10%未満の指し手は除外する。デフォルトではオフ(false)。

⚠ このオプションをオンにする場合、前提として、定跡DB上に、その局面の各指し手の採択回数(指された回数)が記録されていなければならない。(採択回数が記録されていない定跡ファイルに対しては使えない。)

⚠ 定跡DB上の評価値ベースで指し手を選択したい場合、このオプションはオンにすべきではないです。なぜなら、評価値のついている定跡ファイルには、採択回数のところにその生成した思考エンジンのバージョンナンバーを書いてあることがあるので、評価値の良い指し手を採択回数が低いとして除外してしまうことがあります。

BookMoves

定跡を用いる手数。

👉 例えば、このオプションを16に設定した場合、開始局面から16手目の局面まで定跡にヒットする。そこ以降は定跡DBの内容を無視する。

💡 このオプションに0を設定した場合、定跡を一切用いない。

評価値つきの定跡DBでのみ使えるエンジンオプション

⚠ 評価値ベースの定跡。以下のオプションを用いるときの注意点。

  • NarrowBookを必ずオフに。(やねうら大定跡では、「出現頻度」のところが、思考エンジンのバージョンナンバーになっています!このため、出現頻度順で並び替えても意味がありません。)

  • 「やねうら大定跡」「真やねうら定跡」など評価値がきちんとついている定跡を用いる。

BookEvalDiff

定跡の第一候補手との評価値の差。

👉 定跡の指し手で(評価値が高い順に見て)1番目の候補の指し手と、2番目以降の候補の指し手との評価値の差が、この範囲内であれば採用します。

💡 1番目の候補の指し手しか選ばれて欲しくないときはこのオプションの値を0に設定すると良いです。

BookEvalBlackLimit

定跡の先手の評価値下限。

💡 定跡の指し手のうち、先手のときの評価値の下限。これより低い値の評価値がついている指し手は選択しません。

BookEvalWhiteLimit

定跡の後手の評価値下限。

💡 定跡の指し手のうち、後手のときの評価値の下限。これより低い値の評価値がついている指し手は選択しません。

BookDepthLimit

定跡のdepth下限。

定跡に登録されている指し手のdepthがこの設定した値を下回るならその指し手を採用しません。

💡 このオプションに0を設定すると、定跡DBのdepthの値を無視します。(0を下回るdepthの指し手は登録されていないので、depthで足切りされることはない。)

通常対局に関係するエンジンオプションでそれほど大切ではないもの

以下では、それほど重要ではないエンジンオプションについて解説します。設定はデフォルト値のままで対局に支障はないはずですが、気になる人はきちんと設定してみてください。

NetworkDelay

通信時の平均遅延時間。単位は ms(ミリ秒)。

👉 これを例えば200に設定しておくと、5.0秒で指さずに、4.8秒(200ms早め)で指すようになります。

💡 デフォルト値は、0ではありません。150~300程度の値が設定されているはずです。(やねうら王のバージョンにより差異があります)

💡 このオプションの値を0にするのはお勧めしません。GUIに指し手が伝わるのに0.1秒程度の遅延は必ずあるので、思考エンジンは3秒未満で指している(秒未満は切り捨てるので計測上は2秒)はずが、GUI側からすると3.1秒で指していることになります。(この時、計測上は3秒) つまり思考エンジンは1手ごとに1秒近く損をすることになります。この場合、思考エンジンは少ない思考時間で指していることになるので本来の強さが発揮できません。

⚠ 開発者向け情報 : 思考エンジン同士を自己対局によってその棋力を計測する時、1手X秒だけ考えさせたいような場合、このオプションは 0 に設定すべきです。(このオプションを300に設定していると300msだけ早めに指すので思考時間が減らされていることになって、正確な計測とは言えないため)

NetworkDelay2

通信時の最大遅延時間。単位は ms(ミリ秒)

👉 これを例えば600に設定しておくと秒読み10秒で、これが切れたら負けという瞬間に限り、9.4秒(600ms早め)に指し手を返します。エンジンオプション NetworkDelay の方もご確認ください。

💡 floodgateなどときどき大きな遅延が発生するサーバーで対局させるときは、この値を1200(1.2秒早め)ぐらいに設定することをお勧めします。

⚠ これを0に設定すると、秒読み 5秒で指す設定の時に、5秒ジャストで指すため、GUI側は時間を超えてから思考エンジンが指し手を返したという扱いになってしまい、切れ負けになります。

MinimumThinkingTime

最小思考時間。単位は ms(ミリ秒)。

💡 2秒以内に指すとすべて計測1秒となる場合、2000を指定すると得。

⚠ ただし、NetworkDelay , NetworkDelay2 の分は減じて思考する。

ResignValue

投了する評価値。

🖋 例えば3000にすると相手から見た評価値が3000以上(自分から見たら-3000以下)になった場合に自ら投了します。

💡 このオプションのデフォルト値は99999なので形勢がどれだけ悪くなっても投了はしません。

EnteringKingRule

入玉ルールを変更できます。

設定値 意味
NoEnteringKing 入玉ルールなし
CSARule24 24点法。31点で宣言勝ちなので31点にならないと宣言勝ちはしない。
CSARule24H 24点法 , 駒落ち対応
CSARule27 27点法(CSAルール。先手は28点、後手は27点で宣言勝ちできる)
CSARule27H 27点法 , 駒落ち対応
TryRule トライルール(敵の玉が最初にいた升に自玉が移動できたら入玉とみなす)

💡 駒落ち対応と書いてあるものは、例えば二枚落ちならば、上手(うわて)は5点×2枚=10点だけ事前に点数を持っているとみなして宣言勝ちの条件を満たすかをチェックします。駒落ちでは上手は後手とみなすのでこのとき、上手は 27 - 10 = 17点の駒点で入玉できます。(敵陣に10枚の駒がないといけない等の条件は元のまま)

⚠ 盤上で足りない駒は、上手の駒を落としているとみなします。 詳しくは やねうら王がAobaZeroに駒落ちで負けまくっている件について をご覧ください。

⚠ 将棋所、ShogiGUIなどではトライルール、駒落ちの宣言法に対応していないので注意。(思考エンジンはトライすれば勝ちだと思ってトライしますが、条件を満たしてもGUI側が勝ちだという判定をしてくれないため、対局が続行してしまいます。)

💡 CSAの入玉宣言のルールについて

以下にCSAの入玉宣言のルールについて参考のため引用しておきます。

第17条
次の各号に掲げる条件がすべて成立する場合、勝ちを宣言できる(以下「入玉宣言」という)。1つでも条件を満たしていない場合、宣言した方が負けとなる。
一 宣言側の手番である。
二 宣言側の玉が敵陣三段目以内に入っている。
三 宣言側が、大駒5点小駒1点の計算で
先手の場合28点以上の持点がある。
後手の場合27点以上の持点がある。
点数の対象となるのは、宣言側の持駒と敵陣三段目以内に存在する玉を除く宣言側の駒のみである。
四 宣言側の敵陣三段目以内の駒は、玉を除いて10枚以上存在する。
五 宣言側の玉に王手がかかっていない。
六 宣言側の持ち時間が残っている。

SlowMover

序盤重視率。単位は%。

1手に使う思考時間を調整します。百分率で指定します。

👉 例えば200を指定すると本来の最適時間(基準思考時間)の200%(2倍)思考するようになります。

⚠ この値を大きくすると初期局面からの対局だと序盤のほうに時間を使いすぎて終盤の時間が足りなくなります。

⚠ 逆にこの値を小さくすると序盤に時間を使わなくなり、終盤に時間が残るようになります。ただし小さくしすぎると終盤でも使用する時間が、(最適時間 × SlowMover / 100)ですから、終盤でも早指しになります。

💡 終盤に時間を余らせたいなら70ぐらいにしておくと良いでしょう。

💡 対人のときに小さめ(10とか)に設定して強制的に早指しにすることができます。

ConsiderationMode

検討モード用の読み筋出力にするための機能です。

これはShogiGUIなどの検討モードで用いるためのもので、このオプションをオン(true)にすると中途半端な読み筋が出力されることが減ります。

💡 なお、このオプションがオンの時は、置換表(一度調べた局面の情報を格納しておく表のこと)から読み筋をかき集めてくるので、置換表が破壊されてると読み筋が途中で途切れることがあります。

💡 読み筋が途切れるときは置換表用のメモリ(思考エンジン設定のUSI_Hashオプションで設定できる)を大きめに確保してみてください。

なお、この機能をオンにすると、読み筋が千日手のときは読み筋の末尾に以下のように出力されるようになります。

💡 ShogiGUIでは、これを解釈して【千日手】のように表示されるはずです。将棋所など、この解釈に対応していないGUIでは解釈せずにそのまま表示されると思います。

文字列 意味
"rep_draw" 普通の千日手
"rep_sup" 優等局面(盤上の駒配置が同一で手駒が一方的に増えている局面への突入。
相手からの歩の成り捨て~同金~歩打ち~金引きみたいな循環)
"rep_inf" 劣等局面(盤上の駒配置が同一で手駒が一方的に減っている局面への突入)
"rep_win" 王手を含む千日手(反則勝ち)
※ これ実際には出力されないはずだが…。
"rep_lose" 王手を含む千日手(反則負け)
※ これ実際には出力されないはずだが…。
"win" 宣言勝ち
"resign" 投了の局面で呼び出されたとき

と出力されます。

開発者向けのエンジンオプション

以下では、思考エンジンの開発者向けのエンジンオプションの説明をします。 ここに出てくるエンジンオプションは、将棋の通常の対局をするだけでしたら、必要ありません。

WriteDebugLog

GUIとのやりとりをログファイルへ書き出す。その時のファイル名を指定します。

🖋 思考エンジン(やねうら王)は、GUI側(将棋所やShogiGUI)と、USIプロトコルという仕様に基づいてやりとりをしています。その内容をそのままファイルに書き出すためのエンジンオプションです。

💡 このオプションは初期設定では、""(空の文字列)になっています。つまり何も設定されていないので、ログファイルは書き出されません。

👉 "log.txt"のように書き出したいログファイル名を設定すると、そのファイルが実行ファイルと同じ場所に作られて、そこに書き出されます。

💡 やねうら王では、USI拡張コマンドの"log"コマンドを実行するとそこ以降のGUIとのやりとりを、ログファイルに書き出す機能もあります。

Param1,Param2

パラメーターの自動調整フレームワークを使ってパラメーターを外部から思考エンジンに何らかの値を渡したい時に用います。それ以外では使いません。

Param1 : パラメーターの自動調整用X軸 Param2 : パラメーターの自動調整用Y軸

かきかけ

かきかけ

なくなったエンジンオプションの資料

以下は、廃止された思考エンジンに採用されていたエンジンオプションや、廃止されたエンジンオプションで、資料目的でそのまま掲載してあります。

// 協力詰めsolver時

CM_Hash			: 協力詰め時の置換表サイズ(単位[MB])


// local-game-server時

EngineConfigDir			: "engine_configX.txt"が配置してあるフォルダ

EngineNuma				: 子プロセスでEngineを実行するプロセッサグループ(Numa node)
						  -1なら、指定なし。

BookSfenFile			: 連続自己対戦のときに定跡の局面まで進めるためのsfenファイル。
						  このファイルの棋譜のまま32手目まで進める。
						  book/book.sfen
						  のように指定する。

DepthLimit				: 探索深さ制限する(0 = 制限なし)
NodesLimit				: 探索node数を制限する(0 = 制限なし)
	→ この2つは、GUI側がgoコマンドのときにdepthとかnodeとか指定すべきような気はするが、
		とりあえずGUI側がそうなっていないので用意した。
		NodesLimitは正確にそのnodeで停止するわけではなく多少の誤差はある。

SkipLoadingEval  : 評価関数の読み込みをskipさせる。ゼロで埋めた評価関数を用意できないときや、
	新しい形式の評価関数が用意できないときに、評価関数の読み込みをskipさせるために用いる。
	"test evalconvert"コマンドと組み合わせて使う。詳しくは、解説.txtのほうを参照のこと。

SkillLevel : 手加減のためのもの。この値が 20 なら手加減なし。(通常のモード) 20未満であれば、手加減が有効。
	0 だと最弱。(R2000以上弱くなる) Stockfishの"Skill Level"をそのまま移植。