我不是专家,但据我了解,您应该使用非策略算法,两者之间的区别是:
On-Policy:代理根据当前正在使用的策略派生的当前动作学习价值函数。Off-Policy:代理根据从另一个策略派生的动作来学习价值函数。
这意味着您可以使用其他策略进行探索。例如,如果您使用 Q-Learning(不是您的情况,因为您的问题的连续值)这是一种脱离策略的方法,您可以使用特定策略进行探索以获取操作(您只能选择有效操作)然后您可以使用 Q-Learning 方程更新您的 q-table。
在您的情况下,您可以使用脱离策略的深度方法。我建议使用 DDPG/TD3,您可以在这里简要了解其中的一些。
这个想法是使用一种探索策略,您将其限制为仅选择有效值(硬约束),并将 State、Action、Reward、State' 集成到回放缓冲区中。Stable_Baseline 库不允许这样做,但您可以查看 TD3 的原始源代码。
编辑1:
如果你在 Q 学习算法中看到,e-greedy 包括以概率选择ϵ a←any action, 与1−ϵ这a←maxaQ(s,a). 这any action是您使用此“控制器”仅选择随机(但有效)操作的代码部分。这是因为您想探索但仅使用有效操作进行探索。然后 Q 学习可以“利用”从您之前进行的探索中选择最佳动作。现在,对于连续动作的情况,您可以使用 DDPG/TD3 执行类似的操作,但您将这些有效动作存储在重放缓冲区中,因此您的神经网络可以学习仅包含有效动作的“数据”。
编辑2:
在您的自定义环境中,您可以定义您的操作空间,例如:
self.action_space = gym.spaces.Box(low=-1, high=1, shape=(1,))
现在,正如您所说,在您的环境的阶跃函数中,您可以建立 x(t) 和 y(t)
maxX=10 #Depends on the maximum value of your x(t), I assigned a 10
maxY=10 #Depends on the maximum value of your y(t), I assigned a 10
x=0
y=0
if action>0:
y=0
x=action*maxX
elif action<0:
x = 0
# you need to multiply by -1 because your action is negative
y = -1*action * maxY
# do the rest of the code of your controler with x and y
这样,您的 RL 代理将了解哪个动作(介于 -1 和 1 之间)将获得最佳奖励,但在阶跃函数中,您将动作 [-1 +1] 映射到您的真实值。