micron wrote:My (2600 Elo) engine distressingly fails to gain from futility pruning.
Code: Select all
ev = NOT_EVALUATED;
for_each_move {
if ( !pvNode && depth == 1 && !inCheck && move_is_not_the_first && move_is_quiet ) {
if ( ev == NOT_EVALUATED ) ev = EvalForPrune();
if ( ev + FUTILITY_MARGIN < alpha ) continue;
}
MakeMove();
Search();
...
}
Numerous tests, with different values of FUTILITY_MARGIN, different meanings of move_is_quiet, and different implementations of EvalForPrune(), have gone nowhere.
I would be grateful for hints, tips or suggestions as to what may be wrong.
Robert P.
Try to mix in the following.
* use depth <= 8 or maybe <= 3
* do not prune if the move checks opp king
* do not prune killer moves
* do not prune hash move
* do not prune when your score is a mate score already
* do not prune when your piece material (pawn not included)
is lower than rook value
* do not prune when opp pieces and pawns are not capable to mate you
* legal_move >= 8
* capture_legal_move >= 2
* do not prune moves with high beta cut-off
* scale futility margin by depth and/or legal_move and/or eval value
and/or material of opponents and /or your material
* do not prune moves when legal_moves are low
* encourage to prune moves that allows opp to capture it freely (like moves with bad see() for capture moves)
* do not prune pawn moves that are somewhat tactical in nature like pushing passers, pushing candidate passers to 6th ranks and pushing pawns to attack opp king
* do not prune moves that blocked opp passer
* create some form of limiting this prunning when your iteration scores
experienced many fail lows
* do not prune king moves when there are many checks from opponents some moves ago in game history
The eval_for_prune is supposed to be a side effect when doing null move prunning in some system like.
full_eval = eval();
//do nmp
if(good_to_null and full_eval >= beta){
...
}
eval_for_prune = full_eval;