Maughan wrote:It's an interesting idea. Here's another suggestion - why not also cancel the reduction if the threat is a mate (or a very low value) i.e.
- Code: Select all
if(ok_to_do_nullmove()) {
make_nullmove();
nullvalue = -search(-beta, -beta+1, depth-(R+1));
unmake_nullmove();
if(nullvalue >= beta)
return nullvalue;
else {
threat_move = move_that_refuted_nullmove();
if(SearchStack[Ply-1].reduction){
if(nullvalue < alpha - margin ||
To(SearchStack[Ply-1].move) == From(threat_move))
depth += SearchStack[Ply-1].reduction_amount;
}
}
This wouldn't work for me, I'm afraid. I use something very close to fail-hard, which means that the condition (nullvallue < alpha - margin) would almost never be satisfied. The exception is when the refutation of the null move is a mate in 1, and in this case I already cancel the reduction.
Naum wrote:Your idea is definitely worth playing with. Yes, it may also be used to identify interesting moves that I may want to extend. It doesn't have to be used only to cancel the reduction.
More conditions is neccessary I think. There are many situations that may trigger 'interesting move' code, but are obviously not worth the extension.
Absolutely. Blindly extending all such moves would certainly not work, even with very small fractional extensions. Several additional, strong conditions are needed.
Naum wrote:The same applies to null-moves. I have on my to-do list to create a simple function that will decide whether it's worthed doing null-move in a particular position. For instance, if the previous move is an obvious threat (like N attacks Q), there is no need to do the null-move search, because N will just take the Q.
Gothmog does this. It seems to save a considerable number of nodes (the tree size was reduced by around 10%, IIRC), without any obvious disadvantages. If the null move search is used to detect mate threats, you will of course miss some of these mate threats if you restrict the null move search in this way, but I don't think this is a big problem in practise.
Anthony Cozzie wrote:Honestly, I don't think ECMGCP (or any test suite) is a good benchmark. I'd rather see results from games.
I agree entirely, of course, but at the moment I have no time for running games.
Anthony Cozzie wrote:So many of these ideas for higher selectivity hurt positional play, and that is what is important nowadays.
This depends on the level of play. You just can't hurt the positional play of a simple engine like Glaurung, which has hardly any positional understanding whatsoever. The only way it can win games is by outsearching the opponent in endgames or tactical middlegames.
Except for very strong engines, it just isn't true that positional play is what is important nowadays. Positional play becomes a decisive factor only when the engines are sufficiently strong not to make lots of serious tactical mistakes. At Glaurung's level, games are decided by tactics all the time.
Nevertheless, you do have a point in the sense that many techniques which are very effective in weak chess engines can be an impediment to long-term progress, and that high selectivity is one of the most important examples.
Tord