NegaScoutアルゴリズムはどのように機能しますか?


8

Alpha-Betaプルーニングに関して、NegaScoutは、[Alpha、Beta]を[Alpha、Alpha-1]に設定することでプロセスを加速できると主張しています。

私はNegaScoutのプロセス全体を理解していません。

どのように機能しますか?推測が失敗したときの回復メカニズムは何ですか?


1
参考文献へのリンクを提供し、より的を絞った質問を作成してください。
ラファエル

1
NegaScoutの背後にある主な概念は、提供したリンクで明確に説明されています。ヌルウィンドウ(とは同じですが、とは同じです)を使用することで、各深度の左端の子は、主要なバリエーションにあるかどうかに依存します。存在する場合、検索は終了します。それ以外の場合、アルゴリズムは通常のミニマックス検索アルゴリズムとしてアルファベータ剪定を使用して続行されます。NegaScoutは、検索アルゴリズムの左側のブランチにあるすべてのノードを再展開することに注意してください。また、MinimaxではなくNegamaxに基づいています。αββ=α1
カルロスリナレスロペス

この文は、「各深度の左端の子が主なバリエーションにあるかどうかを検証できる」という意味です。?例はありますか?〜ありがとう
SAM

@CarlosLinaresLópez、コメントを回答に拡張したい場合は、この回答を
整理

回答:


6

返信が遅くなり申し訳ありません(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 α
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.