RL-Foundation-Learning
一句话说明白
通过gymnasium库搭建场景,然后智能体不断的选择,最后结束游戏
课前思考
你有没有想过,小孩子是怎么学会走路的?小狗又是怎么听懂“坐下”“握手”的?
答案:是靠一次次尝试,摔倒了知道疼(哎哟!),走稳了被夸奖(真棒!),慢慢就学会了。
猜猜看?AI也是这么学的!
这种“试错+反馈”的学习方式,就是我们要聊的——强化学习。Screenshot 2026-05-07 125110.png
开始讲课
今天学习的内容包括以下:
1.强化学习核心概念
2.gymnasium标准库的使用
3.随机智能体完整实现
1.强化学习核心基础概念
五元组(s,a,r,s',done)
s=当前状态【小人现在所在的位置】
a(action)=执行动作【下一步向任何方向移动的过程】
r(reward)=即时奖励【如果到达终点,积分+1;其余所有情况均为r=0】
s'(s_next)=下一状态【小人移动后的位置】
done = 回合结束【这一次游戏结束了】
核心基础术语
- 状态空间:智能体所有可能处于的状态集合,FrozenLake中是4✖️4网格对应的16个离散状态【湖面上有多少个的小位置】
- 动作空间:智能体所有可执行的动作集合,frozenLake中是上下左右4个离散动作【做出动作的所有选择数量】
- 回合(episode):从环境重置(起点)到回合结束(掉进陷阱/到达终点)的完整游戏流程【一次开始到结束的过程】
- 智能体(agent):执行动作、和环境交互的主体,你已经实现了最基础的随机智能体【执行动作的主体】
2.Gymnasium库核心API
| 函数 | 作用 | |
|---|---|---|
| import gymnasium as gym | 导入gymnasium库,主要用于开发和比较强化学习算法,可以创造自定义环境 | —— |
| make() | 用于创造自定义环境 | ❌ 错误理解:“用于创造自定义环境” ✅ 正确:主要用于创建官方预设环境,自定义需通过 desc参数实现 |
| render_mode="human" | 开启可视化窗口 | -render_mode不是函数它是 gym.make()函数的一个参数,用于预先声明渲染行为。例如render_mode="human"表示开启可视化窗口,而render_mode=None则不渲染7。 |
| reset() | 重置状态,s是初始状态,_是额外信息,注意:reset不是一个独立的函数,需要结合环境 | ❌ 语法错误:写作reset()或认为是独立函数✅ 正确:必须通过环境对象调用 env.reset(),且新版返回两个值 |
| while/for | while常用于不确定循环次数;for用于已知循环次数 | |
| simple() | 随机采样 | ❌ 拼写错误:写作simple()✅ 正确:应为 sample(),意为“采样” |
| truncation,info | truncation是终止(时间到或失败);info是额外信息 | 概念混淆:将返回值简写为(s', r, done, info)✅ 正确: done并非直接返回,需由done = terminated or truncated合成 |
| close() | 关闭环境 | 关闭环境,释放渲染资源。应在所有交互结束后调用,养成良好的工程习惯 |
随机智能体(Random Agent)完整工程实现(闭环落地)
智能体与环境交互的全流程逻辑
创造环境(搭建一个冰湖场景)——>开始游戏(回到初始位置)——>循环试探(不断的移动尝试去获得奖励)——>结束游戏
is_slippery=False:降低游戏难度,不会在冰面上出现选择左边却依然由于惯性的原因向前移动。
在做出行动之后,初始状态会调整为当前,s=s_next,同时移动过程中收集自身的状态
# 1. 导入库 import gymnasium as gym # 2. 创建环境:使用FrozenLake-v1,关闭滑动特性以简化理解,并开启可视化窗口 env = gym.make("FrozenLake-v1", is_slippery=False, render_mode="human") # 3. 初始化并重置环境 state, info = env.reset(seed=42) # 设置seed确保实验可复现 done = False # 初始化回合结束标志 # 4. 主循环:持续交互直到回合结束 while not done: # 随机选择一个动作(0:左, 1:下, 2:右, 3:上) action = env.action_space.sample() # 执行动作,获取环境反馈 next_state, reward, terminated, truncated, info = env.step(action) # 更新回合状态 state = next_state done = terminated or truncated # 综合判断回合是否结束 # 打印当前步信息,便于观察和调试 print(f"状态(s): {state:2d} | 动作(a): {action} | 奖励(r): {reward} | " f"下一状态(s'): {next_state:2d} | 结束(done): {done}") # 5. 资源释放 env.close()课程总结:
学习这一节知识点,我们了解一个简单的智能体是如何行动的,包括它活动的概念描述,还有需要学习的代码与知识库,最后是实现的逻辑。这些都是核心基础。我们可以想象一下,但这个智能体能够识别陷阱,找出最优的选择时候。他可以胜任更多生活中的任务。甚至是我们的伙伴。
课后思考:
1.为什么要用离散表格做Q-table?
2.为什么FrozenLake不能用DQN直接上。
[1]
后续进阶方向建议:
- 实现Q-learning算法
在当前随机智能体的基础上,引入Q-table存储状态-动作价值,通过贝尔曼方程迭代更新,让智能体从“无脑试探”进化为“有记忆、有策略”的学习型代理。 - 探索is_slippery=True的真实挑战
恢复环境的动作不确定性,观察滑移概率对策略收敛的影响,深入理解探索(exploration)与利用(exploitation)的权衡。 - 对比DQN的适用场景
思考为何在16×4的小规模离散空间中,Q-table是更优解;而DQN更适合处理高维连续状态(如图像输入),避免“杀鸡用牛刀”9。
本节内容构成了强化学习从理论到实践的最小可行闭环,为你后续深入策略梯度、深度Q网络等高级主题奠定了坚实基础。↩︎
- 实现Q-learning算法