8

アップデート

更新1

これを試しました(2行目):alphabeta関数の最初の命令としてノードの色の変更を追加しました。私はこの結果を得ています:

結果

緑色のノードは訪問済みノードです。アルゴリズムがノードを正しくスローするように見えますよね?しかし、ノードで正しい値を出力する方法 — 私もこれを行う必要がありますか? 子の値の最小値、子の値の最大値 (剪定された枝を除く)。

Update 2

アルファとベータをツリー ノードに出力しようとしましたが、正しい結果が得られませんでした。これがコードです (18 行目と 31 行目が追加されました)。これはコードの結果です:

出力

この画像では、奇妙な場所を示しています

出力エラー

最初の矢印: なぜ 7 と 6 の最小値が 5 なのか? 2 番目の矢印: 4、3、2 の最大数が 5 になるのはなぜですか? 変。そのため、現在は正しく機能していると思います。

古い質問

むかしむかし、ここで同様の質問を作成しました。「なぜこのエラーが発生するのですか?」のようなものでした。ロールバックして新しいものを作成しましょう。この質問は次のとおりです。「Alpha Beta Pruning アルゴリズムの結果を表示するにはどうすればよいですか?」

ウィキでこのアルゴリズムの疑似コードを見つけました。ここで見つけることができます。

私の認識は以下のとおりです (JavaScript に関するものですが、この質問に答えるために JS、Java、C++ などの知識が必要だとは思いません)。問題は、このアルゴリズムの結果をグラフ (ツリー構造) に出力する方法です。開始時には、次のツリー構造があります。

タスク、私の構造

注:アルファ ベータ プルーニング アルゴリズムを使用するツリー構造 (いくつかのリンクされnodeた s) があり、別のツリー構造 (結果を表示するため、「グラフ」と呼びましょう) があります。グラフを表示するために使用するツリーのノードは、アルゴリズムの結果を見つけるために使用するノードに接続されています。

そのため、アルファ ベータ プルーニング アルゴリズムのコードは以下のとおりです。アルゴリズムのプロセス/結果を正しく表示するには、何をどこに出力する必要があるかを明確にしていただけますか?

アルファとベータを出力すると仮定していますが、それは間違っていると思います。試してみましたが、うまくいきません。

剪定を表示し、ツリー内のすべてのノードに正しい値を入力したいと考えています。

これは、アルファ ベータ プルーニングを使用したミニマックスの私の実現です。

function alphabeta(node, depth, alpha, beta, isMax, g) {
    if((depth == 0) || (node.isTerminal == true)) {
        return node.value;
    }
    if(isMax) {
        console.log('maximizing');
        for (var i in node.children) {
            var child = node.children[i];
            console.log(child);
            alpha = Math.max(alpha, alphabeta(child, depth-1, alpha, beta, false, g));
            if(beta <= alpha) {
                console.log('beta '+beta+' alpha '+alpha);
                break;
            }
        }

        return alpha;
    } else {
        console.log('minimizing');
        for (var i in node.children) {
            console.log('1 child');
            var child = node.children[i];
            console.log(child);
            beta = Math.min(beta, alphabeta(child, depth-1, alpha, beta, true, g));
            if (beta <= alpha) {
                console.log('beta '+beta+' alpha '+alpha);
                break;
            }
        }

        return beta;
    }
}
4

1 に答える 1

4

実際にアクセスしたノードを保存して、それらのノードを赤く色付けしてみませんか。次に、ツリー全体と比較してどのノードが評価されたかを確認します。例えば

ここに画像の説明を入力

コメントでの長い議論の後、私はこれに光を当てることができると思います. アルファ ベータがツリーを一周するとき、3 つの値があります。特定のノードで操作すると、親ノードからそのノードに運ばれたアルファとベータがあり、これまでに見つかった最高の値があります。 . アルファ ベータ ウィンドウ外の値が見つかった場合は、その値に関係なく、このノードが最適な移動ではないことがわかっているため、すぐにプルーニングします。したがって、一部のノードでは、アルファ ベータがノードの「真の値」を導き出すことはありません。

したがって、アルファベータの「結果」を表示するように求められたとき、「真の値」は必ずしも評価されないため、アルファベータウィンドウを意味していると誤解しました。

「真のノード値」を出力するには、別のコードを記述する必要があります。ミニマックスアルゴリズムがこれを行うと思います。

また、ノードの「セット」を使用している場合、リスト反復子がノードを予測可能な順序で返すことが保証されていないことに注意してください。したがって、ノード内でリストではなくセットを使用している場合は、手でたどるのは難しいことがわかります。リスト反復子は挿入順に返されます。セット反復子には予測可能な反復子がありません。

于 2014-05-28T09:35:55.117 に答える