From f0863eaa9d0f65ba83995535a287f1a83691b10d Mon Sep 17 00:00:00 2001 From: yaneurao Date: Sun, 5 Nov 2023 11:59:52 +0900 Subject: [PATCH] =?UTF-8?q?-=20see=5Fge=E3=81=AE=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E9=96=93=E9=81=95=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3=E3=80=82=20-=20see=5Fge=E3=81=AEUni?= =?UTF-8?q?tTest=E6=9B=B8=E3=81=84=E3=81=9F=E3=80=82=20-=20skill=20level?= =?UTF-8?q?=E9=96=A2=E9=80=A3=E3=81=A7=E3=80=81assert=E3=81=AB=E5=BC=95?= =?UTF-8?q?=E3=81=A3=E3=81=8B=E3=81=8B=E3=81=A3=E3=81=A6=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/yaneuraou-engine/yaneuraou-param.h | 83 ++++++++++--------- .../yaneuraou-engine/yaneuraou-search.cpp | 5 +- source/position.cpp | 52 ++++++++++-- source/position.h | 1 + 4 files changed, 90 insertions(+), 51 deletions(-) diff --git a/source/engine/yaneuraou-engine/yaneuraou-param.h b/source/engine/yaneuraou-engine/yaneuraou-param.h index 9d40366bf..29bbb1d01 100644 --- a/source/engine/yaneuraou-engine/yaneuraou-param.h +++ b/source/engine/yaneuraou-engine/yaneuraou-param.h @@ -29,25 +29,25 @@ // 重要度 ★★★★★ // 前のバージョンの値 = 2057 // 元の値 = 2037 ,step = 8 -// [PARAM] min:1500,max:2500,step:2,interval:2,time_rate:1, -PARAM_DEFINE PARAM_REDUCTIONS_PARAM1 = 2037; +// [PARAM] min:1500,max:2500,step:1,interval:2,time_rate:1, +PARAM_DEFINE PARAM_REDUCTIONS_PARAM1 = 2035; // Reductionの計算式に出てくる定数 // 重要度 ★★★★☆ // 元の値 = 1487 ,step = 128 -// [PARAM] min:0,max:2048,step:128,interval:2,time_rate:1, -PARAM_DEFINE PARAM_REDUCTION_ALPHA = 1487; +// [PARAM] min:0,max:2048,step:64,interval:2,time_rate:1, +PARAM_DEFINE PARAM_REDUCTION_ALPHA = 1615; // Reductionの計算式に出てくる定数 // 重要度 ★★★★☆ // 元の値 = 808 , step = 128 -// [PARAM] min:300,max:1500,step:128,interval:2,time_rate:1, -PARAM_DEFINE PARAM_REDUCTION_BETA = 808; +// [PARAM] min:300,max:1500,step:64,interval:2,time_rate:1, +PARAM_DEFINE PARAM_REDUCTION_BETA = 552; // Reductionの計算式に出てくる定数 // 重要度 ★★★★☆ // 元の値 = 976 , step = 128 -// [PARAM] min:300,max:1500,step:128,interval:2,time_rate:1, +// [PARAM] min:300,max:1500,step:32,interval:2,time_rate:1, PARAM_DEFINE PARAM_REDUCTION_GAMMA = 976; @@ -60,25 +60,25 @@ PARAM_DEFINE PARAM_REDUCTION_GAMMA = 976; // 重要度 ★★★★☆ // 元の値 = 125 , step = 20 -// [PARAM] min:100,max:300,step:10,interval:2,time_rate:1, +// [PARAM] min:100,max:300,step:5,interval:2,time_rate:1, PARAM_DEFINE PARAM_FUTILITY_MARGIN_ALPHA1 = 125; // 重要度 ★★★★☆ // 元の値 = 43 , step = 10 -// [PARAM] min:10,max:200,step:5,interval:2,time_rate:1, -PARAM_DEFINE PARAM_FUTILITY_MARGIN_ALPHA2 = 43; +// [PARAM] min:10,max:200,step:2,interval:2,time_rate:1, +PARAM_DEFINE PARAM_FUTILITY_MARGIN_ALPHA2 = 38; // 重要度 ★★★★☆ // 元の値 = 138 , step = 30 -// [PARAM] min:100,max:240,step:30,interval:2,time_rate:1, -PARAM_DEFINE PARAM_FUTILITY_MARGIN_BETA = 138; +// [PARAM] min:100,max:240,step:5,interval:2,time_rate:1, +PARAM_DEFINE PARAM_FUTILITY_MARGIN_BETA = 100; // 静止探索でのfutility pruning // 重要度 ★★★★☆ // 1つ前のバージョンの値 = 118。 // 元の値 = 200 , step = 10 -// [PARAM] min:50,max:300,step:20,interval:2,time_rate:1, +// [PARAM] min:50,max:300,step:10,interval:2,time_rate:1, PARAM_DEFINE PARAM_FUTILITY_MARGIN_QUIET = 200; // futility pruningの適用depth。 @@ -100,24 +100,24 @@ PARAM_DEFINE PARAM_FUTILITY_AT_PARENT_NODE_DEPTH = 13; // 親nodeでのfutility margin // 重要度 ★★★★☆ // 元の値 = 77 , step = 10 -// [PARAM] min:50,max:400,step:10,interval:2,time_rate:1, -PARAM_DEFINE PARAM_FUTILITY_AT_PARENT_NODE_MARGIN1 = 77; +// [PARAM] min:30,max:400,step:5,interval:2,time_rate:1, +PARAM_DEFINE PARAM_FUTILITY_AT_PARENT_NODE_MARGIN1 = 67; // 重要度 ★★★☆☆ // 元の値 = 124 , step = 10 -// [PARAM] min:100,max:400,step:5,interval:2,time_rate:1, -PARAM_DEFINE PARAM_FUTILITY_AT_PARENT_NODE_ALPHA = 124; +// [PARAM] min:100,max:400,step:1,interval:2,time_rate:1, +PARAM_DEFINE PARAM_FUTILITY_AT_PARENT_NODE_ALPHA = 122; // 重要度 ★★★★☆ // 元の値 = 26 , step = 2 -// [PARAM] min:15,max:50,step:1,interval:2,time_rate:1, -PARAM_DEFINE PARAM_FUTILITY_AT_PARENT_NODE_GAMMA1 = 26; +// [PARAM] min:15,max:50,step:1,interval:1,time_rate:1, +PARAM_DEFINE PARAM_FUTILITY_AT_PARENT_NODE_GAMMA1 = 27; // lmrのときのseeの値。 // 重要度 ★★★★☆ // 元の値 = 185 ,step = 40 -// [PARAM] min:0,max:300,step:10,interval:2,time_rate:1, +// [PARAM] min:0,max:300,step:5,interval:2,time_rate:1, PARAM_DEFINE PARAM_LMR_SEE_MARGIN1 = 215; @@ -128,20 +128,20 @@ PARAM_DEFINE PARAM_LMR_SEE_MARGIN1 = 215; // 重要度 ★★★☆☆ // 元の値 = 152 , step = 10 -// [PARAM] min:50,max:400,step:5,interval:2,time_rate:1, +// [PARAM] min:50,max:400,step:3,interval:2,time_rate:1, PARAM_DEFINE PARAM_NULL_MOVE_DYNAMIC_GAMMA = 152; // 重要度 ★★★☆☆ // 元の値 = 24 , step = 2 // Stockfishの前バージョンではこの値は15。 // [PARAM] min:10,max:60,step:1,interval:2,time_rate:1, -PARAM_DEFINE PARAM_NULL_MOVE_MARGIN1 = 24; +PARAM_DEFINE PARAM_NULL_MOVE_MARGIN1 = 20; // 元の値 = 281 , step = 50 // 重要度 ★★★☆☆ // Stockfishの前バージョンではこの値は198。 -// [PARAM] min:0,max:400,step:13,interval:2,time_rate:1, -PARAM_DEFINE PARAM_NULL_MOVE_MARGIN4 = 256; +// [PARAM] min:0,max:400,step:5,interval:2,time_rate:1, +PARAM_DEFINE PARAM_NULL_MOVE_MARGIN4 = 281; @@ -164,19 +164,19 @@ PARAM_DEFINE PARAM_NULL_MOVE_RETURN_DEPTH = 14; // 式 = beta + PARAM_PROBCUT_MARGIN1 - improving * PARAM_PROBCUT_MARGIN2 // improvingの効果怪しいので抑え気味にしておく。 // 元の値 = 168 , step = 20 -// [PARAM] min:100,max:300,step:10,interval:2,time_rate:1, +// [PARAM] min:100,max:300,step:5,interval:2,time_rate:1, PARAM_DEFINE PARAM_PROBCUT_MARGIN1 = 183; // 元の値 = 70 , step = 10 // 重要度 ★★★☆☆ -// [PARAM] min:20,max:100,step:2,interval:2,time_rate:1, -PARAM_DEFINE PARAM_PROBCUT_MARGIN2 = 68; +// [PARAM] min:20,max:100,step:1,interval:2,time_rate:1, +PARAM_DEFINE PARAM_PROBCUT_MARGIN2 = 70; // 前のバージョンのStockfishではこの値は481。 // 重要度 ★★★☆☆ // 元の値 = 416 , step = 10 -// [PARAM] min:20,max:500,step:8,interval:2,time_rate:1, -PARAM_DEFINE PARAM_PROBCUT_MARGIN3 = 416; +// [PARAM] min:20,max:500,step:4,interval:2,time_rate:1, +PARAM_DEFINE PARAM_PROBCUT_MARGIN3 = 408; // // singular extension @@ -193,7 +193,7 @@ PARAM_DEFINE PARAM_SINGULAR_MARGIN1 = 64; // 自己対局だとすごく強くなって見えるかもしれないが、まやかしである。 // 元の値 = 57 , step = 8 // [PARAM] min:0,max:1024,step:4,interval:2,time_rate:1, -PARAM_DEFINE PARAM_SINGULAR_MARGIN2 = 45; +PARAM_DEFINE PARAM_SINGULAR_MARGIN2 = 49; // // LMR @@ -202,18 +202,18 @@ PARAM_DEFINE PARAM_SINGULAR_MARGIN2 = 45; // LMRのパラメーター // 重要度 ★★★★☆ // 元の値 = 51 , step = 4 -// [PARAM] min:0,max:128,step:2,interval:2,time_rate:1, -PARAM_DEFINE PARAM_LMR_MARGIN1 = 51; +// [PARAM] min:0,max:128,step:1,interval:1,time_rate:1, +PARAM_DEFINE PARAM_LMR_MARGIN1 = 53; // 重要度 ★★☆☆☆ // → 重要なパラメーターではあるが、下手にいじらないほうがよさげ。 // 元の値 = 10 , step = 1 -// [PARAM] min:0,max:128,step:1,interval:2,time_rate:1, -PARAM_DEFINE PARAM_LMR_MARGIN2 = 13; +// [PARAM] min:0,max:128,step:1,interval:1,time_rate:1, +PARAM_DEFINE PARAM_LMR_MARGIN2 = 11; // 重要度 ★★★☆☆ // 元の値 = 700 , step = 100 -// [PARAM] min:0,max:1024,step:25,interval:2,time_rate:1, +// [PARAM] min:0,max:1024,step:4,interval:2,time_rate:1, PARAM_DEFINE PARAM_LMR_MARGIN3 = 700; @@ -228,11 +228,12 @@ PARAM_DEFINE PARAM_LMR_MARGIN3 = 700; PARAM_DEFINE PARAM_PRUNING_BY_HISTORY_DEPTH = 6; -// update_all_stats()で、静止探索時のquietMoveとみなすbestvalueとbetaの差(PAWN_VALUEより少し小さな値) +// update_all_stats()で、静止探索時のquietMoveとみなすbestvalueとbetaの差(PawnValueより少し小さな値) +// StockfishではPawnValueが210ぐらいなので、それを考慮すること。 // 重要度 ★★★☆☆ -// 元の値 = 90 , step = 30 -// [PARAM] min:10,max:200,step:10,interval:2,time_rate:1, -PARAM_DEFINE PARAM_UPDATE_ALL_STATS_EVAL_TH = 90; +// 元の値 = 168 , step = 30 +// [PARAM] min:10,max:200,step:5,interval:2,time_rate:1, +PARAM_DEFINE PARAM_UPDATE_ALL_STATS_EVAL_TH = 80; // @@ -242,8 +243,8 @@ PARAM_DEFINE PARAM_UPDATE_ALL_STATS_EVAL_TH = 90; // fail lowを引き起こしたcounter moveにbonus与える時のevalのmargin値。 // 重要度 ★★★☆☆ // 元の値 = 657 , step = 50 -// [PARAM] min:10,max:1000,step:15,interval:2,time_rate:1, -PARAM_DEFINE PARAM_COUNTERMOVE_FAILLOW_MARGIN = 657; +// [PARAM] min:10,max:1000,step:5,interval:2,time_rate:1, +PARAM_DEFINE PARAM_COUNTERMOVE_FAILLOW_MARGIN = 677; // aspiration searchの増加量。 diff --git a/source/engine/yaneuraou-engine/yaneuraou-search.cpp b/source/engine/yaneuraou-engine/yaneuraou-search.cpp index 14d6b6866..eccff4ea0 100644 --- a/source/engine/yaneuraou-engine/yaneuraou-search.cpp +++ b/source/engine/yaneuraou-engine/yaneuraou-search.cpp @@ -883,7 +883,10 @@ size_t multiPV = Options["MultiPV"]; // SkillLevelの実装 //Skill skill(Options["SkillLevel"], Options["USI_LimitStrength"] ? int(Options["USI_Elo"]) : 0); // ↑これでエンジンオプション2つも増えるのやだな…。気が向いたらサポートすることにする。 -Skill skill((int)Options["SkillLevel"], 0); +//Skill skill((int)Options["SkillLevel"], 0); + +Skill skill(20, 0); + // When playing with strength handicap enable MultiPV search that we will // use behind-the-scenes to retrieve a set of possible moves. diff --git a/source/position.cpp b/source/position.cpp index c2f245e5a..f2079957e 100644 --- a/source/position.cpp +++ b/source/position.cpp @@ -1849,6 +1849,7 @@ bool Position::see_ge(Move m, Value threshold) const // 駒の移動元(駒打ちの場合は)と移動先。 // dropのときにはSQ_NBにしておくことで、pieces() ^ fromを無効化するhack + // ※ piece_on(SQ_NB)で NO_PIECE が返ることは保証されている。 Square from = drop ? SQ_NB : from_sq(m); Square to = to_sq(m); @@ -1873,8 +1874,12 @@ bool Position::see_ge(Move m, Value threshold) const // なら、取り返されたところですでにしきい値以上になることは確定しているのでtrueが返せる。 //swap = PieceValue[piece_on(from)] - swap; - swap = Eval::PieceValue[type_of(piece_on(from))] - swap; - if (swap <= 0) + + // → 駒打ちの時は、移動元にその駒がないので、これを復元してやる必要がある。 + PieceType from_pt = drop ? move_dropped_piece(m) : type_of(piece_on(from)); + swap = Eval::PieceValue[from_pt] - swap; + + if (swap <= 0) return true; //assert(color_of(piece_on(from)) == sideToMove); @@ -2041,6 +2046,9 @@ bool Position::see_ge(Move m, Value threshold) const default: UNREACHABLE; break; } + // SEEって、最後、toの地点で成れるなら、その成ることによる価値上昇分も考慮すべきだと思うのだが、 + // そうすると早期枝刈りができないことになるので、とりあえず、このままでいいや。 + } return bool(res); @@ -2806,21 +2814,47 @@ void Position::UnitTest(Test::UnitTester& tester) // 平手初期化 hirate_init(); + // see_geのしきい値がv以下の時だけtrueが返ってくるかをテストする。 + // つまりはsee値がvであるかをテストする関数。 + auto see_ge_th = [&](int v) + { + Value th = Value(v); + bool all_ok = true; + all_ok &= pos.see_ge(m,th ); // see_ge(m, th) == true + all_ok &= !pos.see_ge(m,th + 1); // see_ge(m, 1) == false + all_ok &= pos.see_ge(m,th - 1); // see_ge(m, -1) == true + return all_ok; + }; + // 76歩、34歩の局面を作る。 m = pos.to_move(make_move16(SQ_77, SQ_76)); pos.do_move(m, s[0]); m = pos.to_move(make_move16(SQ_33, SQ_34)); pos.do_move(m, s[1]); // 22角成りの指し手について - m = pos.to_move(make_move16(SQ_88, SQ_22)); - // 角を取るが、同銀と取り返されて、駒の損得なし。 + m = pos.to_move(make_move_promote16(SQ_88, SQ_22)); + // 角を取るが、see値は、同銀と取り返されて、駒の損得なし。 + + tester.test("pos1move", see_ge_th(0)); + + pos.do_move(m, s[2]); + // 馬を取り返さずにあえて84歩 + m = pos.to_move(make_move16(SQ_83, SQ_24)); + pos.do_move(m, s[3]); + + // この局面で31馬は、同金とされて、(see値は)馬、銀の交換 = 馬を損して銀を得する + m = pos.to_move(make_move16(SQ_22, SQ_31)); + tester.test("pos2move", see_ge_th( - Eval::HorseValue + Eval::SilverValue )); + + // この局面で33角打ちは、同桂で同馬。(see値は)角損 + 桂得。 + m = pos.to_move(make_move_drop16(BISHOP, SQ_33)); + tester.test("pos2drop", see_ge_th( - Eval::BishopValue + Eval::KnightValue )); + + // この局面で33馬は、同桂でタダ。(see値は)馬損。 + m = pos.to_move(make_move16(SQ_22, SQ_33)); + tester.test("pos2move", see_ge_th(- Eval::HorseValue )); - bool all_ok = true; - all_ok &= pos.see_ge(m,VALUE_ZERO); // see_ge(m, 0) == true - all_ok &= !pos.see_ge(m,(Value)1); // see_ge(m, 1) == false - all_ok &= pos.see_ge(m,(Value)-1); // see_ge(m,-1) == true - tester.test("pos1", all_ok); } { diff --git a/source/position.h b/source/position.h index 4cd86971e..b168a27ff 100644 --- a/source/position.h +++ b/source/position.h @@ -266,6 +266,7 @@ class Position Thread* this_thread() const { return thisThread; } // 盤面上の駒を返す。 + // ※ sq == SQ_NBの時、NO_PIECEが返ることは保証されている。 Piece piece_on(Square sq) const { ASSERT_LV3(sq <= SQ_NB); return board[sq]; } // ある升に駒がないならtrueを返す。