mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-20 00:56:39 +08:00
MovePicker: introduce per square MVV/LVA ordering
Just added the infrastructure, no functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
@@ -134,6 +134,7 @@ Move MovePicker::get_next_move() {
|
|||||||
case PH_GOOD_CAPTURES:
|
case PH_GOOD_CAPTURES:
|
||||||
numOfMoves = generate_captures(pos, moves);
|
numOfMoves = generate_captures(pos, moves);
|
||||||
score_captures();
|
score_captures();
|
||||||
|
capSquares = EmptyBoardBB;
|
||||||
movesPicked = 0;
|
movesPicked = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -289,7 +290,10 @@ void MovePicker::score_qcaptures() {
|
|||||||
|
|
||||||
|
|
||||||
/// find_best_index() loops across the moves and returns index of
|
/// find_best_index() loops across the moves and returns index of
|
||||||
/// the highest scored one.
|
/// the highest scored one. There is also a second version that
|
||||||
|
/// lowers the priority of moves that attack the same square,
|
||||||
|
/// so that if the best move that attack a square fails the next
|
||||||
|
/// move picked attacks a different square if any, not the same one.
|
||||||
|
|
||||||
int MovePicker::find_best_index() {
|
int MovePicker::find_best_index() {
|
||||||
|
|
||||||
@@ -304,6 +308,43 @@ int MovePicker::find_best_index() {
|
|||||||
return bestIndex;
|
return bestIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int MovePicker::find_best_index(Bitboard* squares, int values[]) {
|
||||||
|
|
||||||
|
int hs;
|
||||||
|
Move m;
|
||||||
|
Square to;
|
||||||
|
int bestScore = -10000000, bestIndex = -1;
|
||||||
|
|
||||||
|
for (int i = movesPicked; i < numOfMoves; i++)
|
||||||
|
{
|
||||||
|
m = moves[i].move;
|
||||||
|
to = move_to(m);
|
||||||
|
|
||||||
|
if (!bit_is_set(*squares, to))
|
||||||
|
{
|
||||||
|
// Init at first use
|
||||||
|
set_bit(squares, to);
|
||||||
|
values[to] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hs = moves[i].score - values[to];
|
||||||
|
if (hs > bestScore)
|
||||||
|
{
|
||||||
|
bestIndex = i;
|
||||||
|
bestScore = hs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bestIndex != -1)
|
||||||
|
{
|
||||||
|
// Raise value of the picked square, so next attack
|
||||||
|
// to the same square will get low priority.
|
||||||
|
to = move_to(moves[bestIndex].move);
|
||||||
|
values[to] += 0xB00;
|
||||||
|
}
|
||||||
|
return bestIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// MovePicker::pick_move_from_list() picks the move with the biggest score
|
/// MovePicker::pick_move_from_list() picks the move with the biggest score
|
||||||
/// from a list of generated moves (moves[] or badCaptures[], depending on
|
/// from a list of generated moves (moves[] or badCaptures[], depending on
|
||||||
|
|||||||
@@ -77,11 +77,14 @@ private:
|
|||||||
void score_qcaptures();
|
void score_qcaptures();
|
||||||
Move pick_move_from_list();
|
Move pick_move_from_list();
|
||||||
int find_best_index();
|
int find_best_index();
|
||||||
|
int MovePicker::find_best_index(Bitboard* squares, int values[]);
|
||||||
|
|
||||||
const Position& pos;
|
const Position& pos;
|
||||||
Move ttMove, mateKiller, killer1, killer2;
|
Move ttMove, mateKiller, killer1, killer2;
|
||||||
Bitboard pinned, dc;
|
Bitboard pinned, dc;
|
||||||
MoveStack moves[256], badCaptures[64];
|
MoveStack moves[256], badCaptures[64];
|
||||||
|
Bitboard capSquares;
|
||||||
|
int capSqValues[64];
|
||||||
bool pvNode;
|
bool pvNode;
|
||||||
Depth depth;
|
Depth depth;
|
||||||
int phaseIndex;
|
int phaseIndex;
|
||||||
|
|||||||
Reference in New Issue
Block a user