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, ¤t); > 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.