引言:暴力搜索树的剪枝和有向无环图的遍历
动态规划的建模和求解过程,可以看成是暴力搜索树的剪枝过程;也可以看成是以状态为节点,以决策为边构成的有向无环图的广度优先遍历。
本专栏之前的一篇文章[1]通过决策树剪枝的视角理解动态规划,把动态规划看成是对暴力搜索得到的决策树(更确切地说,是DAG图)的剪枝过程。最近看到了 @阮行止 大佬的一个回答[2],在这里换一个视角讨论一下。
本节的核心思想就是下面这句话:
如果想不明白一个问题应该怎么用动态规划,可以先尝试从暴力搜索入手。
先看 @阮行止 大佬文章中的例子,
如何用1、5、11元面值的钞票,凑出15元,使得用到的钞票尽可能少。
在这里,大佬并没有展开讲暴力搜索,但是我觉得这里怎么做暴力搜索也是一个很有意思的问题。
针对这个问题,如果要做暴力搜索的话,主要有两个搜索的思路:
(1)每次用一张钞票,决策是这张钞票的面额是多少。

(2)每次用一种钞票,决定用多少张这种钞票。

这两种暴力搜索方式的区别在于,第一种暴力搜索方式会形成一个深度不确定的搜索树,目标函数是找出层数最少的叶子节点;第二种暴力搜索过程形成的搜索树的深度是确定的,目标函数是使
值得注意的是,两种搜索树的叶子节点一定为15,根节点一定为0。
下面,从叶子结点开始自底向上对暴力搜索树进行剪枝,以第二种暴力搜索树为例。
第三层:

第二层,可以通过剪枝得到从第二层的状态0到第三层的状态15的“最优分支”:

那么,为什么不倾向于选择第一种搜索方式呢?因为第一种搜索方式的指标函数

针对以上讨论的一个搜索树,将相同阶段相同状态的节点合并,可以得到一个有向无环图。所以,动态规划也可以看成有向无环图从后向前做广度优先遍历的过程。
同样,最短路径问题是一个天然的有向无环图,逆推计算的过程就相当于从后向前做广度优先遍历的过程,每一步求
从搜索树的角度理解动态规划的基本概念
阶段:恰当分层
(1)相当于树的第几层。
(2)为了便于剪枝,阶段总数(或者说树的深度)最好是固定的。
状态:全部信息、无后效性
(1)每个阶段开始的状况。
(2)状态的无后效性:类比一系列基于递归方法的树的操作,例如先序遍历:对于每层递归,我们必须保证向下一层传递的参数保存了全部需要的信息。这些“全部需要的信息”就是状态。
(3)状态相当于树中的节点。
决策:允许决策集合
(1)决策变量是状态变量的函数
(2)决策变量的取值有一个范围的限制(允许决策集合)。
(3)每个决策相当于树的一个分枝。
策略:到叶子节点的路径
由一系列决策构成,理论上不包括状态。但是在确定性动态规划中,
状态转移方程:
决定了从上一层的节点
指标函数:路径的函数、可分离性、单调性
指标函数

在这里特别提一下,指标函数在Introduction to Operations Research[3]里是用
最优值函数:
最优值函数
当前状态
动态规划的基本方程的推导
指标函数具有单调性,现实中的指标函数大多数是每个阶段的指标的和或乘积。下面以加和为例,推导动态规划的基本方程。

动态规划基本方程的直观理解
如下图所示,在搜索树中,每个节点有两个属性:状态
边界条件就是叶子节点的最优值

参考
- ^https://zhuanlan.zhihu.com/p/82452868
- ^https://www.zhihu.com/question/23995189/answer/613096905
- ^Introduction to Operations Research
- ^《运筹学(第4版)》清华大学出版社