7 动态规划的基本思想和框架
系列进度
强化学习入门 · 第 7 / 28 篇
整理说明
这篇内容怎么整理
郭震 · 2026-06-04
阅读路线
先按这条路线读
先抓住主线,再回到代码、配置和图文细节,读起来会更稳。
强化学习的核心是智能体在环境中试错,学习时要同时看状态、动作、奖励和策略更新。阅读时可以按「动态规划的基本思想 -> 案例分析:最短路径问题 -> 动态规划的框架 -> 动态规划的实现」建立结构,再回到正文里的代码、案例或指标做验证。
读完后,用一个真实小任务复查:输入是什么,处理环节在哪里,输出是否可验收;失败时先查「动态规划的基本思想」,再查「案例分析:最短路径问题」。
在强化学习中,动态规划(Dynamic Programming, DP)是解决优化问题的重要方法。它为我们提供了一种系统的方法来处理具有阶段性决策的问题。在上一篇文章中,我们介绍了马尔可夫决策过程(MDP)中的折扣因子和价值函数,这些概念是理解动态规划的基础。在本篇中,我们将探讨动态规划的基本思想和框架,为后续的值迭代算法奠定基础。
动态规划的基本思想
动态规划的核心思想是“递归分解”。针对某个复杂问题,动态规划将其划分为多个子问题,解决这些子问题后再合并结果,从而获得原问题的解。这种方法特别适用于具有重叠子问题和最优子结构性质的问题。
回看《动态规划的基本思想和框架》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。
如果《动态规划的基本思想和框架》还没完全消化,可以从这张卡片的四个动作重新走一遍。
- 重叠子问题:子问题多次出现,通过保存已经解决的子问题的结果,可以避免重复计算,提高效率。
- 最优子结构:一个问题的最优解包含了其子问题的最优解。
动态规划主要用于寻找在某种意义上最优的解决方案,通常涉及用了某种评价标准来进行优化,比如最小化成本,最大化收益等。
案例分析:最短路径问题
考虑一个简单的最短路径问题,假设我们有一个加权有向图,其中每个边都有一个非负的权重。我们的目标是找到从起点到终点的最短路径。
-
子问题定义:设
cost(s, t)为从节点s到节点t的最短路径成本。对于每一个节点s,我们需要计算cost(s, t)。 -
递归关系:对于节点
s到t的路径,如果我们中途选择经过节点u,那么可以表示为:这个式子表明,从
s到t的最短路径成本是通过某个中间节点u的路径成本的最小值。 -
边界条件:若
cost(s, s) = 0(从一个点到自身不需要成本),如果节点之间没有连接,则cost(s, t) = \infty。
动态规划的框架
在解决动态规划问题时,我们通常遵循以下步骤:
- 定义问题:明确需要解决的问题以及目标。
- 划分子问题:将原问题分解为多个更小的子问题。
- 建立递推关系:找出子问题之间的关系,通常使用递归公式。
- 计算顺序:根据递推关系,以合适的顺序计算所有子问题的解,确保每个子问题在需要使用之前都已解决。
- 构造最终解:根据子问题的结果构造出原问题的解。
动态规划的实现
以下是用 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}")
小结
动态规划为解决复杂的优化问题提供了一种有效的方法。通过系统地分解问题,建立递推关系,我们能够在合理的时间内找到最优解。接下来,我们将介绍动态规划中特别重要的一个算法——值迭代算法,它在基于动态规划的学习中起着重要作用。
进入《动态规划的基本思想和框架》正文前,可以先扫一遍配图:它在问什么、要分清哪些概念、哪一步值得动手、最后用什么标准验收。
如果你对动态规划的基本思想和框架有更深入的理解,将为后续学习值迭代算法做好准备。
继续阅读
从这篇继续找到相关教程
常见问题
读前先确认这三点
动态规划的基本思想和框架适合谁读?
这是 强化学习入门 系列第 7 / 28 篇,适合正在学习强化学习入门,并且需要把概念落到操作步骤或判断标准里的读者。
读这篇强化学习入门教程要多久?
按中文技术文章阅读速度估算,通读大约 4 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。
这篇文章里的图文节点怎么用?
正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
继续阅读