Skip to content

Commit

Permalink
- see_geのコード間違っていたの修正。
Browse files Browse the repository at this point in the history
- see_geのUnitTest書いた。
- skill level関連で、assertに引っかかってたの修正。
  • Loading branch information
yaneurao committed Nov 5, 2023
1 parent a2f5d27 commit f0863ea
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 51 deletions.
83 changes: 42 additions & 41 deletions source/engine/yaneuraou-engine/yaneuraou-param.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;


Expand All @@ -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。
Expand All @@ -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;


Expand All @@ -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;



Expand All @@ -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
Expand All @@ -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
Expand All @@ -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;


Expand All @@ -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;


//
Expand All @@ -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の増加量。
Expand Down
5 changes: 4 additions & 1 deletion source/engine/yaneuraou-engine/yaneuraou-search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
52 changes: 43 additions & 9 deletions source/position.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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);
Expand Down Expand Up @@ -2041,6 +2046,9 @@ bool Position::see_ge(Move m, Value threshold) const
default: UNREACHABLE; break;
}

// SEEって、最後、toの地点で成れるなら、その成ることによる価値上昇分も考慮すべきだと思うのだが、
// そうすると早期枝刈りができないことになるので、とりあえず、このままでいいや。

}

return bool(res);
Expand Down Expand Up @@ -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);
}

{
Expand Down
1 change: 1 addition & 0 deletions source/position.h
Original file line number Diff line number Diff line change
Expand Up @@ -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を返す。
Expand Down

0 comments on commit f0863ea

Please sign in to comment.