我构建了一个自定义的强化学习环境
和代理
,类似于迷宫游戏。
在迷宫中,有5个可能的动作:向上、向下、向左、向右和原地不动。如果被阻挡,例如代理无法向上移动,那么人们如何设计env
和agent
来模拟这种情况?
具体来说,代理当前处于状态s0
,按照定义,向下、向左和向右的动作将状态改变为其他值,并立即获得奖励(如果在出口则>0)。一种可能的方法是当执行up
动作时,状态保持在s0
,并且奖励将是一个很大的负数。理想情况下,代理会学会这一点,并且在这种状态下永远不会再次向上移动。
然而,我的代理似乎没有学会这一点。相反,它仍然会向上移动。另一种方法是硬编码代理和环境,使代理在s0
状态下无法执行up
动作,我能想到的是:
- 当处于某些状态时,如果不允许向上移动,我们查看不同动作的Q值
- 选择除
up
之外Q值最大的动作 - 因此,代理将永远不会执行无效动作
我想问的是,上述方法可行吗?会不会有相关的问题?或者有更好的设计来处理边界和无效动作?
回答:
我认为这应该是可行的(但比猜测更好的方法是尝试一下)。其他问题是:您的代理能够观察到什么状态?您是否在进行奖励裁剪?
另一方面,如果您的代理没有学会避免撞墙,那么学习过程中可能存在其他问题(也许奖励函数中有bug?)
硬编码裁剪动作可能会导致您想要看到的行为,但这肯定会降低代理的整体性能。
您还实现了什么?如果还没有,可能需要考虑引入经验回放。