Gymnasium的基本用法

目录

1.初始化环境

2.与环境交互

3.动作和观测空间

4.修改环境


Gymnasium是一个为所有单智能体强化学习环境提供API的项目,包括常见环境的实现:cartpole、pendulum、mountain-car、mujoco、atari等。

该API包含四个关键功能:make、reset、steprender,下面的基本用法将介绍这些功能。

1.初始化环境

在Gymnasium中可以通过make函数来初始化环境:

import gymnasium as gym
env = gym.make('CartPole-v1')

Make包含许多附加参数,用于添加包装器、为环境指定关键字等。 如果要查看可以创建的所有环境,可以使用gym .envs.registry.keys(),查看结果如下:

2.与环境交互

下图中的经典“智能体-环境循环”是Gymnasium实现的强化学习的简化表示。

这个循环使用以下代码实现(以车杆环境为例):

import gymnasium as gym
env = gym.make("CartPole-v1", render_mode="human")
observation, info = env.reset(seed=42)
for _ in range(1000):
   action = env.action_space.sample()  # this is where you would insert your policy
   observation, reward, terminated, truncated, info = env.step(action)

   if terminated or truncated:
      observation, info = env.reset()

env.close()

输出动态效果:

代码解释:

首先,使用make建一个带有附加关键字“render_mode”的环境,该关键字指定环境应该如何可视化。有关不同渲染模式的默认含义的详细信息,请参阅render

在初始化环境之后,我们重置(reset)环境以获得对环境的第一次观察。要使用特定的随机种子或选项初始化环境,请使用带有reset的seed或options参数。

接下来,智能体在环境中执行一个动作,会导致环境发生变化。因此,智能体从更新的环境中获得新的观察结果,并获得采取行动的奖励。一个这样的动作观察交换被称为时间步长(timestep)。

但是,经过一些时间步长后,环境可能结束,这称为终端状态。在gymnasium中,如果环境已经终止,这一步通过step返回。类似地,我们也可能希望环境在固定数量的时间步长后结束,在这种情况下,环境发出截断的信号。如果terminate或truncated为true,那么接下来应该调用reset来重新启动环境。

3.动作和观测空间

每一个环境通过使用env.action_spaceenv.observation_space属性指定有效动作和观测空间的形式,这有助于了解环境的预期输入和输出,因为所有有效的操作和观察都应该包含在各自的空间中。

4.修改环境

包装器是一种修改现有环境而无需直接修改底层代码的方便方法。使用包装器可以避免大量引用代码,并使环境更加模块化。包装器也可以被链接以组合它们的效果。大多数通过gymnasium.make建立的环境已经通过默认使用TimeLimit,OrderEnforcing和PassiveEnvChecker方法实现了包装。为了去包装一个环境,首先必须初始化环境,然后可以将这个环境连同参数传递给包装器的构造函数:

import gymnasium as gym
from gymnasium.wrappers import FlattenObservation
env = gym.make("CarRacing-v2")
env.observation_space.shape
###(96, 96, 3)
wrapped_env = FlattenObservation(env)
wrapped_env.observation_space.shape
###(27648,)

Gymnasium已经提供了许多常用的封装器,例如:

如果有一个已包装的环境,并且希望在所有包装器层之下获得未包装的环境(以便可以手动调用函数或更改环境的某些底层方面),则可以使用.unwrapped属性。如果环境已经是基础环境,.unwrapped属性将只返回其本身。

wrapped_env
<FlattenObservation<TimeLimit<OrderEnforcing<PassiveEnvChecker<CarRacing<CarRacing-v2>>>>>>
wrapped_env.unwrapped
<gymnasium.envs.box2d.car_racing.CarRacing object at 0x7f04efcb8850>

### Gymnasium Wrappers 使用介绍 Wrappers 是 Gymnasium 库中用于修改环境行为的强大工具。通过包裹原始环境,可以轻松添加新特性或改变现有特性的表现形式而不必更改环境本身的源码[^1]。 #### 基本概念 Wrapper 类继承自 `gym.Wrapper` 或者更具体的子类如 `gym.ObservationWrapper`, `gym.ActionWrapper` 和 `gym.RewardWrapper`。这些特定类型的 Wrapper 可以分别用来处理观测空间、动作空间以及奖励信号的转换逻辑[^2]。 #### 创建自定义 Wrapper 的方法 为了创建一个新的 wrapper, 需要定义一个继承于上述提到的一个或多个基类的新 Python 类,并实现必要的抽象方法: ```python import gym from gym import spaces from gym.wrappers import ObservationWrapper class CustomObservationWrapper(ObservationWrapper): def __init__(self, env): super().__init__(env) def observation(self, obs): # 修改观察数据的方式 modified_obs = ... # 对obs做一些变换操作 return modified_obs ``` 此代码片段展示了如何构建一个简单的自定义观测wrapper来调整来自原生环境的数据流[^3]。 #### 实际应用案例 下面是一个具体的应用实例——将图像型态的观测值转化为灰度版本: ```python import cv2 import numpy as np from gym.spaces import Box class GrayscaleWrapper(gym.ObservationWrapper): def __init__(self, env): """初始化并设置新的观测空间""" super().__init__(env) old_space = self.observation_space new_shape = (old_space.shape[0], old_space.shape[1]) low = 0 high = 255 dtype = np.uint8 self.observation_space = Box(low=low, high=high, shape=new_shape, dtype=dtype) def observation(self, frame): """执行颜色到灰色级别的转换""" gray_frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) return gray_frame ``` 这段脚本实现了从彩色图片至单通道灰阶图的变化过程,在某些情况下有助于简化模型训练难度或是提高效率[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抱抱宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值