我正在基于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。
我不知道我在做什么错,但是它玩的大多数游戏都是卡在一个循环中(上下或左右),或者碰到墙,所以机会很小在奖励撞墙之前就吃了。我该如何改善并使其正常工作?
答案 0 :(得分:1)
如果您的蛇从未获得奖励,它可能永远不会学会+5得分。与其每次移动使用恒定的0.1惩罚,不如对每个图块使用基于距离的成本可能会有所帮助。换句话说,您游戏中的代理商并不知道存在奖励。
我认为最终您会得到类似A* path finding之类的东西。至少试探法是相似的。
更新:
考虑到您发布的完整代码,损失函数和得分不匹配!得分高时,模型的损失是随机的。
尝试将游戏得分最大化作为您的目标。