这些天,我正在尝试强化/深层Q学习。我从“蛇”的基本游戏开始。 在本文的帮助下:https://towardsdatascience.com/how-to-teach-an-ai-to-play-games-deep-reinforcement-learning-28f9b920440a 我成功地训练它可以吃食物。 现在,我希望它以特定的步骤(例如“ 20”)进食,而不是更多,更少。奖励制度和政策将如何更改? 我尝试了很多事情,但收效甚微。 例如,我尝试过:
def set_reward(self, player, crash):
self.reward = 0
if crash:
self.reward = -10
return self.reward
if player.eaten:
self.reward = 20-abs(player.steps - 20)-player.penalty
if (player.steps == 10):
self.reward += 10 #-abs(player.steps - 20)
else:
player.penalty+=1
print("Penalty:",player.penalty)
谢谢。 这是程序: https://github.com/maurock/snake-ga
答案 0 :(得分:1)
我认为这种方法是有问题的,因为尽管更改了奖励功能,但您并未在观察空间中包含步数。代理需要观察空间中的该信息,以便能够区分应该到达目标的位置。就目前而言,如果您的特工靠近目标,而它所要做的就是右转,但到目前为止只完成了5次动作,这与观察到19次动作完全相同。关键是您不能向代理提供相同的状态并期望它执行不同的操作,因为代理没有看到您的奖励功能,它仅根据状态获得奖励。因此,您在与这些动作相矛盾。
请考虑何时进行代理性能测试。不再有奖励。您正在做的只是将网络传递给一个状态,并且期望它为同一状态选择不同的操作。
我假设您的状态空间是某种2D数组。应该直接更改代码以包含状态空间中的步骤数。然后,如果observation [num_steps] = 20:奖励= 10,则奖励函数将类似于。 询问是否需要更多编码帮助