为什么我的Deep Q Network无法学习玩简单的游戏?

问题描述 投票:0回答:1

所以我制作了一个小型的python游戏,玩家必须到达终点并避免陷阱,而且看起来像这样

enter image description here

我尝试了许多不同的批处理大小,奖励,输入形状,隐藏层中的节点数量,但是网络仍未进行训练。

我目前的训练方式,正在使用64个批处理大小和100000个内存大小,输入是一维数组,表示游戏状态+玩家坐标+游戏结束前剩余移动量,并且奖励开始在-distanceFromEnd + maxDistance / 2处,如果到达终点,则获得+500奖励并且游戏结束;如果触摸陷阱,则获得-100奖励并且游戏结束;如果游戏未完成64次移动您将获得-200奖励,游戏结束了。

[我正在使用AdamOptimizer和MSE损失函数,并且对于激活函数,我在除最后一层之外的所有层上都使用ReLU,我什么都不用。

玩家,结尾,陷阱的位置在每个情节之后均被随机分配

即使经过3000集,最近100场比赛的平均得分(分数是奖励的总和)约为-30。DQN在健身游戏LunarLander-v2上运行良好。就像我说的那样,我一直在尝试调整价值,但这并没有帮助。

这是我的步进功能

 def step(self, action):
isDone = False
if action == 0:
  # Move Up
  if self.playerY != 0:
    self.playerY -= 1
elif action == 1:
  # Move Down
  if self.playerY != 7:
    self.playerY += 1
elif action == 2:
  # Move Right
  if self.playerX != 0:
    self.playerX -= 1
elif action == 3:
  # Move Left
  if self.playerX != 7:
    self.playerX += 1

x = self.playerX - self.endX
x = x * x
y = self.playerY - self.endY
y = y * y

distance = math.sqrt(x + y)
reward = -distance + self.maxDist
#self.lastDist = distance

if self.state[self.playerX, self.playerY] == self.END:
  reward = 500
  isDone = True
elif self.state[self.playerX, self.playerY] == self.TRAP:
  reward = -100
  isDone = True

self.moves -= 1

if self.moves < 0:
  reward = -200
  isDone = True

return self.getFlatState(), reward, isDone, 0

状态获取器功能

  # Adding one to the players coordinates to avoid 0s as a try to fix the problem
  def getFlatState(self):
     return np.concatenate([np.ndarray.flatten(self.state), [self.playerX + 1, self.playerY + 1, self.moves]])

我确信自从DQN用于健身游戏以来,就无需为其提供代码。

python machine-learning deep-learning tensorflow2.0 reinforcement-learning
1个回答
0
投票
在这种情况下,我将研究使用寻路算法而不是机器学习。您将找到路径,然后让机器人沿着路径移动。签出Dijkstra's Algorithm甚至A*
© www.soinside.com 2019 - 2024. All rights reserved.