- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在做一个基于 Keras Plays Catch 的项目代码。我已将游戏更改为简单的贪吃蛇游戏,为了简单起见,我在棋盘上用一个点表示蛇。如果 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 .
我不知道我做错了什么,但它玩的大多数游戏都会卡在一个循环中(上下或左右),或者它会直接撞到墙上,而且有很小的机会在它撞到墙上之前吃掉奖励。我怎样才能改进它并使其发挥作用?
最佳答案
如果您的蛇从未达到奖励,它可能永远不会获得 +5 分。不是每次移动使用恒定的 0.1 惩罚,而是对每个图 block 使用基于距离的成本可能会有所帮助。换句话说,您游戏中的智能体并不知道奖励的存在。
我认为最终你会得到类似 A* path finding 的结果.至少启发式是相似的。
更新:
考虑到您发布的完整代码,您的损失函数和分数不匹配!当分数高时,模型的损失是随机的。
尝试将游戏得分最大化作为您的目标。
关于python - 贪吃蛇游戏的深度 Q 学习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54302176/
我不知道如何将尾部链接到头部以初始化列表。我了解如何链接新节点以及链接后的所有内容,但我不知道如何正确初始化蛇。它是用 C 语言编写的。 typedef struct node { int x
我想“更深入”地了解 C,所以我决定编写一个游戏 - 供 2 名玩家使用的贪吃蛇。 创建一个“ map ”,Snake结构,将其放入“ map ”(使用COORD)不是问题,但我知道,我会卡在某个地方
我是一名优秀的程序员,十分优秀!