蛇类游戏的深度Q学习

时间:2019-01-22 06:05:57

标签: python keras deep-learning reinforcement-learning q-learning

我正在基于Keras Plays Catch代码进行项目。我已将游戏更改为简单的Snake游戏,为简单起见,我在面板上将蛇形表示为圆点。如果Snake吃了奖励,它将获得+5的分数,而击中墙壁则将获得-5的分数,并且每走一步将获得-0.1的分数。但这不是在学习策略,而是给出了可怕的结果。这是我的游戏play功能

def play(self, action):
    if action == 0:
        self.snake = (self.snake[0] - 1, self.snake[1])
    elif action == 1:
        self.snake = (self.snake[0], self.snake[1] + 1)
    elif action == 2:
        self.snake = (self.snake[0] + 1, self.snake[1])
    else:
        self.snake = (self.snake[0], self.snake[1] - 1)

    score = 0
    if self.snake == self.reward:
        score = 5
        self.setReward()
    elif self.isGameOver():
        score = -5
    else:
        score = -0.1

    return self.getBoard(), score, self.isGameOver()

返回类似这样的内容(1是蛇,3是奖励,2是墙):

 [[2. 2. 2. 2. 2. 2. 2. 2. 2. 2.]
 [2. 0. 0. 0. 0. 0. 0. 0. 0. 2.]
 [2. 0. 0. 0. 0. 0. 0. 0. 0. 2.]
 [2. 0. 0. 0. 0. 0. 0. 0. 0. 2.]
 [2. 0. 0. 0. 0. 0. 0. 0. 0. 2.]
 [2. 0. 0. 0. 0. 1. 0. 0. 0. 2.]
 [2. 0. 0. 0. 0. 0. 3. 0. 0. 2.]
 [2. 0. 0. 0. 0. 0. 0. 0. 0. 2.]
 [2. 0. 0. 0. 0. 0. 0. 0. 0. 2.]
 [2. 2. 2. 2. 2. 2. 2. 2. 2. 2.]]

这是my code for q learning on gist

我不知道我在做什么错,但是它玩的大多数游戏都是卡在一个循环中(上下或左右),或者碰到墙,所以机会很小在奖励撞墙之前就吃了。我该如何改善并使其正常工作?

1 个答案:

答案 0 :(得分:1)

如果您的蛇从未获得奖励,它可能永远不会学会+5得分。与其每次移动使用恒定的0.1惩罚,不如对每个图块使用基于距离的成本可能会有所帮助。换句话说,您游戏中的代理商并不知道存在奖励。

我认为最终您会得到类似A* path finding之类的东西。至少试探法是相似的。


更新

考虑到您发布的完整代码,损失函数和得分不匹配!得分高时,模型的损失是随机的。

尝试将游戏得分最大化作为您的目标。