Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: SEE Result

Author: Stuart Cracraft

Date: 11:08:18 08/12/04

Go up one level in this thread


On August 12, 2004 at 14:02:27, Tony Werten wrote:

>On August 12, 2004 at 13:24:37, Stuart Cracraft wrote:
>
>>On August 12, 2004 at 10:42:20, Tony Werten wrote:
>>
>>>On August 12, 2004 at 10:18:45, Stuart Cracraft wrote:
>>>
>>>>Here is the result of the 30 second per position test on 300 positions
>>>>using nothing, see>=0 to search a capture, see having to bring the score
>>>>within alpha and a margin (futility/delta), and with both.
>>>
>>>I'm not sure how it is usually done, but I don't think it is safe to prune the
>>>see score against alpha but rather the captured piece value. Else it makes your
>>>qsearch even more blind.
>>>
>>Hi Tony,
>>
>>What I do is this:
>>
>>quiesce
>>:
>>  baseval = eval(bd);
>>:
>>  while next capture move available; do
>>#define MARGIN 200     // 200 millipawns, 1000 = 1 pawn in my program
>>    delta = MAX(alpha-MARGIN-baseval,0);
>>    seeok=see(bd,qml[mvi].to);
>>    if (seeok < delta || seeok < 0) { skip this capture move }
>>    else {
>>      make capture move
>>      search capture move
>>      unmake capture move
>>      look for cutoff, etc.
>>    }
>>  endwhile
>>endquiesce
>
>Funny, we have quite a different way of writing code. But what I mean is a safer
>way of the pruning.
>
>quiesce
>:
>  baseval = eval(bd);
>:
>  while next capture move available; do
>#define MARGIN 200     // 200 millipawns, 1000 = 1 pawn in my program
>
>    //delta = MAX(alpha-MARGIN-baseval,0); no need for delta variable
>    seeok=see(bd,qml[mvi].to);
>    if (baseeval+pieceval[qml[mvi].captured_piece]<alpha || seeok < 0) { skip
>this capture move }
>    else {
>      make capture move
>      search capture move
>      unmake capture move
>      look for cutoff, etc.
>    }
>  endwhile
>endquiesce
>
>
>>
>>The part about the delta is the same as what GNU 5 presently does.
>>The other part of seeok < 0 is based on Bob
>>I am thinking that instead of using MARGIN of 200 I should just use
>>maxposnscore[sidetomove] since this is a dynamic maximum positional
>>score calculated for the side on move.
>
>That would be the safe way.
>
>>
>>The above, separately and together, have been tested and do not provide
>>any huge improvement over using neither in a fixed time search. However,
>>in long fixed depth searches a 50% nodes reduction and 50% time reduction
>>has been seen.
>
>I believe it can safe a lot of nodes, I would be more worried however about the
>loss of precision. ie a rook exchange, wich would score -500, when alpha is 0.
>Your code says: prune it, the opponent recaptures and we are still below alpha.
>My code would say: if the opponent can't recapture we are way above alpha, so
>give it a try.
>
>Tony
>
>>
>>Stuart

Others have said that this:

baseeval+pieceval[qml[mvi].captured_piece]<alpha

is unsafe.

You have to include a full see() in that exchange, like I do, for
it to be safe.

If you don't, you are unsafe. The entire line of captures including
standpat needs to be used for the futility pruning / delta pruning.
A single piecevalue is no good, nor a piecevalue plus a recapture, etc.
That is limited non-see and no good.

Stuart



This page took 0 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.