Author: Dann Corbit
Date: 00:30:22 04/14/04
I decided to toss an MTD(f) search into TSCP, and I've got something wrong, but
I can't quite see what it is.
Can one of the MTD(f) Guru's point out where I went off? This is the stuff I
modified from search.c, and you just define MTDF to compile it for MTDF...
I'm sure that it is something simple.
/*
* SEARCH.C
* Tom Kerrigan's Simple Chess Program (TSCP)
*
* Copyright 1997 Tom Kerrigan
*/
#include <stdio.h>
#include <string.h>
#include "defs.h"
#include "data.h"
#include "protos.h"
/* see the beginning of think() */
#include <setjmp.h>
jmp_buf env;
BOOL stop_search;
/* MTD(f) is an alternative search to pvs */
int mtdf(int f, int depth)
{
int beta;
int smallest = -10000;
int greatest = 10000;
do {
if (f == smallest)
beta = f + 1;
else
beta = f; /* beta is starting with a first best guess */
f = search(beta - 1, beta, depth);
if (f < beta)
greatest = f;
else {
int j;
smallest = f; /* performs a cut-off */
if (smallest >= greatest) {
pv[ply][ply] = gen_dat[depth].m;
for (j = ply + 1; j < pv_length[ply + 1]; ++j)
pv[ply][j] = pv[ply + 1][j];
pv_length[ply] = pv_length[ply + 1];
}
}
} while (smallest < greatest);
return f;
}
/* think() calls search() iteratively. Search statistics
are printed depending on the value of output:
0 = no output
1 = normal output
2 = xboard format output */
void think(int output)
{
int i,
j,
x = 0;
/* try the opening book first */
pv[0][0].u = book_move();
if (pv[0][0].u != -1)
return;
/* some code that lets us longjmp back here and return from think() when
* our time is up */
stop_search = FALSE;
setjmp(env);
if (stop_search) {
/* make sure to take back the line we were searching */
while (ply)
takeback();
return;
}
start_time = get_ms();
stop_time = start_time + max_time;
ply = 0;
nodes = 0;
memset(pv, 0, sizeof(pv));
memset(history, 0, sizeof(history));
if (output == 1)
printf("ply nodes score pv\n");
for (i = 1; i <= max_depth; ++i) {
follow_pv = TRUE;
#ifdef MTDF
x = mtdf(x, i);
#else
x = search(-10000, 10000, i);
#endif
if (output == 1)
printf("%3d %9d %5d ", i, nodes, x);
else if (output == 2)
printf("%d %d %d %d",
i, x, (get_ms() - start_time) / 10, nodes);
if (output) {
for (j = 0; j < pv_length[0]; ++j)
printf(" %s", move_str(pv[0][j].b));
printf("\n");
fflush(stdout);
}
if (x > 9000 || x < -9000)
break;
}
}
This page took 0.02 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.