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.