From 84081ea304cf88a433699cb9c2554ca438a0ba1d Mon Sep 17 00:00:00 2001 From: yaneurao Date: Tue, 17 Oct 2023 12:42:59 +0900 Subject: [PATCH] =?UTF-8?q?-=20Step=208.=20Futility=20pruning=E3=81=AE?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E8=AA=BF=E6=95=B4=E3=80=82=20-=20PARAM=5FFUT?= =?UTF-8?q?ILITY=5FRETURN=5FDEPTH=208=E2=86=929=E3=81=AB=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=20-=20futility=5Fmargin=E9=96=A2=E6=95=B0=E3=80=81=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit // Futility margin Value futility_margin(Depth d, bool improving) { return Value(168 * (d - improving)); } ↓ Value futility_margin(Depth d, bool noTtCutNode, bool improving) { return Value((126 - 42 * noTtCutNode) * (d - improving)); } - PARAM_FUTILITY_MARGIN_ALPHA2追加。 --- .../engine/yaneuraou-engine/yaneuraou-param.h | 14 +++++++--- .../yaneuraou-engine/yaneuraou-search.cpp | 27 ++++++++++++------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/source/engine/yaneuraou-engine/yaneuraou-param.h b/source/engine/yaneuraou-engine/yaneuraou-param.h index b7a4b8358..0bdeab038 100644 --- a/source/engine/yaneuraou-engine/yaneuraou-param.h +++ b/source/engine/yaneuraou-engine/yaneuraou-param.h @@ -30,10 +30,14 @@ // // 深さに比例したfutility pruning -// 元の値 = 168 , step = 20 +// 元の値 = 126 , step = 20 // [PARAM] min:100,max:300,step:10,interval:1,time_rate:1,fixed -PARAM_DEFINE PARAM_FUTILITY_MARGIN_ALPHA1 = 168; +PARAM_DEFINE PARAM_FUTILITY_MARGIN_ALPHA1 = 126; +// 深さに比例したfutility pruning +// 元の値 = 42 , step = 4 +// [PARAM] min:10,max:200,step:10,interval:1,time_rate:1,fixed +PARAM_DEFINE PARAM_FUTILITY_MARGIN_ALPHA2 = 42; // // 元の値 = 138 , step = 20 @@ -48,9 +52,11 @@ PARAM_DEFINE PARAM_FUTILITY_MARGIN_QUIET = 118; // futility pruningの適用depth。 // この制限自体が要らない可能性がある。→ そうでもなかった。 -// 元の値 = 8 , step = 1 +// 元の値 = 9 , step = 1 // [PARAM] min:5,max:15,step:1,interval:1,time_rate:1,fixed -PARAM_DEFINE PARAM_FUTILITY_RETURN_DEPTH = 8; +PARAM_DEFINE PARAM_FUTILITY_RETURN_DEPTH = 9; + + // 親nodeでのfutilityの適用depth。 // この枝刈り、depthの制限自体が要らないような気がする。→ そうでもなかった。 diff --git a/source/engine/yaneuraou-engine/yaneuraou-search.cpp b/source/engine/yaneuraou-engine/yaneuraou-search.cpp index d7a5cebd7..d7f0ea5f2 100644 --- a/source/engine/yaneuraou-engine/yaneuraou-search.cpp +++ b/source/engine/yaneuraou-engine/yaneuraou-search.cpp @@ -198,11 +198,10 @@ namespace { enum NodeType { NonPV, PV , Root}; // Futility margin - // RazoringはStockfish12で効果がないとされてしまい除去された。 - // depth(残り探索深さ)に応じたfutility margin。 - Value futility_margin(Depth d, bool improving) { - return Value(PARAM_FUTILITY_MARGIN_ALPHA1/*168*/ * (d - improving)); + // ※ RazoringはStockfish12で効果がないとされてしまい除去された。 + Value futility_margin(Depth d, bool noTtCutNode, bool improving) { + return Value((PARAM_FUTILITY_MARGIN_ALPHA1/*126*/ - PARAM_FUTILITY_MARGIN_ALPHA2/*42*/ * noTtCutNode) * (d - improving)); } // 【計測資料 30.】 Reductionのコード、Stockfish 9と10での比較 @@ -1881,12 +1880,14 @@ namespace { } // ----------------------- - // Step 8. Futility pruning: child node (~25 Elo). - // The depth condition is important for mate finding. + // Step 8. Futility pruning: child node (~40 Elo) // ----------------------- // Futility pruning : 子ノード (王手がかかっているときはスキップする) + // The depth condition is important for mate finding. + // depthの条件は詰みを発見するために重要である。 + // このあとの残り探索深さによって、評価値が変動する幅はfutility_margin(depth)だと見積れるので // evalからこれを引いてbetaより大きいなら、beta cutが出来る。 // ただし、将棋の終盤では評価値の変動の幅は大きくなっていくので、進行度に応じたfutility_marginが必要となる。 @@ -1896,15 +1897,21 @@ namespace { // Stockfish10でnonPVにのみの適用に変更になった。 if ( !ss->ttPv - && depth < PARAM_FUTILITY_RETURN_DEPTH/*8*/ - && eval - futility_margin(depth, improving) - (ss - 1)->statScore / 256 >= beta + && depth < 9 + && eval - futility_margin(depth, cutNode && !ss->ttHit, improving) - (ss-1)->statScore / 321 >= beta && eval >= beta - && eval < 29462) // smaller than TB wins + && eval < 29462 // smaller than TB wins + && !( !ttCapture + && ttMove + && thisThread->mainHistory[us][from_to(ttMove)] < 989)) // 29462の根拠はよくわからないが、VALUE_TB_WIN_IN_MAX_PLY より少し小さい値にしたいようだ。 // そこまではfutility pruningで枝刈りして良いと言うことなのだろう。 // また、詰み絡み等だとmate distance pruningで枝刈りされるはずで、ここでは枝刈りしない。 - + + // ※ 統計値(mainHistoryとかstatScoreとか)のしきい値に関しては、やねうら王ではStockfishから調整しないことにしているので、 + // 上のif式に出てくる定数については調整しないことにする。 + return eval; // 次のようにするより、単にevalを返したほうが良いらしい。 // return eval - futility_margin(depth);