Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: limited razoring question

Author: Ed Schröder

Date: 08:21:22 10/04/98

Go up one level in this thread


>Werner,

>It looks like you did not really study the article -- you got neither the
>implementation nor the author correct ... :-(

>I think you refer to limited razoring as detailed in my article about
>extended futility pruning. The article even lists ANSI-C source code that
>demonstrates how to use both techniques. In order to simplify the
>subsequent discussion, I quote the code as published in my article below.

Through the years I have experimented with this many times and in many
forms. My conclusion is you gain lots of speed increase resulting in deeper
search. Sofar so good but I also noticed the positional understanding drops
considerable so in the end I dropped the idea. Similar experiences?

- Ed -



>/****************************************************************************/
>
>int search(int alpha, int beta, int depth, int move, node parent) {
>
>    node current;
>    int extend, fmax, fprune, fscore, score, selective;
>
>    /* execute the opponent's move and initialize some local variables */
>
>    make_move(parent, move, &current);
>    fprune = selective = 0;
>    score = -INFINITY;
>
>    /* determine if and how to extend the search at the current node */
>
>    extend = extensions(depth, move, current);
>    depth += extend;
>
>    /* decide about limited razoring at pre-pre-frontier nodes */
>
>    fscore = (mat_balance(current) + razor_margin);
>    if (!extend && (depth == PRE_PRE_FRONTIER) && (fscore <= alpha)
>          && (opposing_pieces(current) > 3)) depth = PRE_FRONTIER;
>
>    /* decide about extended futility pruning at pre-frontier nodes */
>
>    fscore = (mat_balance(current) + extd_futil_margin);
>    if (!extend && (depth == PRE_FRONTIER) && (fscore <= alpha)) {
>        fprune = selective = 1;
>        score = fmax = fscore;
>    }
>
>    /* decide about selective futility pruning at frontier nodes */
>
>    fscore = (mat_balance(current) + futil_margin);
>    if (!check(move) && (depth == FRONTIER) && (fscore <= alpha)) {
>        fprune = selective = 1;
>        score = fmax = fscore;
>    }
>
>    /*  ``selective == 1'' and ``--INFINITY < score <= alpha'' hold if
>     *  the search will be selective at the current node.
>     *
>     *  continue like normal but prune all futile moves if ``fprune == 1''
>     */
>    ...
>
>    for (move = first(current), (move!= 0), move = next(current, move))
>        if (!fprune || check(move)
>                    || (fmax + mat_gain(move) > alpha)) {
>
>            ...  /* <-- the recursive search call is somewhere here */
>        }
>    ...
>}
>
>/****************************************************************************/
>

>1.  Limited razoring applies at pre-pre-frontier nodes with a remaining
>    depth of 3 plies. At these nodes you simply reduce the depth by 1 ply
>    if the according conditions are fulfilled. Yet you do *not* stop the
>    search by returning some fishy score ... where did you get this from?
>
>2.  Extended futility pruning applies at pre-frontier nodes with a remaining
>    depth of 2 plies. At these nodes you only follow promising captures and
>    all checking moves if the according conditions are fulfilled (similar to
>    normal/selective futility pruning at frontier nodes). Again, you do *not*
>    stop the search immediately but you rather prune unpromising captures
>    and all quiet moves based on a static decision at the current node.
>
>=Ernst=



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.