【问题标题】:Deep Q Learning For Snake Game贪吃蛇游戏的深度 Q 学习
【发布时间】:2019-06-15 13:31:45
【问题描述】:

我正在开发一个基于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

我不知道我做错了什么,但它玩的大多数游戏都会卡在一个循环中(上下或左右),或者它会直接撞到墙上,而且几率很小在奖励撞墙之前吃掉奖励。我该如何改进它并使其发挥作用?

【问题讨论】:

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


    【解决方案1】:

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

    我认为最终你会得到像A* path finding 这样的东西。至少启发式是相似的。


    更新:

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

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

    【讨论】:

    • 是的,我也想到了,但这甚至没有帮助。我将恒定惩罚更改为score = (14 - (abs(self.snake[0] - self.reward[0]) + abs(self.snake[1] - self.reward[1]))) / 14 which gives 0 for the longest distance. but it gets stuck in loop again
    • @Amir_P 你的距离成本对我来说似乎不合适。尝试更简单的惩罚:abs(c1.x-c2.x) + abs(c1.y-c2.y),即矩形的width + height。或者使用欧式距离。
    • 我因为接近而得到奖励,但你的意思是因为远离奖励而受到惩罚。好的,我现在正在测试它
    • 好吧,它稍微好一点,但在某些情况下,它再次陷入循环。我怎样才能使它更适用于所有情况?
    • 即使附近有奖励,它也会反复上下波动,但它一直在接受惩罚并且一直在做错误的动作。我认为我的体验游戏有问题不是吗?