Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: SEE did not help me

Author: Stuart Cracraft

Date: 09:36:03 08/07/04

Go up one level in this thread


Also, I should add that the other reason (besides
my attacker/defender-finding code being no master
than my makemv()) that SEE() may not work for me
is that my evaluation is purely pc/sq. I do no
other evaluation besides material and pc/sq.

I think SEE() works best with full evaluation due
to reduced evaluations and bitboards due to faster
attack/defense -- hopefully others see this also.

On August 07, 2004 at 12:32:27, Stuart Cracraft wrote:

>On August 07, 2004 at 06:46:15, Alessandro Damiani wrote:
>
>>
>>>The use of SEE was in the quiescence search only and
>>>involved rejecting any search of a capture whose SEE
>>>value to the to square of the capture was <0, otherwise
>>>the move would be made, legality tested, and if legal,
>>>then the recursive capture search performed (with the
>>>same see test.)
>>>
>>
>>After having corrected your SEE you can speed up your qsearch the following
>>ways:
>>
>>Variant 1:
>>Only moves that improve the score are searched.
>>
>>int quiescence(int alpha, int beta)
>>{
>>    int posValue;
>>    int value;
>>    int best;
>>    int i, n;
>>
>>    posValue= evaluatePosition();
>>    if (posValue >= beta) return posValue;
>>
>>    best= posValue
>>    if (best > alpha) alpha= best;
>>
>>    n= genQuiescenceMoves();
>>    for (i = 0; i < n; i++) {
>>        // we assume move[i] is the move to be searched
>>
>>        // determine the win limit:
>>        value= winLimit(posValue, move[i]);
>>
>>        if (value > alpha) {
>>            make(move[i]);
>>            value= -quiescence(-beta, -alpha);
>>            unmake(move[i]);
>>
>>            // beta cut-off?
>>            if (value >= beta) return value;
>>        }
>>        else  {
>>            // it applies: value is the win limit and the win limit is not
>>enough
>>            // skip search
>>        };
>>
>>        if (value > best) {
>>            best= value;
>>            if (best > alpha) {
>>                // new PV
>>                alpha= best;
>>            }
>>        }
>>    };
>>
>>    return best
>>}
>>
>>Variant 2:
>>In addition to searching only moves that improve the score, this variant also
>>uses its knowledge to make the (alpha, beta) window of the subsequent search
>>smaller. This is more aggressive. The differences between this variant and the
>>previous one are highlighted with arrows ("-->" and "^^^^").
>>
>>int quiescence(int alpha, int beta)
>>{
>>    int posValue;
>>    int value;
>>    int best;
>>    int i, n;
>>
>>    posValue= evaluatePosition();
>>    if (posValue >= beta) return posValue;
>>
>>    best= posValue
>>    if (best > alpha) alpha= best;
>>
>>    n= genQuiescenceMoves();
>>    for (i = 0; i < n; i++) {
>>        // we assume move[i] is the move to be searched
>>
>>        // determine the win limit:
>>        value= winLimit(posValue, move[i]);
>>
>>        if (value > alpha) {
>>-->         // limit the search's beta to winlimit if possible:
>>-->         if (value > beta) value= beta;
>>
>>            make(move[i]);
>>-->         value= -quiescence(-value, -alpha);
>>                               ^^^^^^^
>>            unmake(move[i]);
>>
>>            // beta cut-off?
>>            if (value >= beta) return value;
>>        }
>>        else  {
>>            // it applies: value is the win limit and the win limit is not
>>enough
>>            // skip search
>>        };
>>
>>        if (value > best) {
>>            best= value;
>>            if (best > alpha) {
>>                // new PV
>>                alpha= best;
>>            }
>>        }
>>    };
>>
>>    return best
>>}
>>
>>A possible implementation of the function winLimit() looks as follows
>>
>>int winLimit(int posValue, Move m)
>>{
>>    int winLimit;
>>
>>    winLimit= posValue + SEE(m) + POSITIONAL_MARGIN;
>>
>>    if (isPromotion(m) {
>>        winLimit+= val(promotionPiece(m)) - val(PAWN);
>>    };
>>
>>    return winLimit;
>>}
>>
>>The constant POSITIONAL_MARGIN can be used to avoid not playing good captures.
>>For instance, SEE(m) = 0, but the capture increases the positional score a lot.
>>Such a capture would not be searched in the case of POSITIONAL_MARGIN = 0. This
>>constant can also be made depend on the distance from the current ply to the
>>root of the quiescence tree: the farer away from the root of the quiescence
>>tree, the less the positional margin, hence being more selective.
>>
>>All this stuff is basics. Take it as a good starting point. There are a lot of
>>degrees of freedom here, as usual in computer chess. Enjoy!
>>
>>Alessandro
>
>Thanks much for the above -- I tried many variants of the above and
>also exactly as above. My program did not speed up. It slowed down.
>It is not a bitboard routine and I fear that SEE() may not help it
>due to the cost of determining attacks to a square (not much
>more expensive than making a move with makemv) so from its point
>of view, the capture search is faster without SEE() than with,
>even though it looks like more nudes get pruned, because of the
>cost of SEE() relative to my MAKEMV().
>
>I hope that makes sense.
>
>I tried your variant 1 and your variant 2 and also with various levels
>of positional margin from 0 pawns to 3 pawns. My fastest search with
>the most nodes in a fixed time interval across 30 problems was without
>SEE.
>
>Stuart
>
>P.S. I did get the SEE() code itself working great and tried it
>in a variety of positions and it correctly returned 0 for no
>advantage, and above or below zero by the relevant amounts
>based on how much would be won or lost -- I used Andreas's code
>with very minor modifications.
>
>So it is a big disappointment to me that SEE didn't help for
>a non-bitboard and non-0x88 program like this.



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.