从零定制强化学习环境: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 抓取补全文) - 原文 URL:https://juejin.cn/post/7662949071999729664
- 作者:用户47184440775
- 发布时间:2026-07-17
- extract:
raw/extracts/20260719-195700/juejin.cn/gridworld-ppo.md - 消化日期:2026-07-19
核心观点
- 自定义 RL 环境的主线是「任务定义 → 观测/动作空间 → step 奖励与终止 → 渲染 → 算法训练」:本文以约 200 行代码覆盖 Gymnasium 环境接口全流程,目标是读者能独立设计自己的环境,而不是只会调现成 env。
- 变体 Cliff Walking 更接近真实机器人约束:5×5 网格;悬崖在第 4 行中间三格;起点随机(避开悬崖/目标);目标在最后一行列随机;观测为 Dict 多字段;撞墙惩罚并终止(标准 Cliff Walking 多为固定起终点、一维索引观测、无出界)。
- Dict 观测空间是核心设计亮点:
agent/target归一化坐标、cliff局部地图坐标、boundary_flag(0–4 贴边)按语义拆分,兼容 SB3MultiInputPolicy(各字段独立特征提取器再融合),可扩展雷达/图像等传感器字段。 - 奖励工程 = 基础时间惩罚 + 事件奖励 + 势能塑形:每步 -0.1;到目标 +5.0;坠崖 -5.0;撞墙 -2.5;超时 truncated 再 -1.0;
+0.01*(old_d-new_d)为 Potential-Based Reward Shaping,系数刻意很小以免覆盖任务信号。 - 训练与曲线可解释:
check_env先过;PPO +MultiInputPolicy+normalize_advantage=True;60,000 步后 ep_rew_mean 约 -3 → 4.38(完美最短路径约 8 步时理论约 4.6);loss 在 10k–25k 学规避悬崖时剧烈波动后收敛。 - 自定义环境七条黄金法则:先
check_env;观测归一化;奖励绝对值建议 [-10,10];正确区分 terminated/truncated;用self.np_random;info 写清termination_reason;render 无副作用。
实操内容保留
代码/配置
依赖安装:
pip install gymnasium numpy stable-baselines3 pygame tensorboardDict 观测空间(核心):
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 模板)
操作步骤
- 安装
gymnasium / numpy / stable-baselines3 / pygame / tensorboard。 - 实现
GridWorldEnv(gym.Env):配置 cliff、observation_space(Dict)、action_space。 - 实现
reset(随机合法起点 + 末行随机目标)、step(出界/悬崖/目标/势能/超时)、render(ansi + human)。 check_env(env)通过后用 PPOMultiInputPolicy训练 60k 步,TensorBoard 看ep_rew_mean/ loss。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,与观测值吻合。