The problem is in your terminology. You do not think of "highest fail-lo score" as that makes no sense. For each fail-low move/score you get back, are you _certain_ that your opponent found the _best_ refutation? Or did a killer just happen to be good enough? The point is, the scores you get back are not scores, they are all bounds. And you can't compare bounds to figure out which one might be best, because these are _very_ loose bounds at best.Desperado wrote:i agree that having a move available will improve the search,bob wrote: ...
If I fail low at any node, this is stored in the hash table as a "UPPER" position and there is obviously no best move to store. In Crafty, as a search is carried out, I save the first move searched (which may be the hash move, or the first capture tried, or the first killer (if there is no hash or safe capture move) or just the first move generated in the worst case. When I discover that this is a "UPPER" position with no best move, I store the first move searched as the best move. Why? The next time I hit this position, I will search that move without a move generation, and without a best move that is the move I would end up searching first anyway, so why not?
...
However, this now means that _every_ hash hit will have a best move (the EXACT/LOWER positions obviously would, and now UPPER also).
...
and results in positive elo gain.
i dont agree that is has to be the first move given by the moveselector.
(as we all know,which tries: tMove,captures ...)
i am prettey sure, that using the move with the highest fail-lo score
is the better choice, at least it is more dynamic.Further i believe
that will result in smaller trees, and speed up the search more
than your approach.
Simple test. Ed Schroeder did exactly what you are doing years ago. We had this same discussion. He removed that code and found his trees got _smaller_. Easy to test.
1. has zero extra code. Only considering ALL nodes, you have two possibilities when you arrive at one. (a) you have a hash hit but the bounds or score doesn't let you stop searching, but you do have a hash move to try first. (b) you do not have a hash move, so you try the move your move generator pops out first.yes, i try a move a move which might be way down in _original_ move ordering. But there is no argument (for now),Chan Rasjid wrote:Hello Michael,
Your scheme differs from that of Bob and it is not what he wants.
In an all-node, Bob's scheme either stores the original tt-move or the first move done,ie the move with the highest original ordering. In your scheme, the move stored might be way down in the original ordering. Such a move, if first searched in a hash hit in a subsequent search, will not be searching a move with the highest ordering and it would be a bad move to try.
Rasjid.
that is telling us, it would be worse (both moves failed lo, the first
and move-n with the higher fail-lo score)
At the end, if we have a real allNode, which is now and for all revisits
an allNode, we might store a move by random.That would not hurt.
But my opinion is, if we dont do it by random then we need a _formular_
to pick a (best)move.
bobs formular: (1)
first move given by moveselection code
my formular: (2)
the value with the highest fail-lo score.(btw the most unimportant
thing is not to have _any_ extra code as advantage)
why should (1) be better than (2) ?![]()
Michael
My approach does both. If you have an existing hash move, it will be preserved when we store the hash entry for this ALL node after we finish. If not, we will store the first move we searched, which is as good as any place to start since that is what we would do with no hash move at all. Requires no tweaking in the hash store code to preserve an existing hash move either... So simple _and_ very effective.
And, of course, verified with a "few" games on our cluster.
