旨在通过编写程序来学习强化学习的基本语句

题目:

编写一个 Python 程序,使用 gym 中的 CartPole-v1 环境,让智能体在每一步随机选择一个动作(左右推小车),并统计一次 episode 中坚持的步数。

要求:

1、运行 10 个 episode。

2、记录每个 episode 的总步数,并输出平均步数。

📝 题目思路

1、导入环境

使用 gym.make("CartPole-v1") 创建环境。

import gymnasium as gym 
import numpy as np 

(1) gym = 强化学习环境平台

当前用的 gym 已经 不再维护,并且和最新的 NumPy(2.0+)可能不兼容。

官方推荐换成 Gymnasium(几乎完全兼容 gym,接口稍微不同)

(2)numpy = 强大的数组 + 快速的数学运算工具 np = numpy,只是一个简写

env = gym.make("CartPole-v1",render_mode='None')

(3) gym.make() 是 创建环境的函数

gym 里有很多内置环境,比如:
"CartPole-v1" → 推小车
"MountainCar-v0" → 小车爬山
"FrozenLake-v1" → 冰湖迷宫
"Pong-v0" → Atari 乒乓

(4) render_mode=None这是环境的 渲染模式(可视化方式)

None:不显示画面(最快,常用于训练)。

"human":实时显示窗口,能看到小车和杆子的动画。

"rgb_array":返回一帧图像(用于视频保存)。

"ansi":返回文本(主要是棋盘类环境)。

在训练时一般 None,在测试/展示时用 "human"。

(5) env = ...
env 是你创建的 环境对象,里面包含了游戏规则。
env.reset() → 开始新的一局
env.step(action) → 执行动作
env.close() → 关闭环境

num_episodes = 10
steps_per_epoch = []

(6)episode 就是一局游戏/一次完整的实验过程。是当前循环索引,从 0 开始。

(7)steps_per_episode = [] 这是一个 空列表,用来存储每一局的步数

for episode in range(num_episodes):

(8)range(num_episodes) 生成整数序列 0,1,...,num_episodes-1

for episode in range(num_episodes): 重复进行 num_episodes 次完整的交互(每次一局)。

2、初始化 episode
    obs,_ = env.reset()

(9)obs, _ = env.reset() # 重置环境,开始新一局

含义:调用环境的 reset(),把环境恢复到初始状态,开始一局新的 episode。

obs(observation):对于 CartPole-v1,obs 是一个长度为 4 的 numpy 数组(ndarray),含义依次通常是:[cart_position, cart_velocity, pole_angle, pole_angular_velocity](四个浮点数)。

_:Python 习惯写法,表示“我拿到但不使用的值”。

    done = False
    steps = 0
    while not done:
        action = env.action_space.sample()
        obs, reward, done, truncated, info = env.step(action)

(10) steps = 0 # 当前局步数计数,含义:本局(episode)内的步数计数器,初始为 0。

(11) done = False

含义:初始化 done 标志为 False。

在循环开始前先设为 False,进入 while not done: 循环。只要 done 为 False 就继续执行循环体。done 变为 True 时(环境报告终止),跳出循环,本局结束。

3、随机选择动作

(12)action = env.action_space.sample()

从环境的动作空间里随机采样一个动作(随机策略)

4、执行动作

(13)obs, reward, done, truncated, info = env.step(action)

含义:将动作发送到环境,环境推进一步,返回五个值。

truncated:布尔值,表示是否因为截断条件而终止(例如达到最大步数限制)。这是新版 Gym 把“达到时间限制”与“真实环境结束”区分开来的字段。

5、统计步数,每次步数 +1,直到 done=True。循环多次 episode,重复 10 次,最后输出每次的步数和平均步数。
        steps += 1
    steps_per_epoch.append(steps)
    print(f"Episode {episode + 1}: lasted {steps} steps")

(14)steps_per_episode.append(steps) # 保存这一局的步数

含义:将本局的步数(整数)加入到列表 steps_per_episode 中,便于后续统计(比如计算平均步数、绘图等)。

运行结果:

Episode 1: lasted 32 steps
Episode 2: lasted 49 steps
Episode 3: lasted 13 steps
Episode 4: lasted 13 steps
Episode 5: lasted 16 steps
Episode 6: lasted 14 steps
Episode 7: lasted 16 steps
Episode 8: lasted 16 steps
Episode 9: lasted 20 steps
Episode 10: lasted 25 steps

将None改为human时,出现可视化视频

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