成为新会员获取本项目完整教程资料

加入会员群

与依赖标注数据的监督学习不同,RL智能体通过执行动作并接收环境反馈(奖励或惩罚)来学习,这种学习范式更接近人类和动物的自然学习过程。

图:强化学习核心概念示意

RL的核心思想围绕一个闭环交互展开:智能体观察环境的当前状态,根据其策略选择一个动作执行,环境随之转换到一个新的状态并返回一个即时的奖励。智能体的目标是学习一个最优策略,使得其在长期交互过程中获得的累积奖励总和最大。本文将通过一个具体的“迷宫寻路”案例,从零开始构建一个强化学习智能体,并深入讲解Q-Learning算法及其扩展——Deep Q-Learning。

本文内容改编自过往客户咨询项目的技术沉淀并且已通过实际业务校验,该项目完整代码与数据已分享至交流社群。阅读原文进群获取完整代码数据及更多最新AI见解、行业洞察,可与900+行业人士交流成长;还提供人工答疑,拆解核心原理、代码逻辑与业务适配思路;遇代码运行问题,更能享24小时调试支持。

研究流程脉络图
│
├─ 问题定义 → 智能体如何在迷宫中通过试错学习找到终点?
├─ 环境建模 → 定义状态(位置)、动作(上下左右)、奖励(撞墙-10,终点+50,每步-1)
├─ 算法选择 → Q-Learning (离线策略、时序差分)
├─ 代码实现 → Python + NumPy,ε-贪婪策略,Q表更新
├─ 结果分析 → 最优路径可视化、奖励曲线收敛性
└─ 优化扩展 → 超参数调优、Deep Q-Learning应对高维状态

本项目完整教程资料

下载教程资料(17页)

本研究自建一个10×10网格迷宫作为环境。迷宫由NumPy数组表示(0为通路,1为墙壁)。起始点为(0,0),目标点为(9,9)。状态空间共100个离散状态,动作空间包含上下左右四个动作。奖励函数设计如下:撞墙-10,到达终点+50,普通步数-1(鼓励最短路径)。

3.1 Q-Learning算法原理

