Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Help: Null move and Aspiration failure

Author: William Bryant

Date: 12:14:26 05/15/99

Go up one level in this thread


Thanks to both Bob and Edward.

There was a very nice but difficult to notice bug.  It attribute it to a
compiler error, the compiler did what the source said to do, not what I "though"
it said to do. :)  I forgot to negate the score returned from the null search.
ie
x = search(-beta, -beta+1, depth-NullRDepth, false);

instead of

x = -search(-beta, -beta+1, depth-NullRDepth, false);

You miss these things at 1 am.

Interestingly, the search was much faster (but wrong) on some positions doing
it the other way.  I now only get to 9 ply in 2 minutes (actually 1:36) from the
1.e4 starting position instead of 10 ply, more work to be done.

I still have a question on the Null move.

If at the root, you fail high and set alpha to -infinity so that your new search
window is -Infinity, beta,  then with the first call to search,
alpha becomes -beta, beta becomes -alpha which becomes Infinity.

I assume under these circumstances, it is better to skip the null move at this
ply since there is not point is searching -beta, -beta+1 (-Infinity,
-Infinity+1).  Is this correct?

Finally,
  on your last comment
>The most common bug with null move is a fail high, and on the research where
>beta has been relaxed, you get a fail-low.  _that_ can be a serious problem if
>you don't ignore the false fail-high at the root.  You will occasionally play a
>totally garbage move.

I had this problem when I implemented my aspiration window search. I would fail
high, then fail low and get stuck.  What I have done is this, if I fail high, I
change the search to
	alpha = beta -1;
	beta = INFINITYSCORE;
	and flag that I have failed high.
If fail low, I change the search to
	alpha = -INFINITYSCORE;
	leaving beta unchanged unless I have already failed already on this search,
	then I change beta; beta = INFINITYSCORE;

Is there a better way to handle this problem.

Thanks again,

William
wbryant@ix.netcom.com

BTW, here is my Null move code to see what I have done.  Please feel free to
comment.

	//No Hash table cutoff
	//Now lets try a Null move
#ifndef _No_NULL_
	if (beta < INFINITYSCORE) {//Avoid doing a Null move just after fail low
	if ((!check) && doNull && (depth - NullRDepth >= 0) &&
		(GetPieceMaterial(side) >= NULL_Threashold)) {
		gNullMoveAttemps++;
        	makeNULLmove();
        	if (depth - NullRDepth)	//if depth remaining
			score = -search(-beta, -beta+1, depth-NullRDepth, false);
         	else if (depth - NullRDepth == 0)
			score = -quiesce(-beta, -beta+1);
        	takebackNULL();

        	if (OutOfTime)
			return(0L);

        	if (score >= beta) {		// Null move cutoff
        		gNullCutoffs++;     	// counter for successful null moves
		 	UPDATEHASHRECORD(mHash, theHashRecord, CurHashSig, age, 0L,
				score, depth, hash_Lower);
			 return score;    	// alternatively, return beta
			}
		else if (score < -MateScore)
			if (ply <= kAbsoluteMaxSearchDepth)
				depth++;        // may wish to handle null move scores that
                				//suggest a mate by
                               		// increasing depth and researching
}
}
#endif





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.