Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: How to limit Q search ?

Author: Alessandro Damiani

Date: 13:41:41 08/13/00

Go up one level in this thread


On August 13, 2000 at 13:27:44, Carlos del Cacho wrote:

>On August 12, 2000 at 18:11:48, Georg v. Zimmermann wrote:
>
>>Ok,
>>
>>any good ways to limit qsearch when you detect that the qsearch overhead is
>>getting too big, or to slowly increase the qsearch depth with the normal search
>>depth ? Any good (not risky) way to razor in qsearch at very low plys to stop
>>this problem ?
>
>Here's what I do:
>
>- write an SEE evaluator if you don't have one and prune any move whose capture
>score is below zero (not perfect because of pins, but i find it worthy).
>
>- when the piece captured doesn't get close to alpha (say 1-2 pawns), you can
>skip the evaluation at the next ply level. That ought to save some time
>(futility pruning in the quiescent search, I think). You can also do this with
>your SEE but that means more risk of making mistakes on pins...
>
>Cheers
>Carlos


The following algorithm is a very good point to start with. Currently I use it
as the base algorithm (it is from a German thesis).

int Quiescence (int alpha, int beta)
{
	int best, posValue, value, winLimit;

	posValue= StaticEval();
	if (posValue>=beta) return posValue;

	best= posValue; if (best>alpha) alpha= best;
	i= 0; n= GenCaptures();
	while (i<n && best<beta) {
		// m[i] is the move at index i in the movelist

		winLimit= posValue+EGain(m[i]);
		if (winLimit>alpha) {
			make(m[i]);

			// calculate value = min(winLimit, beta):
			if (winLimit<beta)
				value= winLimit;
			else
				value= beta;
			// it applies that alpha < value = min(winLimit, beta) <= beta
			// winLimit limits the (alpha, beta)-window.

			value= -Quiescence(-value, -alpha);
			unmake(m[i]);
		}
		else
			value= winLimit;

		if (value>best) {
			best= value;
			if (best>alpha) alpha= best;
		};
		i= i+1;
	};
	return best;
}


with a possible "Estimated Gain" function like this one:

int EGain (Move m)
{
	return SwapOff(fromSquare(m), toSquare(m))+DELTA;
}

DELTA could be 0.25pawn to improve the positional score.

There are a lot of ways to improve it. Have fun! :)

Alessandro



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.