Author: Uri Blass
Date: 02:56:54 01/16/04
Go up one level in this thread
On January 15, 2004 at 16:38:13, Michel Langeveld wrote:
>On January 15, 2004 at 15:24:24, Michel Langeveld wrote:
>
>>Just for sharing
>>
>>Fixing the bug saves a bit in quiet positions where history heuristic is more
>>important. I take the original TSCP 1.81 search again to explain the bug. The
>>bug is caused that the wrong number of plies is added to the history heurstic if
>>we talk about a check.
>>
>>I will publish my heavily modified TSCP when it is totally done :-)
>>
>>/* search() does just that, in negamax fashion */
>>
>>int search(int alpha, int beta, int depth)
>>{
>> int i, j, x;
>> BOOL c, f;
>>
>> /* we're as deep as we want to be; call quiesce() to get
>> a reasonable score and return it. */
>> if (!depth)
>> return quiesce(alpha,beta);
>> ++nodes;
>>
>> /* do some housekeeping every 1024 nodes */
>> if ((nodes & 1023) == 0)
>> checkup();
>>
>> pv_length[ply] = ply;
>>
>> /* if this isn't the root of the search tree (where we have
>> to pick a move and can't simply return 0) then check to
>> see if the position is a repeat. if so, we can assume that
>> this line is a draw and return 0. */
>> if (ply && reps())
>> return 0;
>>
>> /* are we too deep? */
>> if (ply >= MAX_PLY - 1)
>> return eval();
>> if (hply >= HIST_STACK - 1)
>> return eval();
>>
>> /* are we in check? if so, we want to search deeper */
>> c = in_check(side);
>> if (c)
>> ++depth;
>> gen();
>> if (follow_pv) /* are we following the PV? */
>> sort_pv();
>> f = FALSE;
>>
>> /* loop through the moves */
>> for (i = first_move[ply]; i < first_move[ply + 1]; ++i) {
>> sort(i);
>> if (!makemove(gen_dat[i].m.b))
>> continue;
>> f = TRUE;
>> x = -search(-beta, -alpha, depth - 1);
>> takeback();
>> if (x > alpha) {
>>
>> /* this move caused a cutoff, so increase the history
>> value so it gets ordered high next time we can
>> search it */
>> //history[(int)gen_dat[i].m.b.from][(int)gen_dat[i].m.b.to] += depth;
>>
>> ************************************************
>> //we have to subtract depth
>>
>>history[(int)gen_dat[i].m.b.from][(int)gen_dat[i].m.b.to] += (depth - c);
>> ************************************************
>>
>> if (x >= beta)
>> return beta;
>> alpha = x;
>>
>> /* update the PV */
>> pv[ply][ply] = gen_dat[i].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];
>> }
>> }
>>
>> /* no legal moves? then we're in checkmate or stalemate */
>> if (!f) {
>> if (c)
>> return -10000 + ply;
>> else
>> return 0;
>> }
>>
>> /* fifty move draw rule */
>> if (fifty >= 100)
>> return 0;
>> return alpha;
>>}
>
>
>I think also the check for draw is done too late:
>
>if (fifty >= 100)
> return 0;
>
>should be after declarations.... else a beta cutoff that leads to a draw is
>calculated as a draw.
Your correction is obviously wrong.
You first need to check for no legal moves(otherwise you may lose games because
of evaluating mate position as a draw).
100 moves without conversion is a draw only if the position after them is not a
checkmate.
Uri
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.