Q-Learning是一种离线策略的时序差分学习方法,通过维护Q表来学习最优动作价值函数。核心更新公式(Bellman方程简化形式):
Q(s,a) ← Q(s,a) + α [ r + γ * max_a' Q(s', a') - Q(s,a) ]
其中α为学习率,γ为折扣因子。

3.2 环境与参数初始化

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

# 迷宫地图 (0=通路, 1=墙壁)
maze_grid = np.array([
    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
    # ......(省略部分迷宫行以简化篇幅,完整代码见社群)
    [1, 1, 1, 0, 1, 1, 1, 1, 0, 0]
])
start_pos = (0, 0)
goal_pos = (9, 9)

# 超参数设置
total_episodes = 5000
alpha = 0.1          # 学习率
gamma = 0.9          # 折扣因子
epsilon = 0.5        # 初始探索率
reward_wall = -10
reward_goal = 50
reward_step = -1

actions = [(0,-1), (0,1), (-1,0), (1,0)]  # 左、右、上、下
Q_table = np.zeros(maze_grid.shape + (len(actions),))

3.3 辅助函数与训练循环

def is_valid_cell(pos, grid):
    r, c = pos
    if r < 0 or r >= grid.shape[0]: return False
    if c < 0 or c >= grid.shape[1]: return False
    if grid[r, c] == 1: return False
    return True

def choose_action(state, q_tbl, eps, num_acts):
    if np.random.random() < eps:
        return np.random.randint(num_acts)
    else:
        return np.argmax(q_tbl[state])

rewards_per_episode = []

for ep in range(total_episodes):
    state = start_pos
    total_reward = 0
    done = False
    while not done:
        act_idx = choose_action(state, Q_table, epsilon, len(actions))
        move = actions[act_idx]
        next_state = (state[0] + move[0], state[1] + move[1])
        
        if not is_valid_cell(next_state, maze_grid):
            reward = reward_wall
            done = True
        elif next_state == goal_pos:
            reward = reward_goal
            done = True
        else:
            reward = reward_step
        
        old_val = Q_table[state][act_idx]
        if done and next_state != goal_pos:
            max_next_q = 0
        else:
            max_next_q = np.max(Q_table[next_state])
        
        new_val = old_val + alpha * (reward + gamma * max_next_q - old_val)
        Q_table[state][act_idx] = new_val
        
        if not done:
            state = next_state
        total_reward += reward
    
    epsilon = max(0.01, epsilon * 0.995)
    rewards_per_episode.append(total_reward)

4.1 提取最优路径

def get_best_path(q_tbl, start, goal, acts, grid, max_steps=200):
    path = [start]
    cur = start
    visited = set()
    for _ in range(max_steps):
        if cur == goal: break
        visited.add(cur)
        best_a = None
        best_val = -float('inf')
        for i, mv in enumerate(acts):
            nxt = (cur[0]+mv[0], cur[1]+mv[1])
            if (0 <= nxt[0] < grid.shape[0] and 0 <= nxt[1] < grid.shape[1] 
                and grid[nxt] == 0 and nxt not in visited):
                if q_tbl[cur][i] > best_val:
                    best_val = q_tbl[cur][i]
                    best_a = i
        if best_a is None: break
        move = acts[best_a]
        cur = (cur[0]+move[0], cur[1]+move[1])
        path.append(cur)
    return path

optimal_path = get_best_path(Q_table, start_pos, goal_pos, actions, maze_grid)

4.2 迷宫路径可视化

def plot_maze_path(path, grid):
    cmap = ListedColormap(['#eef8ea', '#a8c79c'])
    plt.figure(figsize=(8,8))
    plt.imshow(grid, cmap=cmap)
    plt.scatter(start_pos[1], start_pos[0], marker='o', color='#81c784', s=200, label='起点')
    plt.scatter(goal_pos[1], goal_pos[0], marker='*', color='#388e3c', s=300, label='终点')
    if path:
        rows, cols = zip(*path)
        plt.plot(cols, rows, color='#60b37a', linewidth=4, label='最优路径')
    plt.title('强化学习:机器人迷宫导航')
    plt.gca().invert_yaxis()
    plt.legend()
    plt.show()

plot_maze_path(optimal_path, maze_grid)

图:智能体学习到的最优路径

4.3 训练奖励曲线

def plot_rewards_curve(rewards):
    plt.figure(figsize=(10,5))
    plt.plot(rewards)
    plt.title('每轮总奖励变化')
    plt.xlabel('训练轮次')
    plt.ylabel('总奖励')
    plt.grid(True)
    plt.show()

plot_rewards_curve(rewards_per_episode)

图:训练过程中每轮获得的总奖励,呈现收敛趋势


5. 在线与离线学习、Q-Learning细节、MDP与Bellman方程

5.1 在线学习与离线学习对比

强化学习方法可根据数据获取方式分为在线学习和离线学习。

图:在线RL与离线RL对比

在线学习中,智能体通过实时与环境交互收集数据并同时学习;离线学习则基于预先收集的静态数据集进行训练,不与环境交互。

5.2 Q-Learning深入解析

Q-Learning的核心是构建Q表,存储每个状态-动作对的期望累积奖励估计值。

图:Q-Learning概念示意

Q-Learning工作流程

图:Q-Learning算法流程图

Q表输出示例(4×4网格环境训练后):

图:各状态最大Q值热力图

图:学习到的Q表示例(状态0-15,动作左、右、上、下)

5.3 深度Q-Learning

当状态空间高维连续时,传统Q表不可行,此时使用深度神经网络近似Q函数,即Deep Q-Learning。

图:Deep Q-Learning概念

DQN架构

图:深度Q网络架构

关键技术包括:经验回放(Experience Replay)和目标网络(Target Network)。

5.4 马尔可夫决策过程

MDP是RL的数学框架,由状态、动作、转移概率、奖励、折扣因子五元组定义。

图:MDP核心组件

MDP示例:3×4网格世界

图:网格世界问题示意图

5.5 Bellman方程

Bellman方程是RL的数学基础,表达状态价值与后续状态价值之间的递归关系。

图:不使用Bellman方程时的价值回溯

图:使用Bellman方程进行动态更新

6. 研究结论

本文系统介绍了强化学习的基本原理,通过Q-Learning算法在迷宫导航任务中的完整实现,验证了该算法在离散状态空间下学习最优策略的有效性。训练奖励曲线的收敛趋势和最终提取的最优路径均证明了智能体成功学会了从起点到终点的无碰壁路径。进一步,本文讨论了Q-Learning的局限性(高维状态空间下的维度灾难),并引出Deep Q-Learning作为解决方案,同时阐述了MDP框架和Bellman方程的理论基础。本研究为后续将RL应用于更复杂实际场景(如机器人控制、自动驾驶)提供了可复现的代码基准和理论参考。

相关技术图片

DeepSeek、LangGraph和Python融合LSTM、RF、XGBoost、LR多模型预测NFLX股票涨跌|附完整代码数据

本文介绍了使用多种深度学习与机器学习模型对NFLX股票进行涨跌预测的方法,包含完整代码数据实践。

探索观点

阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。

本文配套的论文建模可直接套用的完整代码包、实证分析,可加小助手微信:tecdat_cn领取,我们可提供全流程的辅助学术合规辅导、1v1建模陪跑服务,助力顺利完成科研、通过答辩。