空间

此模块实现了各种空间。

空间描述了数学集合,并在 Gym 中用于指定有效的动作和观察。每个 Gym 环境都必须具有属性 action_spaceobservation_space。例如,如果您的环境中可以执行三种可能的动作 (0,1,2),并且观察是二维单位立方体中的向量,则环境代码可能包含以下两行:

self.action_space = spaces.Discrete(3)
self.observation_space = spaces.Box(0, 1, shape=(2,))

所有空间都继承自 Space 超类。

class gymnasium.spaces.Space(shape: Sequence[int] | None = None, dtype: type[Any] | dtype[Any] | _SupportsDType[dtype[Any]] | tuple[Any, Any] | list[Any] | _DTypeDict | str | None = None, seed: int | Generator | None = None)[source]

用于定义观察和动作空间的超类。

空间在 Gym 中被关键地用于定义有效动作和观察的格式。它们有多种用途:

  • 它们清楚地定义了如何与环境交互,即指定了动作和观察的预期形式

  • 它们使我们能够处理高度结构化的数据(例如,以 Dict 空间元素的形式),并轻松地将其转换为可用于学习代码的扁平数组

  • 它们提供了一种采样随机元素的方法。这对于探索和调试特别有用。

不同的空间可以通过容器空间(TupleDict)进行分层组合,以构建更具表现力的空间

警告

自定义观察和动作空间可以继承自 Space 类。然而,大多数用例应该由现有空间类(例如 BoxDiscrete 等)和容器类(TupleDict)覆盖。请注意,参数化概率分布(通过 Space.sample() 方法)和批处理函数(在 gym.vector.VectorEnv 中)仅对 Gym 默认提供的空间实例有明确定义。此外,一些强化学习算法的实现可能无法正确处理自定义空间。请谨慎使用自定义空间。

参数:
  • shape (可选[序列[int]]) – 如果空间元素是 numpy 数组,则应指定其形状。

  • dtype (可选[类型 | 字符串]) – 如果空间元素是 numpy 数组,则应指定其数据类型。

  • seed – 可选地,您可以使用此参数为用于从空间采样的 RNG 设置种子

属性

属性 Space.shape: tuple[int, ...] | None

以不可变属性的形式返回空间的形状。

属性 Space.dtype

返回此空间的数据类型。

属性 Space.is_np_flattenable: bool

检查此空间是否可以展平为 gymnasium.spaces.Box

属性 Space.np_random: Generator

延迟为 PRNG 设置种子,因为这很昂贵,并且只有在从该空间采样时才需要。

由于 seed() 不保证为特定种子设置 _np_random。我们在 seed() 之后添加一个检查,以设置新的随机数生成器。

方法

每个空间都实现了以下函数

Space.sample(mask: Any | None = None, probability: Any | None = None) T_cov

从此空间随机采样一个元素。

可以是均匀采样或非均匀采样,具体取决于空间的有界性。

二进制掩码和概率掩码不能同时使用。

参数:
  • mask – 用于随机采样的掩码,预期 dtype=np.int8,有关预期形状,请参阅示例实现。

  • probability – 用于根据给定概率分布进行采样的概率掩码,预期 dtype=np.float64,有关预期形状,请参阅示例实现。

返回:

从空间采样的动作

Space.contains(x: Any) bool

返回布尔值,指示 x 是否为此空间的有效成员,等同于 sample in space

Space.seed(seed: int | None = None) int | list[int] | dict[str, int]

为此空间(如果适用,还为其子空间)的伪随机数生成器 (PRNG) 设置种子。

参数:

seed – 空间的种子值。对于复合空间,此参数会扩展以接受多个值。有关更多详细信息,请参阅空间的文档。

返回:

用于所有 PRNG 的种子值;对于复合空间,这可以是值元组或字典。

Space.to_jsonable(sample_n: Sequence[T_cov]) list[Any]

将此空间的一批样本转换为可 JSON 化的数据类型。

Space.from_jsonable(sample_n: list[Any]) list[T_cov]

将可 JSON 化的数据类型转换为此空间的一批样本。

基本空间

Gymnasium 包含许多基本空间,这些空间被用作构建更复杂空间的积木。

  • Box - 支持连续(和离散)向量或矩阵,用于向量观察、图像等

  • Discrete - 支持单个离散值,并可选地指定值的起始点

  • MultiBinary - 支持单个或矩阵的二进制值,用于按住按钮或智能体是否拥有物体

  • MultiDiscrete - 支持多轴的多个离散值,用于控制器动作

  • Text - 支持字符串,用于传递智能体消息、任务详情等

复合空间

通常,环境空间需要将基本空间连接起来,以实现向量化环境、分离智能体或提高空间的可读性。

  • Dict - 支持键和子空间的字典,用于固定数量的无序空间

  • Tuple - 支持子空间的元组,用于固定数量的多个有序空间

  • Sequence - 支持单个子空间的变量实例数,用于实体空间或选择可变数量的动作

  • Graph - 支持基于图的动作或观察,具有离散或连续的节点和边值

  • OneOf - 支持可选的动作空间,使得一个动作可以是 N 个可能的子空间之一

工具函数

Gymnasium 包含许多有用的工具函数,用于展平(flattening)和非展平(unflattening)空间。这对于将信息传递给神经网络可能很重要。

向量工具函数

在向量化环境时,需要修改观察和动作空间以适应新的批处理空间大小。因此,Gymnasium 提供了许多在使用空间与向量环境时使用的附加函数。