Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: MTD(f)

Author: Andrew Williams

Date: 04:07:30 09/29/99

Go up one level in this thread


On September 29, 1999 at 06:40:29, Andrew Williams wrote:

>On September 28, 1999 at 17:57:40, Nicolas Carrasco wrote:
>
>>I only saw one site of MTD(f) and the phseoudo code uses an mixture of C and
>>Pascal. Can anybody explain it to me? Can anybody send me a C phseoudo code?
>>
>>Thanks
>On September 28, 1999 at 17:57:40, Nicolas Carrasco wrote:
>
>>I only saw one site of MTD(f) and the phseoudo code uses an mixture of C and
>>Pascal. Can anybody explain it to me? Can anybody send me a C phseoudo code?
>>
>>Thanks
>
>Normal alphabeta approaches start with two bounds (alpha and beta) around the
>score. During the course of the search, the gap between these two bounds is
>narrowed until the two bounds meet. The point at which the two bounds meet
>is the correct score. You can see this happening in TSCP: the two bounds
>start at -10000 and +10000 (in think()). The gap between them is narrowed
>in quiesce() and search() (look for the lines where it says alpha=x).
>
>MTD(f) is a bit different. Here the search proceeds by successively asking
>the question "is the score for this position greater than or less than this
>guess?". You ask an alphabeta search this question by setting
>alpha=beta-1 at the root of the search.

SORRY - HATE TO RESPOND TO MY OWN POST, BUT THAT SHOULD SAY:

You ask an alphabeta search this question by setting beta=guess and
alpha=beta-1 at the root of the search.

>If the score returned by the search
>is greater than the guess, you increase the guess by some amount and then
>ask again. Equally if the score of the search is < the guess, you decrease
>guess by some amount and then ask again. You successively ask the question,
>keeping track of the upperbound and lowerbound established by the search.
>When the upperbound and lowerbound meet, you have found your score. Your
>alphabeta function should return scores rather than bounds, because otherwise
>this will go pretty slowly. Because you are repeatedly asking the same question
>you need a good hash table. Because you never establish the exact score for
>positions in the search, you need to keep an upper bound and a lower bound in
>the hash table for each position you insert. Again, because you never establish
>exact scores, you can't keep the PV in the normal way; you need to use your
>hashtable to keep track of it.
>
>Below is PostModernist's mtdf loop with some stuff omitted (the omissions
>relate to creating the PV and reporting information about the search to
>xboard, or to the user or to the epd testing functions). There's nothing
>secret about the omitted stuff, it just that I've recently changed this
>significantly and it's a bit untidy (while looking at this, I've noticed at
>least two ifs that could have been ditched).
>
>
>int mtdf(int firstguess, int depth) {
>	int score;
>	int beta;
>	int movesDown = 0;
>	int movesUp   = 0;
>
>
>	upperbound =  10000;
>	lowerbound = -10000;
>
>	beta = firstguess;
>
>	while(upperbound > (lowerbound+1)) {
>
>		score = root_AB(depth, beta - 1, beta);
>
>		if(score < beta) {
>			upperbound = beta;
>			movesDown++;
>			movesUp=0;
>			beta = score - ((movesDown+1)*(movesDown+1));
>			if(beta <= lowerbound) {
>				beta = lowerbound+1;
>				movesDown = 0;
>			}
>		} else {
>			lowerbound = beta;
>			movesUp++;
>			movesDown = 0;
>			beta = score + (movesUp*movesUp);
>			if(beta >= upperbound) {
>				beta = upperbound - 1;
>				movesUp = 0;
>			}
>		}
>
>	}
>
>	return lowerbound;
>}
>
>
>Andrew Williams



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.