因此,在编写自定义 OpenAI 健身房环境时,我遇到了一个有趣的错误。下面的代码是我可以编写的重现该错误的最小环境:
import gym
class TestEnv(gym.Env):
obs = 3
def set_obs(self, obs):
self.obs = obs
def reset(self):
return self.obs
def step(self, a):
return self.obs, 0, False, None
gym.register('TestEnv-v0',
entry_point=f'{__name__}:TestEnv',
max_episode_steps=1000)
env = gym.make('TestEnv-v0')
print(env.reset())
print(env.obs)
env.obs = 5
print(env.reset())
print(env.obs)
env.set_obs(8)
print(env.reset())
print(env.obs)
3
3
3
5
8
5
出于某种原因,调用 set_obs
和直接设置 obs
属性之间存在差异!我从未在 Python 中应用过 setter 函数的模式(它太像 Java 了),但在这里我必须使用它,以便真正考虑到新的 obs
。
最佳答案
当您使用 gym.register
和 max_episode_steps
参数注册环境时,OpenAI Gym 会自动将您的环境包装到 TimeLimit
对象中,该对象将确保在 max_episode_steps
之后环境返回 done=True
。 Gym 包装器可以将函数调用(即 set_obs
)转发到 unwrapperd 环境,但它们不转发属性。因此,env.obs = 5
在 TimeLimit
实例而不是 TestEnv
实例上设置 obs
属性
关于python - 为什么我无法直接在 OpenAI Gym 环境中设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72089234/