【问题标题】:Minimax Connect 4 AI troubleMinimax Connect 4 AI 麻烦
【发布时间】:2015-07-21 01:30:15
【问题描述】:

我正在制作 connect 4 AI,但游戏会一直持续到所有 42 个空格都被填满。
得分保持每4个连续获得1分。

public int[] Max_Value(GameBoard playBoard, int depth){
    GameBoard temp = new GameBoard(playBoard.playBoard);
    int h = 0, tempH = 999, tempCol=0;
    int myDepth = depth - 1;
    int[] tempH2 = new int[2];
    boolean noChildren = true;
    if(myDepth != -1){
        for(int i = 0; i < 7; i++){
            if(temp.isValidPlay(i)){
                count++;
                temp.playPiece(i);
                noChildren = false;
                tempH2 = Min_Value(temp, myDepth);
                if(tempH2[1] < tempH){
                    tempH=tempH2[1];
                    tempCol = i;
                }
                temp.removePiece(i);
            }
        }
    }   
    int[] x = new int[2];
    if(noChildren){
        h = temp.getHeuristic();
    }
    else{
        h = tempH;
        x[0]=tempCol;
    }
    x[1]=h;
    return x; 
}

public int[] Min_Value(GameBoard playBoard, int depth){
    GameBoard temp = new GameBoard(playBoard.playBoard);
    int h = 0, tempH = -999, tempCol=0;
    int myDepth = depth - 1;
    int[] tempH2 = new int[2];
    boolean noChildren = true;
    if(myDepth != -1){
        for(int i = 0; i < 7; i++){
            if(temp.isValidPlay(i)){
                count++;
                temp.playPiece(i);
                noChildren = false;
                tempH2 = Max_Value(temp, myDepth);
                if(tempH2[1] > tempH){
                    tempH=tempH2[1];
                    tempCol = i;
                }
                temp.removePiece(i);
            }
        }
    }   
    int[] x = new int[2];
    if(noChildren){
        h = temp.getHeuristic();
    }
    else{
        h = tempH;
        x[0]=tempCol;
    }
    x[1]=h;
    return x; 
}

我觉得我只是偶然发现了所有内容,感觉就像是糟糕的代码。但是,我以前从未尝试过这样的事情,并希望有任何意见。我不知道我哪里出错了。对于任何给定的状态,我的评估函数只为每 4 个连续给出 1 分。主函数调用 Min_Value 函数以深度 10 开始。

我正在尝试返回列以及启发式的值。我希望我已经提供了足够的信息。感谢您提供任何见解。

【问题讨论】:

    标签: java artificial-intelligence minimax


    【解决方案1】:

    好吧,在实现了未显示的方法(如评估、playmove、remove 等)之后,我能够对其进行调试。假设这些函数在您的版本中以某种正确的方式实现,错误是如果深度为 -1,您永远不会真正调用评估函数:

    你有这个:

    [...]if(myDepth != -1)
    {/*restofthecode*/}[...]
    

    但你需要的是这样的:

    [...]if(myDepth == -1)
    {
    return temp.getHeuristic();
    }
    /*restofthecode*/
    [...]
    

    这样,每当您到达深度 -1(您的极小极大树中的一个叶子)时,就会评估该棋盘并返回值(这正是您在极小极大树中所需要的)。

    在两个部分(最小和最大)都进行此修改,一切都应该没问题。如果还有其他问题,请随时提出。

    【讨论】:

      【解决方案2】:

      即使问题中没有说明,我认为您的搜索并没有取得好的进展,对吧?

      如果不查看您的 while 代码,我已经可以说您的程序仅在游戏的最后 10 步(最后 10 个空字段或 10 个强制获胜)期间有效。否则,您的程序将返回它评估的最后一个或第一个动作。那是因为您的评估功能,您只处理胜利(分别为连续 4 次),而不是连续 2 次、陷阱、连续 3 次等)。如果它不能强制获胜,它会认为所有的动作都是平等的。

      这是个问题,因为从空场开始,只能由先发玩家强制获胜,并且只需将最后第二个棋子放在棋盘上即可。 (在你的第4版中连续强制)。

      而且由于您的搜索深度 (10) 小于最大棋步数 (42),因此您的程序将始终先走一步。

      如果您的算法的其余部分被正确实现,您可以通过简单地改进您的评估函数来解决这个问题,以便它可以在“好”和“坏”游戏位置之间有所不同。

      【讨论】:

      • 谢谢。我刚刚开始使用糟糕的评估功能,以确保它至少可以工作,因为它更容易检查。我只是在最上面一行是空的(只剩下 7 步)的棋盘上检查它。但是,即使有一个可用的连接,它仍然不会做出给出连接 4 的动作。此外,当我试图在空板上运行它时,程序会停止运行,即使在深度 5 时也是如此,我认为这是不应该的。我认为在深度 5 的空板上时间将是 7^5。再次感谢。
      • @user2587878 好吧,很酷的是我可以将它复制粘贴到 Visual Studio 并使用出色的调试器进行调试。今天晚些时候我会尝试解决这个问题,如果我能找到错误,我会在这里发布另一个答案。
      • 编辑:注意你的方法名是倒置的,你的 Min 方法计算最大化玩家价值 => 可能会导致混乱
      猜你喜欢
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多