在minmax算法中,如何确定函数何时到达树的末尾并打破递归调用。
我做了一个max函数,我调用了min函数。在min函数中,我做了什么?对于最大功能,我只是返回bestscore。
def maxAgent(gameState, depth):
if (gameState.isWin()):
return gameState.getScore()
actions = gameState.getLegalActions(0);
bestScore = -99999
bestAction = Directions.STOP
for action in actions:
if (action != Directions.STOP):
score = minAgent(gameState.generateSuccessor(0, action), depth, 1)
if (score > bestScore):
bestScore = score
bestAction = action
return bestScore
def minvalue(gameState,depth,agentIndex):
if (gameState.isLose()):
return gameState.getScore()
else:
finalstage = False
number = gameState.getNumAgents()
if (agentIndex == number-1):
finalstage = True
bestScore = 9999
for action in gameState.getLegalActions(agentIndex):
if(action != Directions.STOP
我现在无法理解如何继续?我不允许设置树的深度限制。它必须是任意的。
答案 0 :(得分:3)
通常你想搜索直到某个递归深度(例如n提前移动,下棋时)。因此,您应该将当前递归深度作为参数传递。如果您可以毫不费力地确定结果,那么当结果没有改善时,您可能会提前中止。
答案 1 :(得分:1)
在minmax算法中,如何 确定你的功能何时到达 树的尽头,打破了 递归调用。
基本上,当你到达叶子节点时,你会问。
当您达到搜索的最大深度或终端节点(即结束游戏的位置)时,会出现叶节点。
答案 2 :(得分:1)
我完全赞同relet。但您可能也想考虑这个问题:
有些时候,您可能也会认为您正在探索的当前分支值得深入探索。这将要求应用一些进一步的启发式方法。我不知道您的问题的解决方案需要多高级。这是因为我不知道问题出在哪里。
根据Amber的建议,尝试发布一些代码,以便我们知道您希望解决方案的复杂程度。此外,如果您解释了多少知道/ can_do,那么我们可能会建议更多有用的选项 - 您可能能够实际实现的内容,而不仅仅是您可能不知道如何或没有时间的惊人想法实施
答案 3 :(得分:0)
这个网站有minimax的帖子,即使它是基于IronPython: http://blogs.microsoft.co.il/blogs/dhelper/archive/2009/07/13/getting-started-with-ironpython-part-4-minimax-algorithm.aspx
它说:
Minimax算法本质上是递归的,因此它需要一个停止条件,在我们的例子中,游戏已经结束(不再移动)或达到了所需的深度(第3-8行)。
使用Negamax http://en.wikipedia.org/wiki/Negamax
可以避免使用两种不同的功能