Alpha-Betaプルーニングに関して、NegaScoutは、[Alpha、Beta]を[Alpha、Alpha-1]に設定することでプロセスを加速できると主張しています。
私はNegaScoutのプロセス全体を理解していません。
どのように機能しますか?推測が失敗したときの回復メカニズムは何ですか?
Alpha-Betaプルーニングに関して、NegaScoutは、[Alpha、Beta]を[Alpha、Alpha-1]に設定することでプロセスを加速できると主張しています。
私はNegaScoutのプロセス全体を理解していません。
どのように機能しますか?推測が失敗したときの回復メカニズムは何ですか?
回答:
返信が遅くなり申し訳ありません(4年!)
NegaScoutは非常にシンプルなアルゴリズムです。理解するためには、繰り返し深化を修正する必要があります。
反復深化は、チェスエンジンが深さi、次にi + 1、次にi + 2などを検索するための手法です。これは動的プログラミングの例です。各反復の間、私たちは最良の動きが何であるかについて私たちの最良の推測をしています。ほとんどのチェスエンジンは、この動きをハッシュテーブルに保持します。
今、イテレーションi + 1にいて、最後のイテレーションiから最も良い動きがあると想像してください。これで、5つのノードを検索できました。
最後の反復中にかなり良い仕事をしたと仮定すると、最後の反復(ハッシュテーブルから取得)からの最良の移動も、現在の反復の最良の移動になるはずです。
私たちの仮定が正しければ、で最高の動き(ハッシュテーブルにない4つの動き)以外のすべての動きを検索することで時間を節約できるはずnull window
です。nullウィンドウは次のようなものです。
score := -pvs(child, depth-1, -α-1, -α, -color)
注-α-1
と-α
。これらは、次の再帰に与えるアルファ値とベータ値です。ウィンドウの幅は1しかないため、検索は常に失敗します。
もちろん、適切なアルファおよびベータウィンドウを使用して、最善の動き(ハッシュテーブルから取得したもの)を引き続き検索します。ノードの値を正確に知る必要があるため、これを行う必要があります。無視することはできません。
私が言ったことはすべて、次の疑似コードに実装されています。疑似コードは指定しますchild is not first child
が、これは前の反復で移動が最良の移動であるかどうかを確認する方法でもあります。ハッシュテーブルは最も一般的な実装です。
# Negasort is also termed Principal Variation Search - hence - pvs
function pvs(node, depth, α, β, color)
if node is a terminal node or depth = 0
return color x the heuristic value of node
for each child of node
if child is not the first child
# search with a null window
score := -pvs(child, depth - 1, -α - 1, -α, -color)
# if it failed high, do a full re-search
if α < score < β
score := -pvs(child, depth - 1, -β, -score, -color)
else
score := -pvs(child, depth - 1, -β, -α, -color)
α := max(α, score)
# beta cut-off
if α >= β
break
return α