Jod*_*992 6 python recursion artificial-intelligence minimax python-2.7
我正在Pacman的基本游戏中的Python 2.7.11中实现minimax。Pacman是最大化代理,而一个或多个幽灵(取决于测试布局)是最小化代理。
我必须实现minimax,以便可能有多个以上的最小化代理,并且它可以创建n层(深度)的树。例如,第1层将是每个幽灵转弯以最小化终端状态实用程序的可能移动,以及pacman进行转弯以最大化幽灵已经最小化的东西。在图形上,层1如下所示:
如果我们将以下任意实用程序分配给绿色终端状态(从左到右):
-10, 5, 8, 4, -4, 20, -7, 17
Pacman应该返回-4,然后朝该方向移动,根据该决定创建一个全新的minimax树。首先,实现我的实现所需要的变量和函数的列表:
# Stores everything about the current state of the game
gameState
# A globally defined depth that varies depending on the test cases.
# It could be as little as 1 or arbitrarily large
self.depth
# A locally defined depth that keeps track of how many plies deep I've gone in the tree
self.myDepth
# A function that assigns a numeric value as a utility for the current state
# How this is calculated is moot
self.evaluationFunction(gameState)
# Returns a list of legal actions for an agent
# agentIndex = 0 means Pacman, ghosts are >= 1
gameState.getLegalActions(agentIndex)
# Returns the successor game state after an agent takes an action
gameState.generateSuccessor(agentIndex, action)
# Returns the total number of agents in the game
gameState.getNumAgents()
# Returns whether or not the game state is a winning (terminal) state
gameState.isWin()
# Returns whether or not the game state is a losing (terminal) state
gameState.isLose()
Run Code Online (Sandbox Code Playgroud)
这是我的实现:
"""
getAction takes a gameState and returns the optimal move for pacman,
assuming that the ghosts are optimal at minimizing his possibilities
"""
def getAction(self, gameState):
self.myDepth = 0
def miniMax(gameState):
if gameState.isWin() or gameState.isLose() or self.myDepth == self.depth:
return self.evaluationFunction(gameState)
numAgents = gameState.getNumAgents()
for i in range(0, numAgents, 1):
legalMoves = gameState.getLegalActions(i)
successors = [gameState.generateSuccessor(j, legalMoves[j]) for j, move
in enumerate(legalMoves)]
for successor in successors:
if i == 0:
return maxValue(successor, i)
else:
return minValue(successor, i)
def minValue(gameState, agentIndex):
minUtility = float('inf')
legalMoves = gameState.getLegalActions(agentIndex)
succesors = [gameState.generateSuccessor(i, legalMoves[i]) for i, move
in enumerate(legalMoves)]
for successor in successors:
minUtility = min(minUtility, miniMax(successor))
return minUtility
def maxValue(gameState, agentIndex)
self.myDepth += 1
maxUtility = float('-inf')
legalMoves = gameState.getLegalActions(agentIndex)
successors = [gameState.generateSuccessor(i, legalMoves[i]) for i, move
in enumerate(legalMoves)]
for successor in successors:
maxUtility = max(maxUtility, miniMax(successor))
return maxUtility
return miniMax(gameState)
Run Code Online (Sandbox Code Playgroud)
有谁知道我的代码为什么要这样做?我希望有一些Minimax /人工智能专家可以识别我的问题。提前致谢。
更新:通过实例化而不是的self.myDepth值,我已经解决了引发异常的问题。但是,我的实现的整体错误仍然存在。01
我终于找到了解决我的问题的方法。主要问题是我没有depth正确引用来跟踪层数。不应增加maxValue方法内的深度,而应将其作为参数传递给每个函数,并且仅在传递到maxValue. 还有其他几个逻辑错误,例如未正确引用,以及我的方法没有返回操作numAgents这一事实。miniMax这是我的解决方案,结果是有效的:
def getAction(self, gameState):
self.numAgents = gameState.getNumAgents()
self.myDepth = 0
self.action = Direction.STOP # Imported from a class that defines 5 directions
def miniMax(gameState, index, depth, action):
maxU = float('-inf')
legalMoves = gameState.getLegalActions(index)
for move in legalMoves:
tempU = maxU
successor = gameState.generateSuccessor(index, move)
maxU = minValue(successor, index + 1, depth)
if maxU > tempU:
action = move
return action
def maxValue(gameState, index, depth):
if gameState.isWin() or gameState.isLose() or depth == self.depth:
return self.evaluationFunction(gameState)
index %= (self.numAgents - 1)
maxU = float('-inf')
legalMoves = gameState.getLegalActions(index)
for move in legalMoves:
successor = gameState.generateSuccessor(index, move)
maxU = max(maxU, minValue(successor, index + 1, depth)
return maxU
def minValue(gameState, index, depth):
if gameState.isWin() or gameState.isLose() or depth == self.depth:
return self.evaluationFunction(gameState)
minU = float('inf')
legalMoves = gameState.getLegalActions(index)
if index + 1 == self.numAgents:
for move in legalMoves:
successor = gameState.generateSuccessor(index, move)
# Where depth is increased
minU = min(minU, maxValue(successor, index, depth + 1)
else:
for move in legalMoves:
successor = gameState.generateSuccessor(index, move)
minU = min(minU, minValue(successor, index + 1, depth)
return minU
return miniMax(gameState, self.index, self.myDepth, self.action)
Run Code Online (Sandbox Code Playgroud)
很快!我们最终的多智能体极小极大实现。
| 归档时间: |
|
| 查看次数: |
3109 次 |
| 最近记录: |