NegaScout or Principal Variation Search is a minimax algorithm that can be faster than alpha-beta pruning. Like alpha-beta pruning, NegaScout is a directional search algorithm for computing the minimax value of a node in a tree. It dominates alpha beta pruning in the sense that it will never examine a node that can be pruned by alpha beta; however it relies on accurate move ordering to capitalize on this advantage.
NegaScout works best when there is a good move ordering. In practice, the move ordering is often determine by previous shallower searches. It produces more cutoffs than alpha-beta by assuming that the first explored node is the best. In other words, it supposes the first node is in the principle variation. Then, it can check whether that is true by searching the remaining nodes with a null window (also known as a scout window; when alpha and beta are equal), which is faster than searching with the regular alpha-beta window. If the proof fails, then the first node was not in the principle variation, and the search continues as normal alpha-beta. Hence, NegaScout works best when the move ordering is good. With a random move ordering, NegaScout will take more time than regular alpha-beta (although it will not explore any nodes alpha-beta did not, it will have to re-search many nodes).
In chess engines, NegaScout has typically given a 10 percent performance increase.
Reinefeld invented NegaScout several decades after the invention of alpha-beta pruning. He gives a proof of correctness of NegaScout in his book listed below.
Another search algorithm called MTD(f) can theoretically result in even fewer nodes searched. However it has practical issues (in particular, it relies heavily on the transposition table) and nowadays most chess engines still use a form of NegaScout in their search. Yet another search algorithm which tends to do better than NegaScout in practice is the first-best algorithm called SSS*, although neither algorithm dominates the other. There are trees in which NegaScout searches fewer nodes than SSS* and vice-versa. However, note that SSS* is not a depth-first search and thus has larger memory requirements.
function negascout(node, depth, α, β) if node is a terminal node or depth = 0 return the heuristic value of node b := β foreach child of node v := -negascout (child, depth-1, -b, -α) if α < v < β and not the first child α := -negascout(child, depth -1, -β, -v) (* re-search *) α := max(α, v) if α≥β return α (* cut-off *) b := α+1 (* set new null window *) return α
This article is licensed under the GNU Free Documentation License.
It uses material from the
"Negascout".
Home Page • arts • business • computers • games • health • hospitals • home • kids & teens • news • physicians • recreation• reference • regional • science • shopping • society • sports • world