Skip to content

Commit

Permalink
- MVV/LVAのLVAの処理が間違っていたの修正。
Browse files Browse the repository at this point in the history
  • Loading branch information
yaneurao committed Nov 4, 2023
1 parent 1fcbef3 commit dd35451
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 2 deletions.
2 changes: 1 addition & 1 deletion source/engine/yaneuraou-engine/yaneuraou-search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1965,7 +1965,7 @@ Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, boo
// TODO : ここのパラメーター調整するか考える。
// → ~1 Eloだとなー。

if (eval < alpha - 474 - (270 - 174 * ((ss+1)->cutoffCnt > 3)) * depth * depth)
if (eval < alpha - 474 - (270 - 174 * ((ss + 1)->cutoffCnt > 3)) * depth * depth)
{
value = qsearch<NonPV>(pos, ss, alpha - 1, alpha);
if (value < alpha)
Expand Down
2 changes: 2 additions & 0 deletions source/evaluate.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ namespace Eval {
// 駒の価値のテーブル
// ※ 後手の駒は負の値なので注意。
// → 後手の駒に対してプラスの値が欲しいなら、PieceValue[type_of(pc)]のようにする。
// StockfishのPieceValue()は、負の値は帰ってこないので注意。
extern int PieceValue[PIECE_NB];

// 駒の交換値(=捕獲したときの価値の上昇値)
Expand All @@ -102,6 +103,7 @@ namespace Eval {

// 指し手moveによってtoの地点の駒が捕獲できることがわかっている時の、駒を捕獲する価値
// moveが成りの指し手である場合、その価値も上乗せして計算する。
// ※ to_sq(move)に駒がない場合もこの関数の呼び出しは合法。(VALUE_NONEが返る)
extern Value CapturePieceValuePlusPromote(const Position& pos, Move move);

#endif
Expand Down
16 changes: 15 additions & 1 deletion source/movepick.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -327,13 +327,27 @@ void MovePicker::score()
{
// 王手回避の指し手をスコアリングする。

//if (pos.capture_stage(m))
if (pos.capture_or_pawn_promotion(m))
// 捕獲する指し手に関しては簡易SEE + MVV/LVA
// 被害が小さいように、LVA(価値の低い駒)を動かして取ることを優先されたほうが良いので駒に価値の低い順に番号をつける。そのためのテーブル。
// ※ LVA = Least Valuable Aggressor。cf.MVV-LVA

// ここ、moved_piece_before()を用いるのが正しい。
// そうしておかないと、同じto,fromである角成りと角成らずの2つの指し手がある時、
// moved_piece_after()だと、角成りの方は、取られた時の損失が多いとみなされてしまい、
// オーダリング上、後回しになってしまう。

//m.value = PieceValue[pos.piece_on(to_sq(m))] - Value(type_of(pos.moved_piece(m)))
// + (1 << 28);

// 上記のStockfishのコードのValue()は関数ではなく単にValue型へcastしているだけ。
// 駒番号順に価値が低いと考えて(普通は成り駒ではないから)、LVAとしてそれを優先して欲しいという意味。

m.value = (Value)Eval::CapturePieceValue[pos.piece_on(to_sq(m))]
- Eval::PieceValue[type_of(pos.moved_piece_after(m))]
- (Eval::PieceValue[type_of(pos.moved_piece_before(m))]/16)
// → /32 は、価値の低い駒にして欲しいが、まずはCapturePieceValueの大きな順になって欲しいので、
// スケールを小さくしている。
+ (1 << 28);

else
Expand Down

0 comments on commit dd35451

Please sign in to comment.