1
0
Fork 0

Two steps slider threats on queen

Allow a potential slider threat from a square currently occupied
by a harmless attacker, just as the recent "knight on queen" patch.
Also from not completely safe squares, use the mobilityArea instead
of excluding all pawns for both SlidersOnQueen and KnightOnQueen

We now compute the potential sliders threat on queen only if opponent
has one queen.

Run as SPRT [0,4] since it is some kind of simplification but maybe
not clearly one.

STC:
http://tests.stockfishchess.org/tests/view/5aa1ddf10ebc590297cb63d8
LLR: 2.95 (-2.94,2.94) [0.00,4.00]
Total: 22997 W: 4817 L: 4570 D: 13610

LTC:
http://tests.stockfishchess.org/tests/view/5aa1fe6b0ebc590297cb63e5
LLR: 2.95 (-2.94,2.94) [0.00,4.00]
Total: 11926 W: 1891 L: 1705 D: 8330

After this patch is committed, we may try to:

• re-introduce some "threat by queen" bonus to make Stockfish's queen
  more aggressive (attacking aspect)

• introduce a concept of "queen overload" to force the opponent queen
  into passivity and protecting duties (defensive aspect)

• more generally, re-tune the queen mobility array since patches in the
  last three months have affected a lot the location/activity of queens.

Closes https://github.com/official-stockfish/Stockfish/pull/1473

bench: 5788691
pull/1474/merge
Alain SAVARD 2018-03-08 20:04:33 -05:00 committed by Stéphane Nicolet
parent 82697f1193
commit 1093047e7d
2 changed files with 13 additions and 22 deletions

View File

@ -172,10 +172,10 @@ namespace {
const Score MinorBehindPawn = S( 16, 0);
const Score PawnlessFlank = S( 20, 80);
const Score RookOnPawn = S( 8, 24);
const Score SliderOnQueen = S( 42, 21);
const Score ThreatByPawnPush = S( 47, 26);
const Score ThreatByRank = S( 16, 3);
const Score ThreatBySafePawn = S(175,168);
const Score ThreatOnQueen = S( 42, 21);
const Score TrappedBishopA1H1 = S( 50, 50);
const Score TrappedRook = S( 92, 0);
const Score WeakQueen = S( 50, 10);
@ -211,7 +211,7 @@ namespace {
// attackedBy[color][piece type] is a bitboard representing all squares
// attacked by a given color and piece type. Special "piece types" which
// are also calculated are QUEEN_DIAGONAL and ALL_PIECES.
// is also calculated is ALL_PIECES.
Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB];
// attackedBy2[color] are the squares attacked by 2 pieces of a given color,
@ -297,9 +297,6 @@ namespace {
attackedBy[Us][Pt] = 0;
if (Pt == QUEEN)
attackedBy[Us][QUEEN_DIAGONAL] = 0;
while ((s = *pl++) != SQ_NONE)
{
// Find attacked squares, including x-ray attacks for bishops and rooks
@ -314,9 +311,6 @@ namespace {
attackedBy[Us][Pt] |= b;
attackedBy[Us][ALL_PIECES] |= b;
if (Pt == QUEEN)
attackedBy[Us][QUEEN_DIAGONAL] |= b & PseudoAttacks[BISHOP][s];
if (b & kingRing[Them])
{
kingAttackersCount[Us]++;
@ -589,22 +583,20 @@ namespace {
score += ThreatByPawnPush * popcount(b);
// Bonus for safe slider threats on the next move toward enemy queen
safeThreats = ~pos.pieces(Us) & ~attackedBy2[Them] & attackedBy2[Us];
b = (attackedBy[Us][BISHOP] & attackedBy[Them][QUEEN_DIAGONAL])
| (attackedBy[Us][ROOK ] & attackedBy[Them][QUEEN] & ~attackedBy[Them][QUEEN_DIAGONAL]);
score += ThreatOnQueen * popcount(b & safeThreats);
// Bonus for knight threats on the next moves against enemy queen
// Bonus for threats on the next moves against enemy queen
if (pos.count<QUEEN>(Them) == 1)
{
b = pos.attacks_from<KNIGHT>(pos.square<QUEEN>(Them))
& attackedBy[Us][KNIGHT]
& ~pos.pieces(Us, PAWN, KING)
& ~stronglyProtected;
Square s = pos.square<QUEEN>(Them);
safeThreats = mobilityArea[Us] & ~stronglyProtected;
score += KnightOnQueen * popcount(b);
b = attackedBy[Us][KNIGHT] & pos.attacks_from<KNIGHT>(s);
score += KnightOnQueen * popcount(b & safeThreats);
b = (attackedBy[Us][BISHOP] & pos.attacks_from<BISHOP>(s))
| (attackedBy[Us][ROOK ] & pos.attacks_from<ROOK >(s));
score += SliderOnQueen * popcount(b & safeThreats & attackedBy2[Us]);
}
if (T)

View File

@ -195,7 +195,6 @@ enum Value : int {
enum PieceType {
NO_PIECE_TYPE, PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING,
ALL_PIECES = 0,
QUEEN_DIAGONAL = 7,
PIECE_TYPE_NB = 8
};