Minimax算法tic tac toe错误

时间:2018-05-02 12:34:55

标签: java recursion artificial-intelligence tic-tac-toe minimax

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'如果游戏尚未结束。 我不知道什么是错的。

更新:我将maxValue()函数中的m更改为MIN_VALUE但我仍然得到相同的错误。

1 个答案:

答案 0 :(得分:1)

一旦您的代码到达maxvalue方法,您将收到StackOverflow错误,因为nextAction值永远不会再次更改。 更改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;
}