所以我制作了一个小型的python游戏,玩家必须到达终点并避免陷阱,而且看起来像这样
我尝试了许多不同的批处理大小,奖励,输入形状,隐藏层中的节点数量,但是网络仍未进行训练。
我目前的训练方式,正在使用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用于健身游戏以来,就无需为其提供代码。