创建MDP //具有多个终端的2D游戏的人工智能

时间:2018-12-16 02:53:44

标签: python artificial-intelligence reinforcement-learning mdp

所以我敢肯定,每个人在某个时候都听说过Berkeley Pac-Man AI challenge。不久前,我创建了一个2D平台器(不滚动),并认为从该项目中汲取一些灵感会很酷,但是可以为我的游戏(而不是PacMan)创建一个AI。话虽如此,我发现自己很困。我看了一些针对PacMan的GitHub解决方案,以及有关在Python中实现MDP /强化学习的大量文章。我很难将它们重新关联到我的游戏中。

在我的游戏中,我有10个关卡。每个级别都有水果,并且代理获取所有水果后,便完成该级别并开始下一个级别。这是一个示例阶段: enter image description here

正如您在这张照片中看到的,我的经纪人是小松鼠,他必须抓住所有的樱桃。在地面上,还有一些他无法行走的尖峰(否则会丧生)。您可以通过跳跃来避免峰值。因此,从技术上讲,一次跳跃将座席向左或向右移动2个空格(取决于他所面对的方式)。除此之外,您还可以在梯子上左右移动。您跳的空间不能超过1个,因此,您看到的顶部的“ 2+缺口”必须爬下梯子并四处走动。此外,上面没有显示的图片中,有些敌人只能在必须躲避的地板上向左和向右走(可以跳过它们,也可以避开它们)。它们在下面将要讨论的网格上进行跟踪。因此,这与游戏有关,如果您需要进一步的说明,可以随时提出问题,我可以提供帮助,让我进入我现在尝试过的内容,看看是否有人可以帮助我达成一些共识。

在我的代码中,我有一个网格,其中包含地图上的所有空间及其内容(平台,常规点,峰值,奖励/水果,阶梯等)。以此为基础,我创建了一个动作网格(下面的代码),该网格基本上将代理可以从每个位置移动的所有点存储在字典中。

for r in range(len(state_grid)):
        for c in range(len(state_grid[r])):
            if(r == 9 or r == 6 or r == 3 or r == 0):
                if (move_grid[r][c] != 6):
                    actions.update({state_grid[r][c] : 'None'})
                else:
                    actions.update({state_grid[r][c] : [('Down', 'Up')]})
            elif move_grid[r][c] == 4 or move_grid[r][c] == 0 or move_grid[r][c] == 2 or move_grid[r][c] == 3 or move_grid[r][c] == 5:
                actions.update({state_grid[r][c] : 'None'})
            elif move_grid[r][c] == 6:
                if move_grid[r+1][c] == 4 or move_grid[r+1][c] == 2 or move_grid[r+1][c] == 3 or move_grid[r+1][c] == 5:
                    if c > 0 and c < 18:
                        actions.update({state_grid[r][c] : [('Left', 'Right', 'Up', 'Jump Left', 'Jump Right')]})
                    elif c == 0:
                        actions.update({state_grid[r][c] : [('Right', 'Up', 'Jump Right')]})
                    elif c == 18:
                        actions.update({state_grid[r][c] : [('Left', 'Up', 'Jump Left')]})
                elif move_grid[r+1][c] == 6:
                    actions.update({state_grid[r][c] : [('Down', 'Up')]})
            elif move_grid[r][c] == 1 or move_grid[r][c] == 8 or move_grid[r][c] == 9 or move_grid[r][c] == 10:
                if c > 0 and c < 18:
                    if move_grid[r+1][c] == 6:
                        actions.update({state_grid[r][c] : [('Down', 'Left', 'Right', 'Jump Left', 'Jump Right')]})
                    else:
                        actions.update({state_grid[r][c] : [('Left', 'Right', 'Jump Left', 'Jump Right')]})
                elif c == 0:
                    if move_grid[r+1][c] == 6:
                        actions.update({state_grid[r][c] : [('Down', 'Right', 'Jump Right')]})
                    else:
                        actions.update({state_grid[r][c] : [('Right', 'Jump Right')]})
                elif c == 18:
                    if move_grid[r+1][c] == 6:
                        actions.update({state_grid[r][c] : [('Down', 'Left', 'Jump Left')]})
                    else:
                        actions.update({state_grid[r][c] : [('Left', 'Jump Left')]})
            elif move_grid[r][c] == 7:
                actions.update({state_grid[r][c] : 'Spike'})
            else:
                actions.update({state_grid[r][c] : 'WTF'})

在这一点上,我只是停留在发送到MDP的方式/内容上。我使用的是Berkeley MDP,但对于如何开始参与和实施它,我还是非常执着。我有很多数据点,哪里有东西,只是不确定如何使球滚动。

我有一个布尔网格,该网格可以跟踪所有有害物体(尖峰和敌人),并且由于敌人每秒移动一次,因此会不断更新。

我创建了一个奖励网格,设置了:

  • 秒杀“ -5”奖励
  • 掉落地图的“ -5”奖励
  • 水果是“ 5”分奖励
  • 其他所有都是“ -0.2”奖励(因为您想优化步骤,而不是整日都处于1级)。

在研究解决方案或实施方法的过程中,我遇到的另一部分问题是,大多数解决方案都是将汽车驶向某个位置。因此,他们只有1个奖励职位,而我的每个阶段都有多个成果。是的,我只是超级固步自封,对此感到沮丧。想尝试自己的事情,但如果我做不到,我也可以只做一个吃豆人,因为有很多在线解决方案。感谢您的宝贵时间,并为此提供帮助!

编辑:所以这是我试图举个例子,使移动网格恢复原状,尽管据我所知(显然),随着特工采取的每一个步骤,它都会动态变化,因为敌人会威胁到所有特定地点。 enter image description here

这是结果,您可以看到它接近了,但显然有很多奖励的事实有些滞后。我觉得我可能已经接近了,但我不确定。在这一点上,我有点沮丧。 enter image description here

1 个答案:

答案 0 :(得分:0)

创建人工智能与管理状态空间有关。在2d平台游戏中,状态空间由地图表管理。这意味着,机器人可以位于位置x / y上,并且该位置与表格给出的奖励有关。 q-learning背后的想法是,使用试验和错误算法从头开始创建状态动作空间。这意味着,从强化学习的角度来看,任务已经解决,恭喜。如果该软件包含用于存储奖励的q表,并且自动确定了奖励,则它是强化学习机器人。

二维平台游戏会从这种方法中获利吗?也许不是,这就是为什么可能会有一些挫败感的原因。问题在于,将玩家在地图上的位置与奖励联系起来的想法太过机械化。它不会导致类似人的政策,而是导致无法正常工作的控制者。这意味着,可以预测的是,机器人将在关卡中失败。他无法避免穗状花序,也无法收集果实。

改进AI算法很容易:开发人员要做的就是创造一个新的状态空间。这意味着,他必须将机器人的潜在动作映射到可以学习的q表矩阵。让我们描述一下机器人的潜在状态:机器人可能在梯子附近,在水果附近,在尖峰附近并且在跌落之前。状态可以组合,这意味着可以同时存在两种情况。这种定性状态描述必须映射到q表。与先前的状态空间描述有何不同?在第一个示例中,机器人的状态由简单的x / y值给出。在更好的方法中,状态由语言变量(“靠近梯子”,“靠近水果”)给出。如果机器人出了点问题,这种语言基础可以调试算法。这意味着开发人员与其软件之间的通信得到了改善。