アルファ/ベータ プルーニングを使用して MiniMax アルゴリズムを実装しようとしています。完全に立ち往生していて、どこが間違っているのかわかりません。クラス MiniMax には State と Action が含まれています。メソッド getAction は Action を返します (おそらく実行するのに最適なアクションです)。Game オブジェクトには 2 つのメソッドがあります。isTerminal は、状態が「終了状態」の場合、つまり、その状態の子がこれ以上ない場合に true を返します。getUtility は、終了状態に関連付けられた値を返します。
カウンターラウンドを使って最大ターンか最小ターンかを決めようとしています。現在、アルゴリズムは正しいアクションを返しません。この段階では、展開の順序を正しくして、プルーニング ビットを機能させることに集中しています。
public class MiniMax<State,Action> {
int alpha = Integer.MIN_VALUE;
int beta = Integer.MAX_VALUE;
int foundMax = 0;
int round = -1;
Action action = null;
public Action getAction(Game<State, Action> game, State state)
{
round++;
List<Successor<State, Action>> successors = (List<Successor<State, Action>>) game.getSuccessors(state);
for (int i=0; i < successors.size(); i++)
{
if ( round % 2 == 0 )
{
if ( game.isTerminal(successors.get(i).state))
{
System.out.println("Max turn: Node: " + successors.get(i).state + ", utility: " + game.getUtility(successors.get(i).state) + ", alpha: " + alpha + ", beta: " + beta);
alpha = Integer.max(alpha, game.getUtility(successors.get(i).state));
if ( alpha <= beta )
{
break;
}
action = successors.get(i).action;
}
if ( !game.isTerminal( successors.get(i).state) )
{
action = getAction(game, successors.get(i).state);
}
}
else
{
if ( game.isTerminal(successors.get(i).state))
{
System.out.println("Min turn: Node: " + successors.get(i).state + ", utility: " + game.getUtility(successors.get(i).state) + ", alpha: " + alpha + ", beta: " + beta);
beta = Integer.min(beta, game.getUtility(successors.get(i).state));
if ( beta <= alpha )
{
break;
}
action = successors.get(i).action;
}
if ( !game.isTerminal( successors.get(i).state) )
{
action = getAction(game, successors.get(i).state);
}
}
}
return action;
}
}