从零定制强化学习环境:GridWorld 悬崖行走 + PPO 训练全解析

以 5×5 GridWorld 悬崖行走变体为例,完整拆解 Gymnasium 自定义环境(Dict 观测、势能奖励、terminated/truncated)与 Stable Baselines3 PPO + MultiInputPolicy 训练链路,60k 步 ep_rew_mean 约从 -3 升至 4.38。

基本信息

  • 来源类型:文章(掘金)
  • 原文位置raw/articles/2026-07-19-185636-tg-dbe7cb.md(Telegram stub msg 2109 → baoyu 抓取补全文)
  • 原文 URLhttps://juejin.cn/post/7662949071999729664
  • 作者:用户47184440775
  • 发布时间:2026-07-17
  • extractraw/extracts/20260719-195700/juejin.cn/gridworld-ppo.md
  • 消化日期:2026-07-19

核心观点

  1. 自定义 RL 环境的主线是「任务定义 → 观测/动作空间 → step 奖励与终止 → 渲染 → 算法训练」:本文以约 200 行代码覆盖 Gymnasium 环境接口全流程,目标是读者能独立设计自己的环境,而不是只会调现成 env。
  2. 变体 Cliff Walking 更接近真实机器人约束:5×5 网格;悬崖在第 4 行中间三格;起点随机(避开悬崖/目标);目标在最后一行列随机;观测为 Dict 多字段;撞墙惩罚并终止(标准 Cliff Walking 多为固定起终点、一维索引观测、无出界)。
  3. Dict 观测空间是核心设计亮点agent/target 归一化坐标、cliff 局部地图坐标、boundary_flag(0–4 贴边)按语义拆分,兼容 SB3 MultiInputPolicy(各字段独立特征提取器再融合),可扩展雷达/图像等传感器字段。
  4. 奖励工程 = 基础时间惩罚 + 事件奖励 + 势能塑形:每步 -0.1;到目标 +5.0;坠崖 -5.0;撞墙 -2.5;超时 truncated 再 -1.0;+0.01*(old_d-new_d) 为 Potential-Based Reward Shaping,系数刻意很小以免覆盖任务信号。
  5. 训练与曲线可解释check_env 先过;PPO + MultiInputPolicy + normalize_advantage=True;60,000 步后 ep_rew_mean 约 -3 → 4.38(完美最短路径约 8 步时理论约 4.6);loss 在 10k–25k 学规避悬崖时剧烈波动后收敛。
  6. 自定义环境七条黄金法则:先 check_env;观测归一化;奖励绝对值建议 [-10,10];正确区分 terminated/truncated;用 self.np_random;info 写清 termination_reason;render 无副作用。

实操内容保留

代码/配置

依赖安装

pip install gymnasium numpy stable-baselines3 pygame tensorboard

Dict 观测空间(核心)

self.observation_space = spaces.Dict({
    "agent":  spaces.Box(0, 1, shape=(2,), dtype=np.float32),
    "target": spaces.Box(0, 1, shape=(2,), dtype=np.float32),
    "cliff":  spaces.Box(0, 1, shape=(len(self.cliff), 2), dtype=np.float32),
    "boundary_flag": spaces.Discrete(5)
})

动作映射(上下左右)

self.action_space = spaces.Discrete(4)
self._action_to_dict = {
    0: np.array([0, -1]),   # 上
    1: np.array([0, +1]),   # 下
    2: np.array([-1, 0]),   # 左
    3: np.array([+1, 0])    # 右
}

奖励与终止片段(step 核心)

reward = -0.1
# 出界:reward -= 2.5, terminated=True, clip 回边界
# 到目标:reward += 5.0, terminated=True, reason="goal"
# 悬崖:reward -= 5.0, terminated=True, reason="cliff"
# 否则:reward += 0.01 * (old_distance - new_distance)  # 势能塑形
# 超时:truncated=True, reward -= 1.0, reason="timeout"

PPO 训练

from stable_baselines3 import PPO
from stable_baselines3.common.env_checker import check_env
 
env = GridWorldEnv(size=5, render_mode="ansi")
check_env(env)
 
model = PPO(
    "MultiInputPolicy",
    env,
    normalize_advantage=True,
    verbose=1,
    tensorboard_log="./tb/gridworld",
)
model.learn(total_timesteps=60000)
model.save("ppo_gridworld")

可视化验证循环(human 渲染 + deterministic predict):

test_env = GridWorldEnv(size=5, render_mode="human")
model = PPO.load("ppo_gridworld")
for ep in range(100):
    obs, _ = test_env.reset()
    done = False
    while not done:
        action, _ = model.predict(obs, deterministic=True)
        obs, reward, terminated, truncated, info = test_env.step(action)
        done = terminated or truncated
        test_env.render()

完整 GridWorldEnv 类(含 reset/step/render/close/_obs/_render_human)见原文第九节,约 200 行,raw 已保存。

Prompt 模板

(本文无 Prompt 模板)

操作步骤

  1. 安装 gymnasium / numpy / stable-baselines3 / pygame / tensorboard
  2. 实现 GridWorldEnv(gym.Env):配置 cliff、observation_space(Dict)、action_space
  3. 实现 reset(随机合法起点 + 末行随机目标)、step(出界/悬崖/目标/势能/超时)、render(ansi + human)。
  4. check_env(env) 通过后用 PPO MultiInputPolicy 训练 60k 步,TensorBoard 看 ep_rew_mean / loss。
  5. render_mode="human" 加载模型跑 100 episode 观察绕崖到目标轨迹。

关键概念

  • Gymnasium — OpenAI Gym 后继环境标准接口
  • Stable Baselines3 — 含 PPO 与 MultiInputPolicy 的 RL 算法库
  • PPO — 本任务使用的策略优化算法
  • 势能奖励塑形 — Potential-Based Reward Shaping,稠密距离信号
  • GridWorld悬崖行走 — 本文 5×5 变体任务与环境实现
  • Dict 观测空间 — 按语义拆分异构观测(未单独建实体,见 Gymnasium
  • MultiInputPolicy — SB3 对 Dict 观测的策略网络(见 Stable Baselines3

与其他素材的关联

  • 与知识库中大量 Agent/Skill/Vibe Coding 素材形成另一条技术轴:本文是经典强化学习环境工程,而非 LLM Agent 编程;可对照「奖励/终止/观测设计」与「Agent 目标/停止条件/上下文设计」的同构隐喻。
  • AI编程开发 中「可验证、先检查再训练、信息写清」等工程纪律可交叉引用,但领域不同(RL env vs coding agent)。

原文精彩摘录

这是本文环境最值得学习的部分。传统做法是把所有信息展平成一个一维向量,但这里采用了 Dict 观测空间,将异构信息 按语义拆分……Stable Baselines3 的 MultiInputPolicy 可自动处理 Dict 观测,内部会为每个字段创建独立的特征提取器。

势能奖励(Potential-Based Reward Shaping)+0.01 * (old_distance - new_distance) 是一种经典的奖励塑形技术。它在不改变最优策略的前提下,为每一步提供即时反馈。0.01 的系数很小,确保塑形奖励不会覆盖任务本身的奖励信号。

一个完美回合的奖励构成:最短路径约 8 步 × (-0.1) + 距离奖励约 +0.4 + 成功奖励 +5.0 ≈ 4.6,与观测值吻合。

相关页面