如何阻止GYM向量环境在Done=True时自动重置?
Gym向量环境自动重置问题的解决方案
问题背景
在Gym单环境中,当done=True时环境不会自动重置,next_state会返回终止时刻的真实状态;但向量环境默认会在done=True时立即自动重置环境,导致next_state直接返回重置后的初始状态,无法获取终止时的原始状态。
方法1:禁用自动重置功能
可以在创建向量环境时通过autoreset=False参数关闭自动重置行为,这样当done=True时,next_state会返回终止时刻的真实状态,后续需要手动调用reset()重置环境。
示例代码:
import gym from copy import deepcopy nn = 1 # 方式1:使用SyncVectorEnv创建时指定autoreset=False env_vect = gym.vector.SyncVectorEnv( [lambda: gym.make("CartPole-v1") for _ in range(nn)], autoreset=False ) # 方式2:使用gym.vector.make创建时指定 # env_vect = gym.vector.make('CartPole-v1', num_envs=nn, autoreset=False) current_state = env_vect.reset() for i in range(50): next_state, reward, done, info = env_vect.step([1 for _ in range(nn)]) print(current_state / next_state, done, current_state, next_state) current_state = deepcopy(next_state) # 环境终止后手动重置 if done[0]: print("环境已终止,执行手动重置") current_state = env_vect.reset()
方法2:从info字典中提取终止状态
如果需要保留自动重置的默认行为,也可以从step()返回的info字典中获取终止时刻的原始状态,该状态通常存储在final_observation字段中(部分Gym版本可能为terminal_observation)。
示例代码:
import gym from copy import deepcopy nn = 1 env_vect = gym.vector.make('CartPole-v1', num_envs=nn) current_state = env_vect.reset() for i in range(50): next_state, reward, done, info = env_vect.step([1 for _ in range(nn)]) # 当环境终止时,提取真实的终止状态 if done[0]: terminal_state = info['final_observation'][0] print(f"终止时刻的真实状态:{terminal_state}") print(f"返回的next_state为重置后的状态:{next_state[0]}") print(current_state / next_state, done, current_state, next_state) current_state = deepcopy(next_state)
内容的提问来源于stack exchange,提问作者sebtac
相关产品推荐
相关产品推荐

