Минимаксный алгоритм Tic Tac Toe Error - PullRequest
0 голосов
/ 02 мая 2018
at TicTacToe.minvalue(TicTacToe.java:184)
    at TicTacToe.maxvalue(TicTacToe.java:197)
    at TicTacToe.minvalue(TicTacToe.java:184)
    at TicTacToe.maxvalue(TicTacToe.java:197)
    at TicTacToe.minvalue(TicTacToe.java:184)
    at TicTacToe.maxvalue(TicTacToe.java:197)
    at TicTacToe.minvalue(TicTacToe.java:184)
    at TicTacToe.maxvalue(TicTacToe.java:197)
    at TicTacToe.minvalue(TicTacToe.java:184)
    at TicTacToe.maxvalue(TicTacToe.java:197)
    at TicTacToe.minvalue(TicTacToe.java:184)

Я не вижу ошибки, потому что она такая длинная. Вот функции maxValue () и minValue ()

 private int minvalue(char [] brd){
    int m = (int) Integer.MAX_VALUE;
    int v;
    for(int a : actions(brd)){
        char [] nextbrd = result(brd, a, human);
        if(status(nextbrd)=='C') v = maxvalue(nextbrd); //line 184
        else v = utility(nextbrd);
        m = Math.min(m, v);

    }
    return m;
}

private int maxvalue(char [] brd){
    int m = (int) Integer.MAX_VALUE;
    int v;
    for(int a : actions(brd)){
        char [] nextbrd = result(brd, a, agent);
        if(status(nextbrd)=='C') v = minvalue(nextbrd); //line 189
        else v = utility(nextbrd);
        if(v==Math.max(m, v))   nextAction = a;
        m = Math.max(m, v);

    }
    return m;
}

функция полезности () просто возвращает 1, если победителем является агент. -1 иначе. статус возвращает 'C', если игра еще не закончена. Я не знаю, что случилось.

ОБНОВЛЕНИЕ: я изменил m в функции maxValue () на MIN_VALUE, но я все еще получаю ту же ошибку.

1 Ответ

0 голосов
/ 02 мая 2018

Как только ваш код достигнет метода maxvalue, вы получите ошибку StackOverflow, так как значение nextAction больше никогда не изменится. Условие изменить следующее действие показано как

if(v==Math.max(m, v))   nextAction = a;

Но в начале вы инициализировали

int m = (int) Integer.MAX_VALUE;

Таким образом, оператор if никогда не будет верным согласно вашему коду. Следующая коррекция выглядит очевидным подходом, чтобы избежать ошибки StackOverflow.

   private int maxvalue(char [] brd){
    int m = (int) Integer.MIN_VALUE;
    int v;
    for(int a : actions(brd)){
        char [] nextbrd = result(brd, a, agent);
        if(status(nextbrd)=='C') v = minvalue(nextbrd); //line 189
        else v = utility(nextbrd);
        if(v==Math.max(m, v))   nextAction = a;
        m = Math.max(m, v);

    }
    return m;
}
...