我应该如何处理minimax中的评估功能?

时间:2014-05-19 15:52:36

标签: java artificial-intelligence minimax alpha-beta-pruning

我想用minimax算法实现PacMan游戏,但我不能理解算法的含义。我写了这段代码

public MOVE miniMax(Game game,Node[] nodes,int depth,Boolean pacMan){

        int value;
        MOVE thisMove;
        int bestValue;
        int score=0;

        EnumMap<MOVE, MOVE[]> possibleMoves = nodes[game.getPacmanCurrentNodeIndex()].allPossibleMoves;
        MOVE[] moves = possibleMoves.get(MOVE.NEUTRAL);

        if(depth == 0)
            score = evaluationFunction(game);
        if(pacMan){
            bestValue = -INF;
        for(int i=0;i<moves.length;i++){
            game.copy();
            game.updatePacMan(moves[i]);
            thisMove= miniMax(game,nodes,depth-1,Boolean.FALSE);
            //bestValue = Math.max(bestValue, value);

        }
        return thisMove;

    }else{
            bestValue = INF;
            for(int i=0;i<moves.length;i++){
                game.copy();
                game.updatePacMan(moves[i]);
                thisMove= miniMax(game,nodes,depth-1,Boolean.TRUE);
                //bestValue = Math.min(bestValue, value);
            }
            //return bestValue;
            return thisMove;
        }
    }

    public int evaluationFunction(Game game){

        return 0;
}

我已经考虑了维基百科的伪代码编写了这段代码,但我遇到了一个问题 我不知道如何将评估函数计算为整数,然后决定返回一个移动,我应该只返回一个移动。并且评估函数是计算一次移动还是在节点的所有可能移动之间选择一个?

1 个答案:

答案 0 :(得分:0)

首先,minimax适用于转向国际象棋等游戏。很容易以离散的增量分解连续游戏(例如pacman)并应用这个算法,但你会发现你试图达到两个对抗目标之间的平衡并且可能既不满足:

  • 小增量可以获得更好的评估,但在计算要求方面会增长得太快(特别是如果你考虑鬼魂的所有同步移动)
  • 大的增量使得树更易于管理,但不会提供这种街机游戏所需的细粒度反应

不过,这只是一个有趣的问题,只是为了看到结果。

评估函数是一种启发式函数,它试图估计当前电路板状态的强度,其中给定播放器的分数越大越好。这将是一个相当大的挑战,因为没有明显的方法来估计pacman中一个位置的强度,但这里有一些想法:

  • 如果pacman不是无敌,那么远离鬼魂会更好
  • 如果pacman无敌,那么接近鬼魂会更好
  • 在电路板上留下较少的常规点可以更好
  • 更多的“无敌点”仍然留在棋盘上更好
  • 在监狱里有更多的鬼魂更好

这当然是从pacman的角度出发的。对于鬼魂来说,这是另一种方式。微调这些特征的各自权重是成功实现极小极大的难点之一。

顺便说一句,直接进行alpha-beta修剪或否定(有点棘手),它会在性能方面造成一个不同的世界,而不会降低评估质量。