2011-11-23 5 views
0

Alpha-BetaプルーニングでMinimaxを使用する場合、アルファとベータをクラス変数として再帰を介して送るのではないですか?アルファ・ベータ・プルーニングを伴うMinimax;クラス変数や再帰を介してそれらを送信する?

の代わりに:

private ValuedMove AlphaBetaSearch(Board state) 
{ 
    return MaxValue(state, 0, int.MinValue, int.MaxValue); 
} 

private ValuedMove MaxValue(Board state, int d, int alpha, int beta) 
{ 
    if (d == depth || state.GameRunning == false) 
     return new ValuedMove(Heuristic.BoardValue(state, Player)); 

    ValuedMove v = new ValuedMove(int.MinValue); 
    foreach (Move move in LegalMoves) 
    { 
     ValuedMove minCheck = MinValue(state.ImagineMove(move), d + 1, alpha, beta); 
     if (v.Value >= beta) 
      return v; 
     alpha = Max(alpha, v.Value); 
    } 

    return v; 
} 

private ValuedMove MinValue(Board state, int d, int alpha, int beta) 
{ 
    //Minimax and Alpha-Beta logic here 
} 

私は書くことができます。

int alpha, beta; 

private ValuedMove AlphaBetaSearch(Board state) 
{ 
    alpha = int.MinValue; 
    beta = int.MaxValue; 
    return MaxValue(state, 0); 
} 

private ValuedMove MaxValue(Board state, int d) 
{ 
    //Minimax and Alpha-Beta logic here 
} 

private ValuedMove MinValue(Board state, int d) 
{ 
    //Minimax and Alpha-Beta logic here 
} 

私が求めています、私はそうすることによって、コードを最適化しようとしたときに(私の考えは、私が必要としなかった場合ということだったので、私のチェスプレイヤーは突然馬鹿になり、女王を犠牲にしてポーンを殺し、他の愚かな間違いをしてしまった。

彼は常に自分の「普通のアルファ・ベータ」の相手よりも貧弱ですが、彼は相手のものと比べてツリーのわずかな割合しか探していないと思っています(どちらも同じ深さですが、プレイヤーはもっと積極的に剪定し、それによって訪問されたノードの数を減らすように見える)。私は今これを2回して、確かめました。私はここで取り上げるもの以外に何も変えません。

私がアルファ - ベータアルゴリズムを正しく理解していれば、これは何も変わってはいけませんが、私のチェスプレイヤーにとってはそうです。私は間違って何かしていますか?

私の主な質問は、最適化の賢明さやコードの練習が賢明であるかどうかではなく、実行するかどうかということです。

+0

変更があった場合、いつ「アルファ」と「ベータ」が変更されるのですか? – AakashM

+0

私はあなたに表示する機能の1つにコードを追加しました。パラメータとしてアルファベットとベータを持つことは別として、変更された関数は同じです。 –

答えて

4

本当にこれを行うことはできません。 AlphaBetaは再帰的アルゴリズムです。それはそれが自分自身を呼び出すことを意味します。それが自分自身を呼び出すたびに、アルファとベータの値が異なる(おそらく)。各再帰には、異なる値を保持する変数の独自のバージョンが必要です。変数をクラスに含めると、AlphaBetaへのすべての(再帰的な)呼び出しの間で1つの変数セットしか共有されません。

これは、関数パラメータをクラスメンバーに置き換えることは、おそらく最適な最適化ではないと言われています。両方の技術にはコストがあります。呼び出しの前にスタックにパラメータをプッシュする必要があり、ポインタを介してメンバーに間接的にアクセスする必要があります(非表示のthisポインタ)。どのコストが高いかを忘れてみましょう。このミクロ最適化は、あまり差異を生じさせるにはあまりにも重要ではありません。

+0

あなたはもちろんです。私の理論に間違っていることは分かっていましたが、私の手作業のAlpha-Betaの例はあまりにも単純すぎるので、私の指を置くことはできませんでした。ありがとう! –

関連する問題