【发布时间】:2020-02-26 16:55:04
【问题描述】:
在一个项目的上下文中,在 UC Berkley pacman ai 项目(它的第二部分)之后,我想在没有 alpha-beta 剪枝的情况下实现 minimax 算法,用于布局足够小以至于递归不是递归的对抗代理一个问题。
将问题定义为 2 人(我们假设只有 1 个幽灵)、回合制、具有完美信息的零和游戏后,应用递归将非常简单。然而,由于许多不同的策略最终可能处于相同的游戏状态(定义为 pacman 的位置、ghost 的位置、食物的位置和当前正在玩的玩家的元组),我想找到一种方法来避免重新计算所有这些状态。
我搜索并阅读了一些关于转置表的内容。但是,我不确定如何使用这种方法,我认为我应该实现的是以下内容: 每次扩展尚未访问的状态时,将其添加到“已访问”集合中。如果状态已经扩展,那么如果轮到最大玩家 (pacman),则返回 +inf 值(通常不会被最小玩家选择),如果轮到最小玩家,则相应地返回 -inf。
我认为这个想法的问题,以及它适用于某些布局但不适用于其他布局的原因是,当我点击一个节点时,其所有子节点都已展开,我必须选择的唯一值from 是 +/- 无穷大。这导致无限值向上传播并被选中,而实际上这种游戏状态有可能导致损失。我想,我已经理解了这个问题,但我似乎无法找到解决它的方法。
还有其他方法可以用来避免计算重复的游戏状态吗?有没有我不知道的标准方法?
这是一些伪代码:
def maxPLayer(currentState, visitedSet):
if not isTerminalState
for nextState, action in currentState.generateMaxSuccessors()
if nextState not in visitedSet
mark nextState as visited
scores = scores + [minPlayer(nextState, visitedSet)]
if scores is not empty
return bestScore = max(scores)
else
return +inf #The problem is HERE!
else
return evalFnc(currentState)
end MaxPlayer
def minPlayer(currenstState, visitedSet):
if not isTerminal
for nextState, action in generateMinSuccessors()
if nextState not in visitedSet
mark nextState as visited
scores = scores + [maxPLayer(nextState, visitedSet)]
if scores is not empty
return bestScore = min(scores)
else
return -inf #The problem is also HERE!
else
return evalFnc(currentState)
end MinPlayer
请注意,第一个玩的玩家是最大的,我选择得分最高的动作。无论我是否考虑无限值,都不会发生任何变化,仍然存在代理失败或无限循环的游戏实例。
【问题讨论】:
标签: algorithm artificial-intelligence memoization minimax pacman