Author: Tony Werten
Date: 01:00:19 08/03/04
Go up one level in this thread
On August 02, 2004 at 03:33:55, Dennis Breuker wrote: >On July 28, 2004 at 08:50:15, Fabien Letouzey wrote: > >>On July 28, 2004 at 08:47:01, Fabien Letouzey wrote: >> >>>Can you confirm that PVS re-searches with window (value,beta), and not >>>(alpha,beta) as I claim, in Marsland's article? >> >>^^^ >> >>This can be misinterpreted. >> >>Another way of looking at it is that, according to me, in NegaScout alpha is >>updated after the null-window search but not in PVS. >> >>Fabien. > >Here are the two algorithms. >NegaScout as given here is less readable than PVS (I think) >because the loop searches all moves (and testing "IF (n = beta)", >meaning "if this was the first move") instead of searching >the first move separately. > >Anyway, here they are: > > Note that there are some small errors in the Negascout algorithm > given here, and the correct version is in Reinefeld's thesis > (but I could not find that in my attic). In the negascout algo "OR (depth >= d-2)" the 2 should be a 1, as wel as in the PVS " AND (depth > 2)" The original writers assumed that a failsoft will always return the true score for the last 2 ply, which in principle is true, but because of extensions, you never know if there really are only 2 plies afterwards. With 1 ply remaining you go straight into quiescence wich will give you the real score ( so no need to research ) Tony >[Source: ICCA Journal, Vol. 6, No. 4, p. 7] >FUNCTION negascout (p:POSITION; alpha, beta, depth: INTEGER) : INTEGER; >VAR i,t,m,n: INTEGER; >BEGIN > IF depth = d THEN RETURN (evaluate(p)) > ELSE > BEGIN m := -infinity > n := beta > FOR i := 1 to b DO > BEGIN t := -negascout (p.i, -n, -max(alpha,m), depth+1); > IF t > m THEN > IF (n = beta) OR (depth >= d-2) > THEN m := t > ELSE m := -negascout (p.i, -beta, -t, depth+1); > IF m >= beta THEN RETURN (m); > n := max (alpha,m) +1; > END; > RETURN (m); > END; >END; > > >[Source: ICCA Journal, Vol. 9, No. 1, p. 10] >FUNCTION PVS (p : position; alpha, beta, depth : integer ) : integer; > { p is pointer to the current node } > { alpha and beta are window bounds } > { depth is the remaining search length } > { the value of the subtree is returned } > VAR score, j, value : integer; > posn : ARRAY [1..MXWIDTH] OF position; > { Note: depth must be positive } >BEGIN > IF depth = 0 THEN { horizon node, maximum depth? } > Return(Evaluate(p)); > > posn := Generate(p); { point to successor positions } > IF empty(posn) THEN { leaf, no moves? } > Return(Evaluate(p)); > { principal variation? } > score :- -PVS (posn[1], -beta, -alpha, depth-1 ); > FOR j := 2 TO sizeof(posn) DO BEGIN > IF (score >= beta) THEN { cutoff? } > GOTO done; > alpha := max(score, alpha); { fail-soft condition } > { zero-width minimal-window search } > value := -PVS (posn[j], -alpha-1, -alpha, depth-1); > IF (value > score) THEN { re-search, if "fail-high" } > IF (alpha < value) AND (value < beta) AND (depth > 2) THEN > score := -PVS (posn[j], -beta, -value, depth-1); > ELSE score := value; > END ; >done: > Return(score); >END; > > >As for your question, both algorithms re-search with window >(value,beta). > >Dennis
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.