在naughts和crosses的minimax算法中,节点存储为什么?

时间:2016-03-13 16:48:28

标签: java algorithm recursion

我是java的初学者,所以请随时纠正我对这个问题的任何措辞。

无论如何,我正在与一个完美的AI对手一起创造一个naughts和crosses / tic tac toe游戏,我的目标是使用alpha-beta修剪minimax算法。我认为我很好地理解了算法,但我无法弄清楚如何将'nodes'和'nodeChilds'合并到其中。这是维基百科上的算法,在伪代码中。

01 function minimax(node, depth, maximizingPlayer)
02     if depth = 0 or node is a terminal node
03         return the heuristic value of node

04     if maximizingPlayer
05         bestValue := −∞
06         for each child of node
07             v := minimax(child, depth − 1, FALSE)
08             bestValue := max(bestValue, v)
09         return bestValue

10     else    (* minimizing player *)
11         bestValue := +∞
12         for each child of node
13             v := minimax(child, depth − 1, TRUE)
14             bestValue := min(bestValue, v)
15         return bestValue

任何人都可以了解“节点”应该具有什么样的价值?在我目前的算法中,我称之为minimax函数:

game.minimax(0, 1); //1 represents the computer's turn, equivalent to maximizingPlayer 

public int minimax(int depth, int turn)

任何帮助/解释都会受到高度赞赏,如果我提供的信息不充分或者我的问题解释得很严重,那么道歉。

1 个答案:

答案 0 :(得分:1)

node是游戏树的状态。在naughts和十字架的情况下,它描绘了板的当前状态。 minimax算法需要一个具有以下信息的节点:

  1. 如果它是终端节点(游戏结束)
  2. 下一位玩家
  3. 节点的值或实用程序,以对其他节点进行评级。你需要一个非终端板的启发式值。
  4. 来自此节点的可能的下一个节点(子节点)
  5. 您可以使用该信息创建Node接口,并使用它创建通用的minimax实现。像这样:

    enum Player { MAX, MIN }
    
    interface Node {
      boolean isTerminal();
      int utility();
      Player nextPlayer();
      List<Node> children();
    }
    

    然后,你有Node的顽皮和十字架实现,它编纂了游戏规则。例如,您可以将电路板存储为9个整数的简单数组(0表示空白,1表示X,2表示O)。

    class NaughtsAndCrossesNode implements Node {
      private int[] board;
    
      // ....
    }
    

    重要的是要认识到任何Node实现应该是不可变的类。玩游戏(获取节点的子节点)会创建更多实例,并且不会更改现有实例。