强化学习入门:环境搭建与首个案例实战

从零开始:强化学习新手入门与环境搭建实战指南

强化学习(Reinforcement Learning, RL)不同于监督学习,它不依赖静态数据集,而是让智能体(Agent)通过与环境(Environment)的持续交互,利用“试错”机制最大化累积奖励来学习策略 。本文将带你完成从理论认知到本地环境搭建,再到运行第一个“走迷宫”案例的全过程。

以下内容仅为本人早期的学习过程和ai创作使用,若有问题请及时指出。

一、核心概念:极简认知框架

在动手写代码前,需明确强化学习的五大核心要素,这是理解后续代码逻辑的基础:

核心要素英文标识通俗解释类比案例(走迷宫)
智能体Agent学习的主体,做出决策的角色迷宫中的小方块
环境Environment智能体所处的外部世界5x5 的迷宫地图(含墙壁、终点)
状态State当前时刻环境的快照小方块当前的坐标位置 (x, y)
动作Action智能体可以执行的操作上、下、左、右移动
奖励Reward执行动作后获得的即时反馈到达终点 +10,撞墙 -5,每步 -0.1

注:强化学习的目标是找到一个策略(Policy),使得智能体在长期互动中获得的累积奖励最大,这与有监督学习中最小化预测误差的逻辑截然不同 。

二、环境搭建:本地开发环境配置

对于新手而言,版本兼容性是最大的拦路虎。推荐使用 Anaconda 管理虚拟环境,并固定关键库的版本以避免报错。

1. 创建虚拟环境

打开终端(Terminal)或命令提示符(CMD),执行以下命令创建名为 rl_env 的独立环境,指定 Python 版本为 3.8(兼容性最佳):

# 创建名为 rl_env 的虚拟环境,指定 Python 3.8
conda create -n rl_env python=3.8 -y

# 激活环境
conda activate rl_env

2. 安装核心依赖库

我们需要安装 gym(提供标准测试环境)、numpy(数值计算)和 matplotlib(可视化绘图)。为防止网络问题导致安装失败,建议指定国内镜像源,并锁定 gym 版本为 0.26.2 以规避高版本的接口变动问题 :

# 使用清华源安装指定版本的 gym 及基础库
pip install gym==0.26.2 numpy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

若需进阶物理模拟(如机器人控制),可后续安装 Mujoco,但入门阶段上述库已足够 。

三、实战演练:Q-Learning 走迷宫案例

我们将实现一个经典的表格型 Q-Learning 算法,让智能体在一个 5x5 的迷宫中学习从起点走到终点。

1. 案例逻辑设计

  • 奖励机制:到达终点奖励 +10,撞墙惩罚 -5,每走一步消耗 -0.1(鼓励最短路径)。
  • 算法核心:维护一个 Q 表(Q-Table),记录在每种状态下采取每个动作的预期收益,通过不断更新 Q 值来优化策略。

2. 完整代码实现

新建文件 maze_ql.py,将以下代码复制进去。该代码包含了环境定义、Q-Learning 训练循环及结果可视化。

import numpy as np
import gym
import matplotlib.pyplot as plt

# --- 1. 自定义简单的迷宫环境 (基于 Gym 接口简化版) ---
class MazeEnv:
    def __init__(self, size=5):
        self.size = size
        self.start_pos = (0, 0)
        self.end_pos = (4, 4)
        self.walls = [(1, 1), (1, 2), (2, 2), (3, 1)] # 障碍物坐标
        self.reset()
        self.action_space = [0, 1, 2, 3] # 0:上,1:下,2:左,3:右

    def reset(self):
        self.agent_pos = list(self.start_pos)
        return tuple(self.agent_pos)

    def step(self, action):
        # 根据动作更新位置
        if action == 0: self.agent_pos[0] -= 1 # 上
        elif action == 1: self.agent_pos[0] += 1 # 下
        elif action == 2: self.agent_pos[1] -= 1 # 左
        elif action == 3: self.agent_pos[1] += 1 # 右
        
        # 边界检查
        self.agent_pos[0] = max(0, min(self.size-1, self.agent_pos[0]))
        self.agent_pos[1] = max(0, min(self.size-1, self.agent_pos[1]))
        
        pos_tuple = tuple(self.agent_pos)
        
        # 奖励逻辑
        if pos_tuple in self.walls:
            reward = -5
            done = False
            # 撞墙后退回原位(简化处理)
            if action == 0: self.agent_pos[0] += 1
            elif action == 1: self.agent_pos[0] -= 1
            elif action == 2: self.agent_pos[1] += 1
            elif action == 3: self.agent_pos[1] -= 1
        elif pos_tuple == self.end_pos:
            reward = 10
            done = True
        else:
            reward = -0.1 # 每一步的惩罚,鼓励快速到达
            done = False
            
        return tuple(self.agent_pos), reward, done

