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回して、確かめました。私はここで取り上げるもの以外に何も変えません。
私がアルファ - ベータアルゴリズムを正しく理解していれば、これは何も変わってはいけませんが、私のチェスプレイヤーにとってはそうです。私は間違って何かしていますか?
私の主な質問は、最適化の賢明さやコードの練習が賢明であるかどうかではなく、実行するかどうかということです。
変更があった場合、いつ「アルファ」と「ベータ」が変更されるのですか? – AakashM
私はあなたに表示する機能の1つにコードを追加しました。パラメータとしてアルファベットとベータを持つことは別として、変更された関数は同じです。 –