算法学习:Pac-Man的简单对抗

本文介绍了如何在Pac-Man平台上实现简单的对抗搜索算法,从Reflex Agent开始,通过MinMax博弈树改进,并应用Alpha-Beta剪枝优化决策时间。尽管有所提升,但仍然面临在特定情况下的智能不足问题,如在Ghost威胁小或豆子分布均匀时的徘徊行为。
摘要由CSDN通过智能技术生成

Pacman项目是加州大学伯克利分校提供的一个可视化的AI学习平台。其主体利用python完成。该项目提供了丰富的说明文档,以及预先实现了一些简单的算法供参考各接口的使用。

http://ai.berkeley.edu/project_overview.html

本文利用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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值