2016-03-22 52 views
2

我试图用极大极小(和alpha beta修剪)来构建连接4的游戏,主要是向我自己证明我可以做到这一点。但是,我遇到的一个重大概念问题是如何实际使用minimax算法。我这样做的方式是我有一个AI类,它有一个函数用于执行返回int的minimax算法。在Java中实现用于连接的极小极大算法4

public int minimax(Board board, int depth, int alpha, int beta, String player) { 

    if(depth == 0 || board.getScore() >= 512) { 
     return board.getScore(); 
    } 

    else if(player.equals("computer")) { 
     int temp = -1000000; 
     for(Integer[] moves : board.availableMoves) { 
      board.putPiece(player, moves[0]); 
      temp = Math.max(temp, minimax(board, depth-1, alpha, beta, "human")); 
      board.removePiece(moves[0], moves[1]); 
      alpha = Math.max(alpha, temp); 
      if (alpha >= beta) { 
       break; 
      } 

     } 
     return temp; 
    } 

    else { 
     int temp = 1000000; 
     for(Integer[] moves : board.availableMoves) { 
      board.putPiece(player, moves[0]); 
      temp = Math.min(temp, minimax(board, depth+1, alpha, beta, "computer")); 
      board.removePiece(moves[0], moves[1]); 
      beta = Math.min(beta, temp); 
      if(alpha >= beta) { 
       break; 
      } 
     } 
     return temp; 
    } 
} 

这被称为computerMove()的Game类的函数调用。

public int computerMove() { 
    Board tempBoard = board; 
    int bestMove = 0; 
    AI ai = new AI(); 
    ai.minimax(board, difficulty, -1000000, 1000000, "computer"); 

    return bestMove; 
} 

但是,如何处理返回的int?我如何利用它来实际移动棋子?返回的int就是我能得到的最好的棋盘,对吧?它没有告诉我特别是我应该做的位置或董事会。

任何和所有的帮助,非常感谢。

感谢,

+0

从递归方法,你不仅应该返回目标函数值,它是最小值,而且还应该从当前位置返回,这将导致该值。 –

回答

1

书籍都说只返回了比分,但这是不切实际的实际玩游戏。当然,在任何地方保持最佳移动的开销可能会真的减慢程序的速度,所以一般情况下,您会使用驱动程序功能进行第一级扩展,并追踪最佳移动。这实际上是将这个实现封装在一个argmax function中,这只是一个很好的说法,表示它在最高级别返回最佳动作而不是分数。你可以在a little project I worked on last year中看到这个例子。代码是用C#编写的,但它足够接近Java,以便您了解想法。

或者,您可以修改代码以返回具有分数和最佳移动的元组(具有多个字段的类)。这比编写argmax封装更容易(并且稍微清洁IMO),但是如果没有额外的工程设计,这可能会导致minimax函数明显减慢,因为它会导致更多的分配。如果表现不是您的首要任务,那么这可能是一条路。

我还应该指出,你的实现至少有一个bug。无论谁在玩,并且在你的人类分支中,对于玩家来说,深度应该总是在减少。这意味着深度永远不会达到0,并且只有当决定赢家时才会触发基本情况。此外,使用alpha测试版时,评估板知道自己是谁以及谁是最大化的玩家,这一点很重要,否则你会遇到很多难以发现的错误。你不会在这里显示这些代码,但我想指出这一点,因为它每次都得到我。