Author: Stuart Cracraft
Date: 21:38:34 10/18/04
Go up one level in this thread
On October 17, 2004 at 17:23:23, Bas Hamstra wrote: >On October 17, 2004 at 12:07:24, Stuart Cracraft wrote: > >>Futility prune at depth == 1, extended futility prune at depth == 2, and razor >>at depth == 3.... >> >>Are the above depths *before* or *after* the makemove? >> >>I implemented the above (with depths calculated before the makemove) >>and although my total nodes is reduced 30%, for me it is about the >>same runtime and result. >> >>Not sure why this is so as I took extra care to avoid any extra calls to >>incheck(). My eval() is simply lazy-eval level so nothing expensive there >>either. >> >>I profiled both runs and there are not more incheck()'s in any amount >>in the version with futility pruning turned on vs. not. >> >>Note -- my Extensions() routine calculates whether the move is a checking >>move but does this last and only if all the extensions together don't >>add up to 1. >> >>Likewise Reductions() which calculates Futility pruning initial status (parent >>in check, depth = 1 2 3, whether futility, extended, or razor, and alpha status >>in relation to evaluation+MARGIN) only calculates incheck() status if >>not already done. >> >>A profiled run shows no great difference in incheck() calls. My >>Futility pruning implementation must simply be wrong. Plese have >>a look. >> >>Here is the code: >> >>int Reductions(int alpha, int depth, int *bd) >>{ >> int reduction=0; >> if (FUTIL_R != 0.0) { >> if (depth == 1) { >> if (parentincheck || alpha < eval(bd,QUIET)+3000) >> reduction = 0; >> else >> reduction = 1; >> } >> else if (depth == 2) { >> if (parentincheck || alpha < eval(bd,QUIET)+5000) >> reduction = 0; >> else >> reduction=1; >> } >> else if (depth == 3) { >> if (parentincheck || alpha < eval(bd,QUIET)+9000) >> reduction = 0; >> else >> reduction=1; >> } >> } >> return(reduction); >>} >> >>mainsearch() >>: >>: >> parentincheck=incheck(bd); >>: >> reduction=Reductions(alpha, depth, bd); >>: >> make first move >>: >> extension=Extensions(alpha,depth,bd,sml[mvi],threat,bmext,&checked,ply,qentr >>y); >> ^^ perhaps the above alpha should be -beta? >> prune = 1; >> if (extension || !reduction || sml[mvi].cap) prune = 0; >> else { >> if (checked status not yet known) checked=incheck(bd); >> if (checked) prune = 0; >> } >> if (!prune) >> best = -search(bd,depth-1+extension, ply+1,-beta,-alpha); >>: >> for main move loop >> : >> similar to above >>: >> >>Thanks, >> >>Stuart > >Be careful with that. It's easy to claim it saves nodes, as Heinz did. However >does your program effectively search deeper? That's the question. Remember that >with lazy eval most of the futile nodes are cut anyway (but then they *do* count >as nodes!) in a more accurate way. > > >Bas. No deeper. Here is without and with: - 6.18/22.59 83% 250/300 ha=36 246.80 37344500 124482/1/151313 60036/122695/5822 17/1295146/13510622/165914/0 - 6.13/22.69 82% 246/300 ha=37 247.52 36066188 120221/1/145708 60414/121199/4968 93/1326052/12829848/171715/582147-DFUTIL Nodes nearly identical at 37M and 36M. Depth nearly same in main search 6.18 and 6.12 and q-search 22.59 and 22.69. Scores on WAC are 250/300 and 246/300. Something is wrong with the implementation or Heinz was smoking.
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.