获取健身房当前步数。Env

问题描述 投票:0回答:2

有没有办法从

gym.Env
方法内部访问
step
的当前步骤号?

我正在使用

stable_baselines3
中的模型,并希望在执行 N 个步骤时终止环境。

python openai-gym stable-baselines
2个回答
2
投票

您可以创建自己的

TerminatingEnv
类来包装环境,并考虑计数和终止(如果内部计数过高),因此您可以像任何其他环境一样使用它,同时仍然具有终止功能。
env.step_counter
会告诉你自环境重置以来已经完成了多少步:

import gym

class TerminatingEnv(gym.Env):
    def __init__(self, env, max_steps):
        self.env = env
        self.max_steps = max_steps
        self.step_counter = 0

    def step(self, action):
        
        obs, reward, terminated, truncated, info = self.env.step(action)
        self.step_counter += 1
        if self.step_counter >= self.max_steps:
            return obs, reward, True, True, info
        else:
            return obs, reward, terminated, truncated, info
    
    def reset(self):
        self.step_counter = 0
        return self.env.reset()
    
    def render(self):
        return self.env.render()
    
    def close(self):
        return self.env.close()
    
    def seed(self, seed=None):
        return self.env.seed(seed)
    

env0 = gym.make('CartPole-v0')
env = TerminatingEnv(env0, 5)
while True:
    action = 1
    env.reset()
    for i in range(100):
        obs, reward, terminated, truncated, info = env.step(action)
        print(env.step_counter)
        if terminated:
            break

输出为:

1
2
3
4
5
1
2
3
4
5
1

等等...

在旧版本中,

self.env.step
返回 4 个值而不是 5 个值,因此也许您必须对此进行调整。


0
投票

您可以使用 TimeLimit 包装器在完成之前结束模拟:

from gymnasium.wrappers import TimeLimit

包装器而是调用 env.step() 并更新“截断”标志,使用 当前步数和 max_episode_steps(可以在中指定) 返回之前: obs,reward,... (如源所示:https://gymnasium.farama.org/_modules/gymnasium/wrappers/time_limit/#TimeLimit

下面是如何使用包装器的示例,gymnasium版本1.26.4(请将环境替换为gym中安装的环境,env.render()是多余的):

env = gym.make('GridWorld-v0', render_mode="human")
# add a time limit (max steps per espiode) to cutoff
# simulation if the goal isn't hit
env = TimeLimit(env, max_episode_steps=10)  
# 2nd param opt (see register)
print('max eps steps, ', env.spec.max_episode_steps)
state = env.reset()
env.render()
done = False
while not done:
    action = env.action_space.sample()
    state, reward, done, truncated, info = env.step(action)
    env.render()
    if truncated: 
        break
else:
    print("[info] simulation terminated, mission accomplished!")
if truncated:
    print("[info] simulation truncated, mission failed!”)

输出可能:

...
max eps steps,  10
...
[info] simulation truncated, mission failed!
© www.soinside.com 2019 - 2024. All rights reserved.