Author: scott farrell
Date: 09:20:24 09/21/02
I was just fiddling with my move ordering (as we all do from time to time).
I found that my MVVLVA code worsened (is that a word?) my move ordering, and
slow my searches significantly.
I altered it to just simply ordering the capture by the size of the material it
is to take, disregarding the size of the piece to perform the capture.
As far as I know current wisdom for move ordering is something like this:
1. from hastable first
2. killers next
3. winning captures ordered by MVVLVA
4. other moves
5. losing captures
My updated move ordering is:
1. from hastable first
2. killers next
3. all captures, ordered by the size of the captured piece (largest first), and
ties broken by size of attacker only
4. other moves
5. losing captures
I havent looked into to hard just yet, but I am pretty sure its got something to
do with search extensions, and recapture extensions. Running all the captures
first allows the extensions to kick in quickly and cause lots of nice cutoffs.
The other thing it might be is a bug in my code - and turning off the MVVLVA
ordering of capture bypassed the bug, but its only a few lines, and I dont think
there is any bugs.
What do you all think? am I crazy, do I have a bug, or are some programs already
doing this?
Scott
Here is my old code:
if (moves[depthTree][i].capture > 0)
{
//black is capturing a white piece
if (b.isAttacked(moves[depthTree][i].s2, Board.WHITE))
moves[depthTree][i].searchOrder
+= (Board.pieceValues[moves[depthTree][i].capture]
- Board.pieceValues[
- moves[depthTree][i].piece])
* 100000 ;
else
//enpris
moves[depthTree][i].searchOrder
+= Board.pieceValues[moves[depthTree][i].capture]
* 100000 ;
} else if (moves[depthTree][i].capture < 0)
{
//white is capturing a black
if (b.isAttacked(moves[depthTree][i].s2, Board.BLACK))
moves[depthTree][i].searchOrder
+= (Board.pieceValues[-moves[depthTree][i].capture]
- Board.pieceValues[moves[depthTree][i].piece])
* 100000 ;
else
//enpris
moves[depthTree][i].searchOrder
+= Board.pieceValues[-moves[depthTree][i].capture]
* 100000 ;
}
and my new code that is much much better at ordering:
if (moves[depthTree][i].capture > 0)
{
moves[depthTree][i].searchOrder
+= (Board.pieceValues[moves[depthTree][i].capture] +
moves[depthTree][i].piece)
* 1000;
} else
{
moves[depthTree][i].searchOrder
+= (Board.pieceValues[-moves[depthTree][i].capture] -
moves[depthTree][i].piece)
* 1000;
}
This page took 0.01 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.