Pacman项目是加州大学伯克利分校提供的一个可视化的AI学习平台。其主体利用python完成。该项目提供了丰富的说明文档,以及预先实现了一些简单的算法供参考各接口的使用。
本文利用Pac-Man平台实现简单的对抗搜索。
Part1 : Reflex Agent
提供的ReflexAgent有以下接口:
class ReflexAgent(Agent):
def getAction(self,gameState)
def evaluationFunction(self, currentGameState, action)
根据对getAction的分析:
def getAction(self, gameState) #根据当前的评估函数确定下一步的动作
#获取当前可能的下一步的方向 有stop east ...
legalMoves = gameState.getLegalActions()
#根据评估函数获取所有的下一步的权值
scores = [self.evaluationFunction(gameState, action) for action in legalMoves]
#获取最好的分数
bestScore = max(scores)
#根据最好的分数获取最好的行动选择
bestIndices = [index for index in range(len(scores)) if scores[index] == bestScore]
#从最好的行动集合中随机选择一个最为下一步的动作
chosenIndex = random.choice(bestIndices)
return legalMoves[chosenIndex]
可知evaluationFunction是这个Agent的灵魂,评估每一个输入的分数。根据提供的下面函数的接口,设计了一个简单的Pacman的AI。
初始版本的AI如该类所述,只提供了基本的反射。该agent所处环境包括以下内容
- 食物到Agent的距离
- 怪兽到Agent的距离
- 超级豆子到Agent的距离
- 下一个状态能否吃到豆子 或者被Ghost吃掉
计算出这些参数,给这些参数以固定的权值,就写出了最基础的AI
def evaluationFunction(self, currentGameState, action):
# 获取当前游戏状态 其中G表示为Ghost %表示为墙 角标表示pacman 角标方向代表上一次选择的方向
successorGameState = currentGameState.generatePacmanSuccessor(action)
# print 'successorGameState\n',successorGameState
# 获取这样移动后新的位置
newPos = successorGameState.getPacmanPosition()
# print 'newPos',newPos
# 获取食物在图中的分布(二维数组,有失误为T没食物为F)
newFood = successorGameState.getFood()
curFood = currentGameState.getFood()
# print 'newFood',newFood
# 获取Ghost的位置
newGhostStates = successorGameState.getGhostStates()
# print 'ghostState',newGhostStates[0].getPosition()
# 获取吃超级豆子之后 Ghost害怕还剩余的时间
newScaredTimes = [ghostState.scaredTimer for ghostState in newGhostStates]
# 对这个选择评估的分数
currscore = 0
if action == "Stop":
return -100
# 如果当前状态能够使ghost害怕,将所有的时间加入进来
for st in newScaredTimes:
currscore += st
# 根据Ghost所在的位置,获取与当前位置的距离
ghost_distances = []
for gs in newGhostStates:
ghost_distances += [manhattanDistance(gs.getPosition(),newPos)]
# 获取food所在的所有pos
foodList = newFood.asList()
curfoodList = curFood.a