1

アルファ/ベータ プルーニングを使用して 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;
}

}

4

0 に答える 0