gymnasium中space用法
`gymnasium` 是一个用于开发和比较强化学习算法的开源库,它是 `gym` 的一个分支和改进版本。`spaces` 是 `gymnasium` 中用于定义环境状态和动作空间的模块。以下是 `spaces` 模块中一些常用类及其用法的介绍:
1. `Discrete`
`Discrete` 类用于表示离散空间,即空间中的元素是有限的、可数的。
from gymnasium import spaces# 创建一个离散空间,包含 5 个可能的动作
action_space = spaces.Discrete(5)# 检查某个动作是否在空间内
print(action_space.contains(3)) # True
print(action_space.contains(5)) # False# 采样一个动作
print(action_space.sample()) # 输出 0 到 4 之间的随机整数2. `Box`
`Box` 类用于表示连续空间,即空间中的元素是连续的。`Box` 空间通常用于表示多维的连续变量。
from gymnasium import spaces
import numpy as np# 创建一个二维的连续空间,每个维度的范围是 [0, 1]
observation_space = spaces.Box(low=0, high=1, shape=(2,), dtype=np.float32)# 检查某个状态是否在空间内
print(observation_space.contains(np.array([0.5, 0.5]))) # True
print(observation_space.contains(np.array([1.5, 0.5]))) # False# 采样一个状态
print(observation_space.sample()) # 输出一个二维数组,每个元素在 [0, 1] 之间3. `MultiDiscrete`
`MultiDiscrete` 类用于表示多维的离散空间,每个维度可以有不同的取值范围。
from gymnasium import spaces# 创建一个两维的离散空间,第一维有 3 个可能的值,第二维有 4 个可能的值
action_space = spaces.MultiDiscrete([3, 4])# 检查某个动作是否在空间内
print(action_space.contains([2, 3])) # True
print(action_space.contains([3, 3])) # False# 采样一个动作
print(action_space.sample()) # 输出一个数组,第一个元素在 [0, 2] 之间,第二个元素在 [0, 3] 之间4. `MultiBinary`
`MultiBinary` 类用于表示多维的二进制空间,每个维度的值只能是 0 或 1。
from gymnasium import spaces# 创建一个三维度的二进制空间
action_space = spaces.MultiBinary(3)# 检查某个动作是否在空间内
print(action_space.contains([0, 1, 1])) # True
print(action_space.contains([0, 1, 2])) # False# 采样一个动作
print(action_space.sample()) # 输出一个长度为 3 的数组,每个元素是 0 或 15. `Tuple`
`Tuple` 类用于表示由多个空间组成的元组空间。每个元素可以是不同类型的 `Space`。
from gymnasium import spaces# 创建一个元组空间,包含一个离散空间和一个连续空间
action_space = spaces.Tuple((spaces.Discrete(2), spaces.Box(low=0, high=1, shape=(2,), dtype=np.float32)))# 检查某个动作是否在空间内
print(action_space.contains((1, np.array([0.5, 0.5])))) # True
print(action_space.contains((2, np.array([0.5, 0.5])))) # False# 采样一个动作
print(action_space.sample()) # 输出一个元组,第一个元素是 0 或 1,第二个元素是一个二维数组6. `Dict`
`Dict` 类用于表示由多个空间组成的字典空间。每个键对应一个 `Space`。
from gymnasium import spaces# 创建一个字典空间,包含一个离散空间和一个连续空间
action_space = spaces.Dict({"discrete_action": spaces.Discrete(2),"continuous_action": spaces.Box(low=0, high=1, shape=(2,), dtype=np.float32)
})# 检查某个动作是否在空间内
print(action_space.contains({"discrete_action": 1, "continuous_action": np.array([0.5, 0.5])})) # True
print(action_space.contains({"discrete_action": 2, "continuous_action": np.array([0.5, 0.5])})) # False# 采样一个动作
print(action_space.sample()) # 输出一个字典,包含一个离散动作和一个连续动作