我是 RL 的初学者,目前正在尝试制作可以在简单情况下发挥最佳作用的 DQN 代理。
在这种情况下,代理商应该决定以什么速率对电池进行充电或放电,这相当于购买或出售电能,以套利的方式赚钱。所以动作空间例如是 [-6, -4, -2, 0, 2, 4, 6]kW。负数表示放电,正数表示充电。
在电池没电的情况下,应禁止放电动作(-6, -4, -2)。否则在电池充满电的情况下,应禁止充电动作(2、4、6)。
为了解决这个问题,我尝试了两种方法:
- 在每一步中,更新动作空间,这意味着掩盖了被禁止的动作。
- 对选择禁止行为给予极端惩罚(在我的例子中,惩罚是 -9999)
但他们都没有工作。
对于第一种方法,训练曲线(累积奖励)没有收敛。
对于第二种方法,训练曲线收敛,但充电/放电结果不合理(几乎是随机结果)。我认为在第二种方法中,epsilon-greedy 策略随机选择了很多被禁止的动作,并将这些样本存储在经验内存中,这会对结果产生负面影响。
例如:
状态定义为 [p_t, e_t],其中 p_t 是出售(放电)电池的市场价格,e_t 是电池中剩余的能量。
当state = [p_t, e_t = 0],并且选择放电动作(-6),这是在该状态下的禁止动作,下一个状态是[p_t,e_t = -6]。然后选择下一个动作(2),然后下一个状态是[p_t,e_t = -4]等等。
在这种情况下,< s, a, r, s' > 样本是:
< [p_t, 0], -6, -9999, [p_t+1, -6] >
< [p_t, -6], 2, -9999, [p_t+1, -4] > ...
这些预计不会存储在体验记忆中,因为它们不是所需的样本(e_t 应该大于零)。我认为这就是为什么没有得到预期结果的原因。
所以我该怎么做?请帮忙。