【问题标题】:Minimax algorithm tic tac toe errorMinimax 算法井字棋错误
【发布时间】:2018-10-12 13:44:27
【问题描述】:
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;
}

如果获胜者是代理,则实用程序 function() 仅返回 1。 -1 否则。 如果游戏尚未结束,则状态返回“C”。 我不知道怎么了。

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

【问题讨论】:

  • 这是完整的代码吗?你能添加完整的代码吗
  • 您需要发布异常。在输出中向上滚动。
  • 我看到一个错误,用于查找 Max 和 min 你都使用 Integer.MAX_VALUE,对于 max 它应该是 Integer.MIN_VALUE;
  • 看起来您遇到了 StackOverflow 错误 stackoverflow.com/questions/214741/what-is-a-stackoverflowerror

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


【解决方案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;
}

【讨论】:

  • 我将其更改为 MIN.VALUE 但仍然产生相同的错误
猜你喜欢
  • 1970-01-01
  • 2014-02-03
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
相关资源
最近更新 更多