如何处理极小化极大算法中的评估函数?

我想使用极小化极大算法实现《吃豆人》游戏,但我对算法的理解不够流利。我已经编写了以下代码

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;}

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


回答:

首先,极小化极大算法适用于像国际象棋这样的回合制游戏。将连续游戏(如《吃豆人》)分解成离散增量并应用此算法是很有诱惑力的,但你会发现自己试图在两个对立目标之间达到平衡,可能两者都无法满足:

  • 小的增量可以带来更好的评估,但计算需求会迅速增长(特别是如果你考虑到所有鬼魂的同时移动)
  • 大的增量可以使树更易于管理,但无法提供这种街机游戏所需的细粒度反应

尽管如此,这仍然是一个有趣的问题,至少可以看看结果。

评估函数是一个启发式函数,试图估计当前棋盘状态的强度,其中较高的分数对给定玩家更有利。这将是一个相当大的挑战,因为在《吃豆人》中没有明显的方法来估计位置的强度,但这里有一些想法:

  • 如果吃豆人不是无敌的,远离鬼魂更好
  • 如果吃豆人是无敌的,靠近鬼魂更好
  • 棋盘上剩余的普通点越少越好
  • 棋盘上剩余的“无敌点”越多越好
  • 监狱中的鬼魂越多越好

当然,这是从吃豆人的角度来说的。对于鬼魂来说,情况正好相反。成功实现极小化极大算法的难点之一是微调这些特性的各自权重。

顺便说一下,直接使用alpha-beta剪枝或negascout(稍微复杂一些),这将在性能上带来巨大的差异,而不会损失评估质量。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注