矢量化

Gymnasium.vector.VectorEnv

class gymnasium.vector.VectorEnv[源代码]

用于向量化环境的基类,以并行运行同一环境的多个独立副本。

向量环境可以通过同时采样多个子环境来提供每秒步骤数的线性加速。Gymnasium 包含两个通用的向量环境::class:AsyncVectorEnv 和 :class:SyncVectorEnv,以及几个自定义的向量环境实现。对于 :func:reset 和 :func:step 批处理,observationsrewardsterminationstruncationsinfo 为每个子环境,请参见下面的示例。对于 rewardsterminationstruncations,数据被打包成形状为 (num_envs,) 的 NumPy 数组。对于 observations(和 actions,批处理过程取决于观察(和动作)空间的类型,并且通常针对神经网络的输入/输出进行了优化。对于 info,数据保持为字典,以便键将提供所有子环境的数据。

对于创建环境,:func:make_vec 是一个等同于 :func:make 的向量环境,用于轻松创建包含多个独特参数的向量环境,以修改环境质量、环境数量、向量化类型、向量化参数。

备注

在 :meth:reset 和 :meth:step 方法中的 info 参数,在 v0.25 之前是作为每个子环境的字典列表实现的。然而,这在 v0.25+ 版本中被修改为每个键对应一个 NumPy 数组的字典。要使用旧的 info 样式,请使用 :class:DictInfoToList 包装器。

示例

>>> import gymnasium as gym
>>> envs = gym.make_vec("CartPole-v1", num_envs=3, vectorization_mode="sync", wrappers=(gym.wrappers.TimeAwareObservation,))
>>> envs = gym.wrappers.vector.ClipReward(envs, min_reward=0.2, max_reward=0.8)
>>> envs
<ClipReward, SyncVectorEnv(CartPole-v1, num_envs=3)>
>>> envs.num_envs
3
>>> envs.action_space
MultiDiscrete([2 2 2])
>>> envs.observation_space
Box([[-4.80000019e+00 -3.40282347e+38 -4.18879032e-01 -3.40282347e+38
   0.00000000e+00]
 [-4.80000019e+00 -3.40282347e+38 -4.18879032e-01 -3.40282347e+38
   0.00000000e+00]
 [-4.80000019e+00 -3.40282347e+38 -4.18879032e-01 -3.40282347e+38
   0.00000000e+00]], [[4.80000019e+00 3.40282347e+38 4.18879032e-01 3.40282347e+38
  5.00000000e+02]
 [4.80000019e+00 3.40282347e+38 4.18879032e-01 3.40282347e+38
  5.00000000e+02]
 [4.80000019e+00 3.40282347e+38 4.18879032e-01 3.40282347e+38
  5.00000000e+02]], (3, 5), float64)
>>> observations, infos = envs.reset(seed=123)
>>> observations
array([[ 0.01823519, -0.0446179 , -0.02796401, -0.03156282,  0.        ],
       [ 0.02852531,  0.02858594,  0.0469136 ,  0.02480598,  0.        ],
       [ 0.03517495, -0.000635  , -0.01098382, -0.03203924,  0.        ]])
>>> infos
{}
>>> _ = envs.action_space.seed(123)
>>> actions = envs.action_space.sample()
>>> observations, rewards, terminations, truncations, infos = envs.step(actions)
>>> observations
array([[ 0.01734283,  0.15089367, -0.02859527, -0.33293587,  1.        ],
       [ 0.02909703, -0.16717631,  0.04740972,  0.3319138 ,  1.        ],
       [ 0.03516225, -0.19559774, -0.01162461,  0.25715804,  1.        ]])
>>> rewards
array([0.8, 0.8, 0.8])
>>> terminations
array([False, False, False])
>>> truncations
array([False, False, False])
>>> infos
{}
>>> envs.close()

为了避免在重置之前必须等待所有子环境终止,实现将在每个情节结束时自动重置子环境(terminated truncated True)。因此,在将观察结果添加到重放缓冲区时,这需要知道每个子环境的观察结果(和信息)是自动重置后的第一个观察结果。我们建议使用一个额外的变量来存储此信息。

向量环境具有额外的属性,供用户理解实现

  • :attr:num_envs - 向量环境中子环境的数量

  • :attr:observation_space - 向量化环境的批量观测空间

  • :attr:single_observation_space - 单个子环境的观察空间

  • :attr:action_space - 向量环境的批量动作空间

  • :attr:single_action_space - 单个子环境的动作空间

方法

VectorEnv.step(actions: ActType) tuple[ObsType, ArrayType, ArrayType, ArrayType, dict[str, Any]][源代码]

为每个并行环境采取行动。

参数:

actions – 具有 :attr:action_space 形状的一批动作。

返回:

一批 (观察值, 奖励, 终止, 截断, 信息)

备注

由于向量环境会自动重置终止和截断的子环境,这将在 terminated or truncated True 后的下一步发生。

示例

>>> import gymnasium as gym
>>> import numpy as np
>>> envs = gym.make_vec("CartPole-v1", num_envs=3, vectorization_mode="sync")
>>> _ = envs.reset(seed=42)
>>> actions = np.array([1, 0, 1], dtype=np.int32)
>>> observations, rewards, terminations, truncations, infos = envs.step(actions)
>>> observations
array([[ 0.02727336,  0.18847767,  0.03625453, -0.26141977],
       [ 0.01431748, -0.24002443, -0.04731862,  0.3110827 ],
       [-0.03822722,  0.1710671 , -0.00848456, -0.2487226 ]],
      dtype=float32)
>>> rewards
array([1., 1., 1.])
>>> terminations
array([False, False, False])
>>> terminations
array([False, False, False])
>>> infos
{}
VectorEnv.reset(*, seed: int | None = None, options: dict[str, Any] | None = None) tuple[ObsType, dict[str, Any]][源代码]

重置所有并行环境并返回一批初始观察值和信息。

参数:
  • seed – 环境重置种子

  • options – 如果返回选项

返回:

一批来自向量化环境的观察和信息。

示例

>>> import gymnasium as gym
>>> envs = gym.make_vec("CartPole-v1", num_envs=3, vectorization_mode="sync")
>>> observations, infos = envs.reset(seed=42)
>>> observations
array([[ 0.0273956 , -0.00611216,  0.03585979,  0.0197368 ],
       [ 0.01522993, -0.04562247, -0.04799704,  0.03392126],
       [-0.03774345, -0.02418869, -0.00942293,  0.0469184 ]],
      dtype=float32)
>>> infos
{}
VectorEnv.render() tuple[RenderFrame, ...] | None[源代码]

返回并行环境中的渲染帧。

返回:

从并行环境中渲染的帧元组

VectorEnv.close(**kwargs: Any)[源代码]

关闭所有并行环境并释放资源。

它还会关闭所有现有的图像查看器,然后调用 :meth:close_extras 并将 :attr:closed 设置为 True

警告

此函数本身不关闭环境,应在 :meth:close_extras 中处理。这对于同步和异步向量化环境都是通用的。

备注

这将在垃圾回收或程序退出时自动调用。

参数:

**kwargs – 传递给 :meth:close_extras 的关键字参数

属性

VectorEnv.num_envs: int

向量环境中的子环境数量。

VectorEnv.action_space: gym.Space

(批量)动作空间。step 的输入动作必须是 action_space 的有效元素。

VectorEnv.observation_space: gym.Space

(批处理的)观察空间。resetstep 返回的观察值是 observation_space 的有效元素。

VectorEnv.single_action_space: gym.Space

子环境的行为空间。

VectorEnv.single_observation_space: gym.Space

子环境的观察空间。

VectorEnv.spec: EnvSpec | None = None

环境的 EnvSpec 通常在 :py:meth:gymnasium.make_vec 期间设置

VectorEnv.metadata: dict[str, Any] = {}

包含渲染模式、渲染帧率等的环境元数据

VectorEnv.render_mode: str | None = None

环境的渲染模式,应遵循与 Env.render_mode 类似的规范。

VectorEnv.closed: bool = False

如果向量环境已经关闭。

附加方法

property VectorEnv.unwrapped

返回基础环境。

property VectorEnv.np_random: Generator

返回环境的内部 :attr:_np_random,如果未设置,将使用随机种子初始化。

返回:

np.random.Generator 的实例

property VectorEnv.np_random_seed: int | None

返回环境的内部 :attr:_np_random_seed,如果未设置,将首先使用随机整数作为种子进行初始化。

如果 :attr:np_random_seed 是直接设置的,而不是通过 :meth:reset 或 :meth:set_np_random_through_seed 设置的,种子将取值 -1。

返回:

int – 当前 np_random 的种子,如果 rng 的种子未知则为 -1

创建向量环境

要创建向量环境,gymnasium 提供了 :func:gymnasium.make_vec 作为与 :func:gymnasium.make 等效的函数。