/// <summary> /// 通常対局、検討モードの共通設定のデフォルト値を返す。 /// /// forConsideration : 検討モード用 /// </summary> /// <returns></returns> public static List <EngineOption> CommonOptionDefault(bool forConsideration) { var options = new List <EngineOption>(); // エンジンオプションの共通設定のDescriptionからEngineOptionsをひねり出す。 EngineCommonOptionsSampleOptions op = forConsideration ? EngineCommonOptionsSampleOptions.InstanceForConsideration() : null; var opt = CreateEngineCommonOptions(op); foreach (var desc in opt.Descriptions) { // 見出し行、非表示の奴はskipする。 if (desc.Name == null || desc.Hide || desc.UsiBuildString == null /* これ存在がおかしい気はする*/) { continue; } // この文字列でUsiOptionオブジェクトを構築して、nameとdefault値を得る var usiOption = UsiOption.Parse(desc.UsiBuildString); options.Add(new EngineOption(usiOption.Name, usiOption.GetDefault())); } return(options); }
// 他、何か追加するかも。 /// <summary> /// 等価性 /// </summary> /// <param name="rhs"></param> /// <returns></returns> public bool Equals(EngineCommonOptionsSampleOptions rhs) { return (UseEvalDir == rhs.UseEvalDir && EnableConsiderationMode == rhs.EnableConsiderationMode && DisableOutputFailLHPV == rhs.DisableOutputFailLHPV); }
/// <summary> /// エンジンオプションの共通設定に表示すべきオブジェクトを生成する。 /// これをそのままエンジンオプションの設定ダイアログにbindすれば /// いい感じに表示される。 /// </summary> /// <returns></returns> public static EngineOptionsForSetting CreateEngineCommonOptions(EngineCommonOptionsSampleOptions options = null) { // 生成に時間がかかる&エンジンの起動ごとに必要なので // 生成したものを保存している。 if (options == null) { options = new EngineCommonOptionsSampleOptions(); } if (engineCommonOptions == null || !engineCommonOptionsOptions.Equals(options)) { engineCommonOptions = CreateEngineCommonOptions_(options); engineCommonOptionsOptions = options; // 生成した時の条件も保存しておく。この条件が異なれば生成しなおす。 } return(engineCommonOptions); }
private static EngineOptionsForSetting CreateEngineCommonOptions_(EngineCommonOptionsSampleOptions options) { Debug.Assert(options != null); var setting = new EngineOptionsForSetting() { Descriptions = new List <EngineOptionDescription>() { // -- 定跡設定 new EngineOptionDescription(null, "定跡設定", null, "コンピューターが用いる定跡はここで設定します。", null), new EngineOptionDescription("BookDir", null, "コンピューターが用いる定跡ファイルの配置フォルダです。", "コンピューターが用いる定跡ファイルの配置フォルダを指定できます。\r\n" + "思考エンジンの存在するフォルダからの相対パスで ../../book のように指定するか、\r\n" + "c:/user/xxx のように絶対パスで指定するかします。前者が便利だと思います。\r\n" + "詳しい人向けの設定であり、変更することはお勧めしません。", "option name BookDir type string default ../../book"), new EngineOptionDescription("BookFile", "定跡ファイル", "コンピューターが用いる定跡ファイル。", "各エンジンのフォルダ配下のbookフォルダ内にある定跡ファイルが読み込まれます。\r\n" + "標準定跡 : 出現頻度の情報付き、評価値の情報なしの小さな定跡です。\r\n" + "やねうら大定跡 : 浅い読み(depth18)で作った評価値付きの大きな定跡です。評価値・depth情報付き、出現頻度情報なし。\r\n" + "超やねうら定跡 : 浅い読み(depth18)で作った評価値付きの小さな定跡です。評価値・depth情報付き、出現頻度情報なし。\r\n" + "真やねうら定跡 : 深い読み(depth28)で作った評価値付きの小さな定跡です。評価値・depth情報付き、出現頻度情報なし。\r\n" + "極やねうら定跡 : 深い読み(depth34)で作った評価値付きの小さな定跡です。評価値・depth情報付き、出現頻度情報なし。\r\n" + "ユーザー定跡1~3 : user_book1.db ~ user_book3.dbというファイル名の定跡ファイルを\r\n" + "定跡フォルダに配置するとそれが使えます。(わかる人向け)\r\n" + "Aperyの定跡ファイル : Aperyという将棋ソフトで使われている形式の定跡ファイルを使います。\r\n" + "ファイル名は book.bin固定 です。(わかる人向け)", "option name BookFile type combo default standard_book.db " + "var no_book var standard_book.db var yaneura_book1.db var yaneura_book2.db var yaneura_book3.db var yaneura_book4.db " + "var user_book1.db var user_book2.db var user_book3.db var book.bin" ) { ComboboxDisplayName = "no_book,定跡なし,standard_book.db,標準定跡,yaneura_book1.db,やねうら大定跡," + "yaneura_book2.db,超やねうら定跡,yaneura_book3.db,真やねうら定跡,yaneura_book4.db,極やねうら定跡," + "user_book1.db,ユーザー定跡1,user_book2.db,ユーザー定跡2,user_book3.db,ユーザー定跡3,book.bin,Aperyの定跡ファイル" }, new EngineOptionDescription("BookOnTheFly", null, "定跡ファイルを対局開始時にメモリに丸読みしない。", "この設定をオンにすると、定跡ファイルを対局開始時にメモリに丸読みしません。\r\n" + "大きな定跡ファイルに対しては、対局開始時に丸読みしなくて済むので\r\n" + "起動時間が短くなる効果と空き物理メモリが節約できる効果がありますが、" + "そんな巨大な定跡ファイルを使うことはあまりないため、デフォルトではオフになっています。\r\n" + "また、このオプションをオンにするには定跡ファイルがこのオプションに対応している必要があります。\r\n" + "(このオプション非対応の定跡があります)\r\n" + "※ 局面順にソート(並び替え)されている必要があります。定跡フォーマットに詳しくない人はオンにしないでください。", "option name BookOnTheFly type check default false" ), new EngineOptionDescription("BookMoves", null, "定跡を用いる手数(0=未使用)。", "例えば、定跡を16手目まで使用したい(17手目からは定跡を使わない)なら16を指定します。", "option name BookMoves type spin default 16 min 0 max 10000" ), new EngineOptionDescription("BookIgnoreRate", null, "一定の確率で定跡を無視して自力で思考させる確率[%]", "定跡を用いると毎回同じような対局内容になるのを回避するために、\r\n" + "ここで指定した確率で定跡を採択せずに自力で思考させることが出来ます。\r\n" + "例えば、30を指定すると30%の確率で定跡にhitしてもそれを無視して自力で思考します。", "option name BookIgnoreRate type spin default 0 min 0 max 100" ), new EngineOptionDescription("BookEvalDiff", null, "定跡の第一候補手との評価値の差", "定跡の指し手で1番目の候補の指し手と、2番目以降の候補の指し手との評価値の差が、\r\n" + "この範囲内であれば採用する。(1番目の候補の指し手しか選ばれて欲しくないときは0を指定する)\r\n" + "指し手に評価値がついている定跡ファイルに対してのみ有効です。", "option name BookEvalDiff type spin default 30 min 0 max 99999" ), new EngineOptionDescription("BookEvalBlackLimit", null, "定跡の先手の評価値下限", "定跡の指し手のうち、先手のときの評価値の下限。これより評価値が低くなる指し手は選択しない。\r\n" + "指し手に評価値がついている定跡ファイルに対してのみ有効です。", "option name BookEvalBlackLimit type spin default 0 min -99999 max 99999" ), new EngineOptionDescription("BookEvalWhiteLimit", null, "定跡の後手の評価値下限", "定跡の指し手のうち、後手のときの評価値の下限。これより評価値が低くなる指し手は選択しない。\r\n" + "指し手に評価値がついている定跡ファイルに対してのみ有効です。", "option name BookEvalWhiteLimit type spin default -140 min -99999 max 99999" ), new EngineOptionDescription("BookDepthLimit", null, "定跡の指し手のdepth下限", "定跡に登録されている指し手の(定跡生成時の)depthがこれを下回るなら採用しない。\r\n" + "0を指定するとdepth無視。\r\n" + "指し手にdepth情報がついている定跡ファイルに対してのみ有効です。", "option name BookDepthLimit type spin default 16 min 0 max 99999" ), new EngineOptionDescription("NarrowBook", null, "実現確率の低い定跡を採用しない", "定跡ファイルの指し手に、出現頻度の情報がついている時に、\r\n" + "出現頻度が低い指し手は採用しないためのオプション。", "option name NarrowBook type check default false" ), new EngineOptionDescription("ConsiderBookMoveCount", null, "定跡の指し手の選択を出現頻度に比例させる", "定跡ファイルの指し手に、出現頻度の情報がついている時に、\r\n" + "その出現頻度に比例する形でランダムに指し手を選択する。\r\n" + "このオプションをオフにしている時は、定跡の指し手が等確率で選択されます。", "option name ConsiderBookMoveCount type check default false" ), // -- 持将棋の設定 new EngineOptionDescription(null, "持将棋の設定", null, "コンピューター側の持将棋の設定を変更します。", null ), new EngineOptionDescription("MaxMovesToDraw", null, "この手数になると持将棋で引き分けとして扱います。", "この項目を変更する時は、対局設定のほうの『指定手数で引き分けとする』も\r\n" + "この設定に合わせて変更してください。\r\n" + "またこの項目に0を指定した場合、この設定は無効(手数による持将棋を適用せず)になります。", "option name MaxMovesToDraw type spin default 0 min 0 max 100000") , new EngineOptionDescription("EnteringKingRule", "入玉条件", "コンピューターの入玉条件を変更します。", "この項目を変更する時は、対局設定のほうの入玉設定もこの設定に合わせて変更してください。\r\n" + "デフォルトは、27点法です。", "option name EnteringKingRule type combo default CSARule27 var NoEnteringKing var CSARule24 var CSARule27 var TryRule") { ComboboxDisplayName = "NoEnteringKing,入玉ルールなし,CSARule27,27点法(CSAルール),CSARule24,24点法(CSAルール),TryRule,トライルール" }, // -- 思考時間設定 new EngineOptionDescription(null, "思考時間設定", null, "コンピュータの最小思考時間や着手時の遅延時間を設定します。", null ), new EngineOptionDescription("MinimumThinkingTime", "最小思考時間", "コンピュータが1手に使う最小時間を設定します。単位は[ms]です。", "コンピュータが1手に使う最小時間を設定します。単位は[ms]です。\r\n" + "例えば、この値を2000に設定すると、コンピューターは少なくとも2秒は考えます。\r\n" + "(実際には『NetworkDelay』の分だけ早く指し手を返します。)\r\n" + "2秒の考慮時間でも秒未満が切り捨てられて計測上1秒になるルール下では2000に設定するのがベストです。", "option name MinimumThinkingTime type spin default 2000 min 1000 max 100000"), new EngineOptionDescription("NetworkDelay", null, "コンピュータの着手時の遅延時間の設定その1。単位は[ms]です。", "コンピュータの着手時の遅延時間の設定その1。単位は[ms]です。\r\n" + "コンピュータは、ここで指定した時間だけ早めに指し手を返します。\r\n" + "例えば、1手3秒で指す予定の時にこの値を350[ms]に設定した場合、2.65秒までに指し手を返します。", "option name NetworkDelay type spin default 350 min 0 max 10000"), new EngineOptionDescription("NetworkDelay2", null, "コンピュータの着手時の遅延時間の設定その2。単位は[ms]です。", "コンピュータの着手時の遅延時間の設定その2。単位は[ms]です。\r\n" + "コンピュータは、ここで指定した時間だけ早めに指し手を返します。(切れ負け時用)\r\n" + "例えば、秒読み10秒(1手ごとに10秒で、それを過ぎると切れ負け)になる指し手の時に、\r\n" + "この値を550[ms]に設定した場合、9.45秒までに指し手を返します。\r\n" + "遅いマシンでの対局時に切れ負けになる現象が出る時には、もう少し大きな値(600~800)にしたほうが良いです。\r\n" + "またネットワーク対局で、サーバー側が重い場合やネットワーク遅延がある場合には\r\n" + "大きめの値(1000~1500)にすることを推奨します。", "option name NetworkDelay2 type spin default 550 min 0 max 10000"), // -- 思考設定 new EngineOptionDescription(null, "思考設定", null, "エンジンの思考の設定です。棋力に直接的な影響のある部分です。", null ), new EngineOptionDescription("MultiPV", null, "候補手の数を設定します", "例えば、この項目(MultiPV)を5に設定すると、思考するときに候補手として5手挙げます。\r\n" + "このとき、5手分調べないといけなくなるので、MultiPVを1に設定している時の\r\n" + "約5倍の時間がかかるようになります。\r\n" + "通常対局の時は1に設定しておくのが一番強くなります。\r\n" + "また、検討モードの時は、この設定値は無視され、検討ウィンドウの『候補手』の数が反映されます。", "option name MultiPV type spin default 1 min 1 max 800"), new EngineOptionDescription("SlowMover", null, "序盤重視度。大きくすると持ち時間の序盤への配分が増えます。", "デフォルトは、100[%]。例えば、この値を70にすると序盤の1手に用いる時間が\r\n" + "本来の時間の70%になり、序盤にかける時間が短くなります。", "option name SlowMover type spin default 100 min 1 max 1000"), new EngineOptionDescription("ResignValue", null, "投了スコアです。(相手から見た)評価値がこの値を超えると投了します。", "例えば、相手からの詰みが見えた時に投了するのであれば、\r\n" + "30000(詰みはこれより大きな値)と設定します。\r\n" + "また、序盤で形勢に差がついた時に思考エンジンに投了させたいのであれば、\r\n" + "1000~3000ぐらいの数値を設定すると良いでしょう。", "option name ResignValue type spin default 99999 min 0 max 99999"), new EngineOptionDescription("Contempt", null, "千日手を受け入れるスコアを設定します。", "大きな値にすると千日手を(無理にでも)打開しやすくなります。\r\n" + "千日手の局面のスコア(評価値)は、ここで設定した値に -1 を掛けた値になります。\r\n" + "例えば、この値を100に設定すれば、千日手の局面のスコアは-100とみなされます。\r\n" + "このとき、-50(歩の半分ぐらいの価値だけ互角より損している局面)になる指し手があるなら、\r\n" + "千日手の局面を選ばずにそちらを選びます。\r\n" + "デフォルトは2です。(互角に近いなら千日手の局面を回避して欲しいが、無理な打開はして欲しくないので。)", "option name Contempt type spin default 2 min -30000 max 30000"), new EngineOptionDescription("ContemptFromBlack", null, "Contemptの設定値を先手番から見た値とするオプション。", "先手のときは千日手を狙いたくなくて、後手のときは千日手を狙いたいような場合、\r\n" + "このオプションをオンにすれば、Contemptをそういう解釈にしてくれる。\r\n" + "(Contemptを常に先手から見たスコアだとみなしてくれる。) デフォルトではオフです。", "option name ContemptFromBlack type check default false"), new EngineOptionDescription("DepthLimit", null, "探索深さ制限。", "この値を0以外に設定すると、その値の探索深さまでしか探索しません。(弱くなります)\r\n" + "強さを調整したい時に使います。", "option name DepthLimit type spin default 0 min 0 max 2147483647"), new EngineOptionDescription("NodesLimit", null, "探索ノード制限。", "この値を0以外に設定すると、その値の探索ノード数(局面数)までしか探索しません。(弱くなります)\r\n" + "強さを調整したい時に使います。", "option name NodesLimit type spin default 0 min 0 max 9223372036854775807"), new EngineOptionDescription("nodestime", null, "node as timeモード。0以外に設定すると有効。", "《上級者向けの設定項目です。普通使いません。》\r\n" + "時間の代わりにノード時間を用いる。この値を0以外に設定すると、有効。\r\n" + "時間の代わりに探索ノード数を決めて探索するときのミリ秒当たりのnode数。\r\n" + "この値を600と指定した場合、持ち時間1秒に対して600000ノード(の時間が与えられたものとして)探索します。", "option name nodestime type spin default 0 min 0 max 99999"), new EngineOptionDescription("SkillLevel", null, "スキルレベル。棋力の調整用。", "この値を20より小さな値にすると手加減します。\r\n" + "0が最弱で(R2000以上弱い)、19でも20に設定したときよりR300程度弱いです。", "option name SkillLevel type spin default 20 min 0 max 20"), new EngineOptionDescription("GenerateAllLegalMoves", null, "歩の不成などを読むか。", "敵陣での歩の不成、2段目への香の不成、大駒の不成を読むかの設定です。\r\n" + "この設定をオンにすると、それらの指し手も読みます。(その結果、少し弱くなります)\r\n" + "検討などで不成が絡むような局面を読ませたいときにオンにすると良いでしょう。", "option name GenerateAllLegalMoves type check default false"), // -- 評価関数 new EngineOptionDescription(null, "評価関数の設定", null, "評価関数の設定です。", null ), new EngineOptionDescription("EvalDir", null, "評価関数用のファイルのあるフォルダの設定。", "評価関数用のファイルの配置するフォルダを変更する時にこの設定を使います。\r\n" + "通常、変更する必要はありません。\r\n" + "思考エンジンの存在するフォルダからの相対パスで ../../xxx_eval のように指定するか、\r\n" + "c:/user/xxx のように絶対パスで指定するかします。前者が便利だと思います。\r\n" + "詳しい人向けの設定であり、変更することはお勧めしません。", "option name EvalDir type string default eval"), new EngineOptionDescription("EvalShare", null, "評価関数ファイルをメモリ上で共用する設定。", "同じ思考エンジンを2つ以上動かす時に、評価関数ファイルをメモリ上で共用する設定です。\r\n" + "これをオンにして、同じ思考エンジンを2つ動作させた場合、消費する物理メモリが節約できます。\r\n" + "(この機能に対応している思考エンジンの場合のみ)", "option name EvalShare type check default true"), // -- 読み筋の表示 new EngineOptionDescription(null, "読み筋の表示", null, "読み筋の表示に関する設定です。", null ), new EngineOptionDescription("PvInterval", null, "読み筋を出力する最小間隔を設定します。単位は[ms]", "思考エンジンが読み筋を出力する最小間隔を設定します。\r\n" + "これをあまり小さい値にすると読み筋が出力される回数が増えて、見づらくなります。\r\n" + "また出力にも時間がかかるため、あまりたくさん出力すると棋力に影響します。\r\n" + "※ ConsiderationModeがオンのときはこの値は無視されます。", "option name PvInterval type spin default 300 min 0 max 100000"), new EngineOptionDescription("ConsiderationMode", null, "なるべく綺麗な読み筋を出力します。", "この設定をオンにすると、読み筋が途中で途切れにくくなります。\r\n" + "(読み筋の出力頻度は少し減ります。)\r\n" + "※ この設定をオンにした時、PvIntervalの値は無視されます。", "option name ConsiderationMode type check default false"), new EngineOptionDescription("OutputFailLHPV", null, "fail low/highのときにPVを出力する。", "fail highというのは、いまの読み筋より良い指し手が存在するらしきことがわかったので、\r\n" + "それを調べ直している状態のことです。(fail lowはその逆)\r\n" + "そのため、fail low/highのとき読み筋の表示は短くなります。\r\n" + "このオプションをオフにすると、fail low/highの時には読み筋を出力しなくなるので、\r\n" + "短い読み筋が表示されにくくなります。\r\n" + "※ このオプションは、ConsiderationModeオンのときも有効。", "option name OutputFailLHPV type check default true"), // -- デバッグ用 new EngineOptionDescription(null, "デバッグ用", null, "デバッグ用の項目です。一般ユーザーが使うことはありません。", null ), new EngineOptionDescription("WriteDebugLog", null, "思考エンジンとGUIとのやりとりをエンジン側からファイルに書き出します。", "思考エンジンとGUIとのやりとりをエンジン側からファイルに書き出します。", "option name WriteDebugLog type check default false"), // Ponderに関しては、対局設定ダイアログで行うので、エンジン個別オプションでは設定しない。 new EngineOptionDescription("USI_Ponder") { Hide = true }, // これは非表示にしておく。 new EngineOptionDescription("Param1") { Hide = true }, new EngineOptionDescription("Param2") { Hide = true }, new EngineOptionDescription("SkipLoadingEval") { Hide = true }, new EngineOptionDescription("EvalSaveDir") { Hide = true }, // -- その他 // すべて分類したので、このエンジン設定にはその他は必要ない。gpsfishのような他のエンジンを追加する時には必要。 new EngineOptionDescription(null, "その他", "その他の設定", null) { Hide = true }, } }; // ハッシュ設定、スレッド設定をいま生成したsettingの前方に挿入する。 // MultiPVとPonderはすでに持っているので、こういう重複を除去しながら挿入する。 var header = CreateEngineMinimumOptions(); //setting.Descriptions.InsertRange(0, header.Descriptions); foreach (var h in header.Descriptions.ReverseIterator() /* 逆向きのiterator */) { if (!setting.Descriptions.Exists(x => x.DisplayName == h.DisplayName)) { setting.Descriptions.Insert(0, h); } } // 共通設定のときにはEvalDirを消しておく。(エンジンが個別に値を設定したいので) if (!options.UseEvalDir) { setting.Descriptions.RemoveAll(x => x.Name == "EvalDir"); } // 検討モード、詰検討モードの共通設定では、 // デフォルトでConsiderationMode == true , OutputFailLHPV = false に。 if (options.EnableConsiderationMode) { setting.Descriptions.Find(x => x.Name == "ConsiderationMode") .UsiBuildString = "option name ConsiderationMode type check default true"; // これ、値だけ書き換えたいんだけどなぁ…。 } if (options.DisableOutputFailLHPV) { setting.Descriptions.Find(x => x.Name == "OutputFailLHPV") .UsiBuildString = "option name OutputFailLHPV type check default false"; } #if false if (options.GenerateAllLegalMoves) { setting.Descriptions.Find(x => x.Name == "GenerateAllLegalMoves") .UsiBuildString = "option name GenerateAllLegalMoves type check default true"; } // → 検討モードで77角不成とか1位に出てくるのうざかったのでデフォルトでオンはやりすぎだ。 #endif return(setting); }