人工智能实验——对抗搜索游戏(吃豆人)

人工智能实验——对抗搜索游戏(吃豆人)

实验内容主要包括了三个方面,改进Reflex智能体、设计Minimax智能体、设计Alpha-Beta智能体。以下为我的实验步骤与过程。(实验所修改或添加的代码均位于压缩包中的“multiAgents.py”),本篇博文主要讲理论,并不包含实现的代码,若需要代码可以访问我个人主页下载,也可以私信我要。

统计程序接口

本实验由于是在已有程序的基础上进行修改与添加的,所以统计一些必要的接口是比较重要的。下面为几个重要的接口,其详细说明如图所示。其中下面的gameState为程序中的GameState类对应的一个对象。

  1. gameState.getLegalActions(index)
  2. gameState.getPacmanPosition()
  3. gameState.getFood()
  4. gameState.getGhostPositions()
  5. ghostState.scaredTimer
  6. gameState.getCapsules()
  7. gameState.getWalls()
  8. gameState.generateSuccessor(agentIndex, action)
  9. gameState.getNumAgents()
    以上九个接口的详细说明如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传人工智能实验——对抗搜索游戏(吃豆人)_第1张图片

ReflexAgent智能体修改设计

ReflexAgent我采用了BFS算法加贪婪算法的组合进行了修改,下面为具体的修改思路。

  • 首先创建一个BFS搜索的函数,接收豆人的位置参数。然后利用此参数获取合法路径对应的坐标,并把这些坐标以队列的数据结构入队。设置一个循环语句,其判断语句为当坐标位置处有豆时退出。此循环语句中若位置不存在豆则出获取此位置处的合法移动路径的坐标并把这些坐标入队,然后把先前的坐标出队进入下一轮循环。.其流程图如图所示。

人工智能实验——对抗搜索游戏(吃豆人)_第2张图片

  • 贪婪算法指引前进方向,利用上面BFS中获取的坐标计算各个合法移动操作对应的坐标到此点的距离,并以此作为分数。

  • 除了要有导向性外,还要考虑与幽灵的距离。所以这里利用了吃豆人与幽灵的曼哈顿距离来进行躲避。当与幽灵的距离小于等于1时返回负无穷的分数以及时制作行为的产生。

    for i in ghosstP:
        if abs(newPos[0]-i[0]) + abs(newPos[1]-i[1]) <= 1:
            return -999999999
    
  • 在ReflexAgent中发现在一些比较复杂的图时,停止动作会让幽灵变得停滞所以这里将停止动作的分数改为了仅大于遇到幽灵的分数。

  • 除了常规的引导吃豆人外,我在ReflexAgent中还设计了让吃豆人在接近于胶囊时(离胶囊的曼哈顿距离小于5)优先吃得胶囊以获取更高的分数。

    for i in capsules:
        if abs(newPos[0] - i[0]) + abs(newPos[1] - i[1]) <= 3:
            if action == "Stop":
                return -5000
            return (5-(abs(newPos[0] - i[0]) + abs(newPos[1] - i[1]))
    
  • RelexAgent测试结果如图所示

    利用 python pacman.py -p ReflexAgent -l openClassic -n 10 -q 进行连续10次的测试其最终10次全胜,平均分数为1305.4

    在这里插入图片描述

Minimax智能体设计

对于Minimax智能体的设计经历比较多的坑,一开始完全按照课件的思路来进行设计代码,设计了节点类,操作类之类的。在一切都设计完后Minimax可以成功运行并且成功率也有百分之50或60,但是在设计Alpha-Beta算法时发现,Minimax的代码居然是每一层都搜索吃豆人的,然后又基于代码十分复杂难以修改。所以最后是参考了别人的代码以及PPT上的伪代码进行的重新设计。
参考的文章有:

[1]https://blog.csdn.net/Pericles_HAT/article/details/116901139
[2]https://blog.csdn.net/m0_48134027/article/details/120340931

  • Max_value函数设计
    首先先要设计一个max_value()函数用以评估第max层,在函数的设计中有与min_value函数一起进行了递归,其递归的终点就是游戏结束或者到达给定的深度。还未到达递归截至点时就相当于自顶向下的搜索,而到达后的回溯就相当于自底向上的评分。其搜索有点类似于DFS的搜索,一直往下搜索直到到达限制。而评分时首先利用的是自身的evaluate函数,然后后面到上一层时则根据min或者max的属性来进行比较评估。下图为max_value函数流程图。

    人工智能实验——对抗搜索游戏(吃豆人)_第3张图片

  • Min_value函数的设计
    Min_value函数于max_value十分的类似,其不同点主要在于v值的初始化,在min中是初始化为正无穷的。还有就是min函数没必要去除stop动作。很显著不同的一点是min函数需要判断是否达到最后一个幽灵以决定是调用min函数还是max函数。以及其比较时是取最小的。下图为min函数的流程图。

    人工智能实验——对抗搜索游戏(吃豆人)_第4张图片

  • 最后上面两个函数只要先调用max函数即可使得两个函数相互递归得到结果了。下面的为测试结果图:
    python pacman.py -p MinimaxAgent -l minimaxClassic -a depth=4 -q -n 100
    在深度为4的情况下测试100次其胜率为62%。

    人工智能实验——对抗搜索游戏(吃豆人)_第5张图片

Alpha-Beta智能体设计

我所设计的Alpha-Beta智能体是在Minimax基础上剪枝的,其代码部分与minimax十分接近只是添加了alpha与beta两个全局量以进行剪枝。在max函数中,每一次的遍历动作都会判断v值是否大于beta值,若大于的话则则直接返回v无需下面的循环遍历操作。除了截断外,每一次循环都会检测alpha值是否需要更新,每一次都会取v和原来的alpha中最大的那个作为新alpha。而在min函数中的操作也是类似的,只是将beta值与alpha值互换,然后大于与小于互换。下面两图分别为max与min的alpha-beta剪枝图

人工智能实验——对抗搜索游戏(吃豆人)_第6张图片

输入代码 python pacman.py -p AlphaBetaAgent -a depth=3 -l smallClassic
运行后可以有明显感觉到运行速度得到了很大的提升,虽然获胜很难。

你可能感兴趣的:(人工智能,游戏,大数据,算法)