From: Alain SAVARD Date: Tue, 3 Apr 2018 21:55:52 +0000 (+0200) Subject: Remove the Queen from the mobility area of minor pieces X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=04a228f9c83dafde1953e43b1906fc0929832976 Remove the Queen from the mobility area of minor pieces In master, we already remove the King from the mobility area of minor pieces because the King simply stands in the way of other pieces, and since opponent cannot capture the King, any piece which "protects" the King cannot recapture. Similarly, this patch introduces the idea that it is rarely a need for a Queen to be "protected" by a minor (unless it is attacked only by a Queen, in fact). We used to have a LoosePiece bonus, and in a similar vein the Queen was excluded from that penalty. Idea came when reviewing an old game of Kholmov. He was a very good midgame player, but in the opening his misplace his Queen (and won in the end :-) : http://www.chessgames.com/perl/chessgame?gid=1134645 Both white queen moves 10.Qd3 and 13.Qb3 are in the way of some minor piece. I would prefer to not give a bishop mobility bonus at move 10 for the square d3, or later a knight mobility bonus at move 13 for the square b3. And the textbook move is 19.Qe3! which prepares 20.Nb3. This short game sample shows how much a queen can be "in the way" of minor pieces. STC http://tests.stockfishchess.org/tests/view/5ac2c15f0ebc591746423fa3 LLR: 2.96 (-2.94,2.94) [0.00,5.00] Total: 22066 W: 4561 L: 4330 D: 13175 LTC http://tests.stockfishchess.org/tests/view/5ac2d6500ebc591746423faf LLR: 2.96 (-2.94,2.94) [0.00,5.00] Total: 25871 W: 3953 L: 3738 D: 18180 Closes https://github.com/official-stockfish/Stockfish/pull/1532 Ideas for future work in this area: • tweak some more mobility areas for other piece type. • construct a notion of global mobility for the whole piece set. • bad bishops. Bench: 4989125 --- diff --git a/src/evaluate.cpp b/src/evaluate.cpp index e39bcb4a..41c66812 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -300,6 +300,7 @@ namespace { Bitboard b, bb; Square s; Score score = SCORE_ZERO; + int mob; attackedBy[Us][Pt] = 0; @@ -324,7 +325,8 @@ namespace { kingAttacksCount[Us] += popcount(b & attackedBy[Them][KING]); } - int mob = popcount(b & mobilityArea[Us]); + mob = (Pt == KNIGHT || Pt == BISHOP) ? popcount(b & mobilityArea[Us] & ~pos.pieces(Us, QUEEN)) + : popcount(b & mobilityArea[Us]); mobility[Us] += MobilityBonus[Pt - 2][mob];