# --- 2. Q-Learning 算法核心 ---
class QLearningAgent:
    def __init__(self, actions, learning_rate=0.1, discount_factor=0.9, epsilon=0.9):
        self.q_table = {}        self.actions = actions
        self.lr = learning_rate
        self.gamma = discount_factor
        self.epsilon = epsilon

    def get_q_value(self, state, action):
        if state not in self.q_table:
            self.q_table[state] = np.zeros(len(self.actions))
        return self.q_table[state][action]

    def choose_action(self, state):
        # epsilon-greedy 策略:大部分时间选最优,偶尔随机探索
        if np.random.uniform() < self.epsilon:
            if state not in self.q_table:
                self.q_table[state] = np.zeros(len(self.actions))
            # 选择 Q 值最大的动作
            return int(np.argmax(self.q_table[state]))
        else:
            return np.random.choice(self.actions)

    def learn(self, state, action, reward, next_state, done):
        if state not in self.q_table:
            self.q_table[state] = np.zeros(len(self.actions))
        if next_state not in self.q_table:
            self.q_table[next_state] = np.zeros(len(self.actions))
            
        q_predict = self.get_q_value(state, action)
        if done:
            q_target = reward
        else:
            q_target = reward + self.gamma * np.max(self.q_table[next_state])
        
        # 更新公式:Q(s,a) = Q(s,a) + lr * (target - predict)
        self.q_table[state][action] += self.lr * (q_target - q_predict)

# --- 3. 训练与可视化主流程 ---
def train_and_plot(): env = MazeEnv()
    agent = QLearningAgent(actions=env.action_space)
    
    episodes = 500  # 训练回合数
    rewards_per_episode = []

    print("开始训练...")
    for ep in range(episodes): state = env.reset()
        total_reward = 0
        done = False
        
        while not done:
            action = agent.choose_action(state)
            next_state, reward, done = env.step(action)
            agent.learn(state, action, reward, next_state, done)
            
            state = next_state
            total_reward += reward
        
        rewards_per_episode.append(total_reward) if (ep + 1) % 100 == 0:
            print(f"回合 {ep+1}, 平均奖励:{np.mean(rewards_per_episode[-100:]):.2f}")

 # 绘制学习曲线
    plt.figure(figsize=(10, 6))
    plt.plot(rewards_per_episode)
    plt.title('Q-Learning Training Process (Maze)')
    plt.xlabel('Episode')
    plt.ylabel('Total Reward')
    plt.grid(True)
    plt.show()
    print("训练完成,窗口显示学习曲线。")

if __name__ == "__main__":
    train_and_plot()

3. 运行与结果解读

在终端运行 python maze_ql.py。你将看到一张折线图:

  • 初期:奖励值波动大且多为负数(智能体在随机乱撞)。
  • 后期:曲线逐渐上升并稳定在较高正值(智能体学会了避开墙壁并直达终点)。

四、进阶路线与资源推荐

掌握基础表格型方法后,可按以下路径深入:1. 深度学习结合 (Deep RL):当状态空间过大(如图像输入)无法使用 Q 表时,需引入神经网络。推荐从 DQN (Deep Q-Network) 开始,尝试玩 Atari 游戏 。
2. 主流算法:逐步学习 PPO (近端策略优化)、SAC 等更强大的策略梯度算法,这些是目前工业界的主流 。
3. 工具升级
* Stable Baselines3:封装好的高质量 RL 算法库,适合快速实验 。
* Google Colab:若本地显卡性能不足,可利用其免费 GPU 资源运行深度强化学习项目 。

推荐学习资料

  • 📘 经典教材:《Reinforcement Learning: An Introduction》(Sutton & Barto)
  • 🎓 视频课程:李宏毅教授强化学习公开课(中文讲解深入浅出)、吴恩达 Coursera 课程 。
  • 🌐 实践指南:OpenAI Spinning Up (官方最佳实践文档) 。

引用来源
本文内容综合参考了 CSDN 关于《动手学强化学习》的实战指南 、华为云关于 Mujoco 及环境配置的详细教程 、博客园提供的走迷宫代码实例 、Bilibili 关于强化学习基础定义的解析 以及 CSDN 关于入门路径与资源推荐的综述文章 。


参考来源

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值