You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:42:31