繁体   English   中英

蛇游戏的深度Q学习

[英]Deep Q Learning For Snake Game

我正在基于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.]]

这是我在qist上学习q的代码

我不知道自己在做什么错,但大多数游戏都会卡在一个循环中(上下左右或左右),或者直撞墙壁,并且很少有机会吃掉在碰壁之前先获得奖励。 我如何改进它并使它起作用?

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

我认为最终您将得到诸如A *路径查找之东西。 至少试探法是相似的。


更新:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM