矢量化¶
Gymnasium.vector.VectorEnv¶
- class gymnasium.vector.VectorEnv[源代码]¶
用于向量化环境的基类,以并行运行同一环境的多个独立副本。
向量环境可以通过同时采样多个子环境来提供每秒步骤数的线性加速。Gymnasium 包含两个通用的向量环境::class:
AsyncVectorEnv和 :class:SyncVectorEnv,以及几个自定义的向量环境实现。对于 :func:reset和 :func:step批处理,observations、rewards、terminations、truncations和info为每个子环境,请参见下面的示例。对于rewards、terminations和truncations,数据被打包成形状为(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.num_envs: int¶
向量环境中的子环境数量。
- VectorEnv.action_space: gym.Space¶
(批量)动作空间。
step的输入动作必须是action_space的有效元素。
- VectorEnv.observation_space: gym.Space¶
(批处理的)观察空间。
reset和step返回的观察值是observation_space的有效元素。
- VectorEnv.single_action_space: gym.Space¶
子环境的行为空间。
- VectorEnv.single_observation_space: gym.Space¶
子环境的观察空间。
- 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 等效的函数。