有没有办法从
gym.Env
方法内部访问 step
的当前步骤号?
我正在使用
stable_baselines3
中的模型,并希望在执行 N 个步骤时终止环境。
您可以创建自己的
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 个值,因此也许您必须对此进行调整。
您可以使用 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!