python - 为什么我无法直接在 OpenAI Gym 环境中设置属性

标签 python openai-gym

因此,在编写自定义 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.registermax_episode_steps 参数注册环境时,OpenAI Gym 会自动将您的环境包装到 TimeLimit 对象中,该对象将确保在 max_episode_steps 之后环境返回 done=True。 Gym 包装器可以将函数调用(即 set_obs)转发到 unwrapperd 环境,但它们不转发属性。因此,env.obs = 5TimeLimit 实例而不是 TestEnv 实例上设置 obs 属性

关于python - 为什么我无法直接在 OpenAI Gym 环境中设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72089234/

相关文章:

python - 导入环境 OpenAI Gym 时出错

python - Beautiful Soup 没有 'get' 完整网页

python - pyhive:使用 pyhive 设置配置单元属性

java - 创建 TreeMap 可视化

python - 使用python从文本中提取最后一段

Python重定向表单 Action

python - 导入错误 : cannot import 'rendering' from 'gym.envs.classic_control'

machine-learning - 是否可以在训练前和训练期间修改 OpenAI 健身房状态?

python - OpenAI Gym 自定义环境 : Discrete observation space with real values