0

这些天我正在尝试强化/深度 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

4

1 回答 1

2

我建议这种方法是有问题的,因为尽管改变了你的奖励函数,但你没有在观察空间中包含步数。代理需要观察空间中的信息,以便能够区分它应该在什么点撞到目标。就目前而言,如果您的代理靠近目标并且它所要做的只是右转,但到目前为止它只完成了 5 次移动,那么这与它完成 19 次移动时的观察结果完全相同。关键是您不能为代理提供相同的状态并期望它做出不同的动作,因为代理看不到您的奖励函数,它只接收基于状态的奖励。因此,您正在与这些行为相矛盾。

想想你什么时候来测试代理的性能。不再有奖励。您所做的只是向网络传递一个状态,并且您期望它为同一状态选择不同的操作。

我假设您的状态空间是某种二维数组。应该可以直接更改代码以包含状态空间中的步骤数。那么奖励函数将类似于 ifobservation[num_steps] = 20:reward = 10。询问您是否需要更多帮助对其进行编码

于 2020-05-02T13:27:39.413 回答