郭震 AI公众号:郭震AI

7 动态规划的基本思想和框架

发布日期:

最近更新:

分类: 强化学习

预计阅读: 4 分钟

阅读次数: 0

预计阅读4 分钟
结构重点5 个
图文要点6 张
正文规模1.5k 字

整理说明

这篇内容怎么整理

郭震 · 2026-06-04

独立整理围绕 5 个结构重点拆成环境、步骤、验证点和常见误区,尽量让读者能照着复现。
图文对照保留 6 张和配置、流程、判断结果有关的图片,方便快速定位正文重点。
持续校对工具、模型和命令变化较快,后续优先修正入口、参数和风险提醒。

阅读路线

先按这条路线读

先抓住主线,再回到代码、配置和图文细节,读起来会更稳。

图文要点

先看本文图文节点

按图先建立主线,再跳回正文核对步骤、配置和判断标准。

动态规划的基本思想和框架结构图查看大图
动态规划的基本思想和框架结构图

强化学习的核心是智能体在环境中试错,学习时要同时看状态、动作、奖励和策略更新。阅读时可以按「动态规划的基本思想 -> 案例分析:最短路径问题 -> 动态规划的框架 -> 动态规划的实现」建立结构,再回到正文里的代码、案例或指标做验证。

动态规划的基本思想和框架核对图查看大图
动态规划的基本思想和框架核对图

读完后,用一个真实小任务复查:输入是什么,处理环节在哪里,输出是否可验收;失败时先查「动态规划的基本思想」,再查「案例分析:最短路径问题」。

在强化学习中,动态规划(Dynamic Programming, DP)是解决优化问题的重要方法。它为我们提供了一种系统的方法来处理具有阶段性决策的问题。在上一篇文章中,我们介绍了马尔可夫决策过程(MDP)中的折扣因子和价值函数,这些概念是理解动态规划的基础。在本篇中,我们将探讨动态规划的基本思想和框架,为后续的值迭代算法奠定基础。

动态规划的基本思想

动态规划的核心思想是“递归分解”。针对某个复杂问题,动态规划将其划分为多个子问题,解决这些子问题后再合并结果,从而获得原问题的解。这种方法特别适用于具有重叠子问题和最优子结构性质的问题。

动态规划的基本思想和框架应用检查卡查看大图
动态规划的基本思想和框架应用检查卡

回看《动态规划的基本思想和框架》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。

动态规划的基本思想和框架应用复盘卡查看大图
动态规划的基本思想和框架应用复盘卡

如果《动态规划的基本思想和框架》还没完全消化,可以从这张卡片的四个动作重新走一遍。

  • 重叠子问题:子问题多次出现,通过保存已经解决的子问题的结果,可以避免重复计算,提高效率。
  • 最优子结构:一个问题的最优解包含了其子问题的最优解。

动态规划主要用于寻找在某种意义上最优的解决方案,通常涉及用了某种评价标准来进行优化,比如最小化成本,最大化收益等。

案例分析:最短路径问题

考虑一个简单的最短路径问题,假设我们有一个加权有向图,其中每个边都有一个非负的权重。我们的目标是找到从起点到终点的最短路径。

  1. 子问题定义:设cost(s, t)为从节点s到节点t的最短路径成本。对于每一个节点s,我们需要计算cost(s, t)

  2. 递归关系:对于节点st的路径,如果我们中途选择经过节点u,那么可以表示为:

    cost(s,t)=minu(cost(s,u)+cost(u,t))cost(s, t) = \min_u (cost(s, u) + cost(u, t))

    这个式子表明,从st的最短路径成本是通过某个中间节点u的路径成本的最小值。

  3. 边界条件:若cost(s, s) = 0(从一个点到自身不需要成本),如果节点之间没有连接,则cost(s, t) = \infty

动态规划的框架

在解决动态规划问题时,我们通常遵循以下步骤:

  1. 定义问题:明确需要解决的问题以及目标。
  2. 划分子问题:将原问题分解为多个更小的子问题。
  3. 建立递推关系:找出子问题之间的关系,通常使用递归公式。
  4. 计算顺序:根据递推关系,以合适的顺序计算所有子问题的解,确保每个子问题在需要使用之前都已解决。
  5. 构造最终解:根据子问题的结果构造出原问题的解。

动态规划的实现

以下是用 Python 实现的一个简化的动态规划算法,通过实例找出从起点到终点的最短路径。

动态规划强化学习判断卡查看大图
动态规划强化学习判断卡

学习动态规划框架时,先看状态转移、奖励函数、价值迭代和策略改进之间的关系。

import numpy as np

def shortest_path(graph, start, end):
    num_nodes = len(graph)
    # 初始化成本矩阵
    cost = np.full((num_nodes, num_nodes), np.inf)
    
    # 从自身到自身的成本为0
    for i in range(num_nodes):
        cost[i][i] = 0
    
    # 填充邻接矩阵
    for u in range(num_nodes):
        for v, weight in graph[u].items():
            cost[u][v] = weight

    # 动态规划计算最短路径成本
    for k in range(num_nodes):
        for i in range(num_nodes):
            for j in range(num_nodes):
                # 更新成本
                if cost[i][j] > cost[i][k] + cost[k][j]:
                    cost[i][j] = cost[i][k] + cost[k][j]

    # 返回从 start 到 end 的最短路径
    return cost[start][end]

# 示例图:邻接矩阵表示
# graph[u] = {v: weight} 表示从 u 到 v 的边权重
graph = [
    {1: 1, 2: 4},
    {2: 2, 3: 6},
    {3: 1},
    {}
]

start_node = 0
end_node = 3
result = shortest_path(graph, start_node, end_node)
print(f"从节点 {start_node} 到节点 {end_node} 的最短路径成本是: {result}")

小结

动态规划为解决复杂的优化问题提供了一种有效的方法。通过系统地分解问题,建立递推关系,我们能够在合理的时间内找到最优解。接下来,我们将介绍动态规划中特别重要的一个算法——值迭代算法,它在基于动态规划的学习中起着重要作用。

强化学习阅读地图卡查看大图
强化学习阅读地图卡

进入《动态规划的基本思想和框架》正文前,可以先扫一遍配图:它在问什么、要分清哪些概念、哪一步值得动手、最后用什么标准验收。

如果你对动态规划的基本思想和框架有更深入的理解,将为后续学习值迭代算法做好准备。

继续阅读

从这篇继续找到相关教程

AI 教程总索引

常见问题

读前先确认这三点

动态规划的基本思想和框架适合谁读?

这是 强化学习入门 系列第 7 / 28 篇,适合正在学习强化学习入门,并且需要把概念落到操作步骤或判断标准里的读者。

读这篇强化学习入门教程要多久?

按中文技术文章阅读速度估算,通读大约 4 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。

这篇文章里的图文节点怎么用?

正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

继续阅读

继续找到相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...