Quiesce Search Move Ordering
Posted: 18 Mar 2005, 17:21
We've had a several posts on quiesce of late.
Here are some of my learnings from NoonianChess and Telepath.
1) Don't replace Quiesce with SEE -- it doesn't work well
2) there are two ways one might implement MVV/LVA for move ordering
2a) value of captured piece - value of capuring piece
2b) value of captured piece - small percentage of capturing piece
This puts all captures of the queen (inclucing qxq) ahead
of captures of rooks .....
Version 2b produces a 1.5x speedup over 2a.
I was clued into this in a converation with Gian-Carlo, Andrew
Williams and Peter McKenzie.
Just a casual converation at WCCC led to a 2x speedup overnight.
This is one of the major advantages of attending face-to-face
events.
3) You can not blindly prune inferior captures.
I tried it and have some counter examples to prove its bad.
I am defining an inferior capture as big piece takes smaller piece
and no search or SEE is done.
You get a nice speed up but the engine performs worse.
4) Using SEE for all move ordering produces better
ordering but doesn't speed things up due to overhead of SEE.
5) The best use of SEE in Quiesce seems to be only for inferior
captures. You can use it for move ordering or for pruning the
inferior captures.
6) I've not recently tried transposition tables in quiesce and don't
remember what my results were. They are logged in a journal.
7) I've not recently tried tracking the PV in Quiesce and putting the
PV first. Seems this would work well as it is quite efficient to track
even without hashtables.
8) Early versions of a program may produce all moves for quiesce and
search only captures and promos ...
This is quite inefficient as you waste time generating the moves and
ordering the noncaptures to the tail of the list. Better to generate
only what you need.
9) I had an early version of NoonianChess generating moves
completely on demand. It generated one move, searched it,
generated the next, searched it ......
This didn't not work well as I didn't get the ordering well.
I am coding an experiement to tell me the average branchfactor in
a full quiesce search. Full meaning search all captures and promos.
Knowing the average branchfactor in Quiesce might shed some light
on how much cost in move ordering is worth the effort.
Here are some of my learnings from NoonianChess and Telepath.
1) Don't replace Quiesce with SEE -- it doesn't work well
2) there are two ways one might implement MVV/LVA for move ordering
2a) value of captured piece - value of capuring piece
2b) value of captured piece - small percentage of capturing piece
This puts all captures of the queen (inclucing qxq) ahead
of captures of rooks .....
Version 2b produces a 1.5x speedup over 2a.
I was clued into this in a converation with Gian-Carlo, Andrew
Williams and Peter McKenzie.
Just a casual converation at WCCC led to a 2x speedup overnight.
This is one of the major advantages of attending face-to-face
events.
3) You can not blindly prune inferior captures.
I tried it and have some counter examples to prove its bad.
I am defining an inferior capture as big piece takes smaller piece
and no search or SEE is done.
You get a nice speed up but the engine performs worse.
4) Using SEE for all move ordering produces better
ordering but doesn't speed things up due to overhead of SEE.
5) The best use of SEE in Quiesce seems to be only for inferior
captures. You can use it for move ordering or for pruning the
inferior captures.
6) I've not recently tried transposition tables in quiesce and don't
remember what my results were. They are logged in a journal.
7) I've not recently tried tracking the PV in Quiesce and putting the
PV first. Seems this would work well as it is quite efficient to track
even without hashtables.
8) Early versions of a program may produce all moves for quiesce and
search only captures and promos ...
This is quite inefficient as you waste time generating the moves and
ordering the noncaptures to the tail of the list. Better to generate
only what you need.
9) I had an early version of NoonianChess generating moves
completely on demand. It generated one move, searched it,
generated the next, searched it ......
This didn't not work well as I didn't get the ordering well.
I am coding an experiement to tell me the average branchfactor in
a full quiesce search. Full meaning search all captures and promos.
Knowing the average branchfactor in Quiesce might shed some light
on how much cost in move ordering is worth the effort.