动态规划:根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。即使是一些静态模型,只要人为的引进“时间”因素,分成时段,就可以转化为多阶段的动态模型,用动态规划去处理。
动态规划求解的问题需要满足一定的条件:
- 最优化原理
- 无后效应
最优化原理
最优化原理
:不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简单来说就是一个最优策略的子策略也是必须是最优的,所有子问题的局部最优解将导致整个问题的全局最优解。
最优化原理是动态规划的基础
,任何一个问题,如果失去最优化原理的额支持,就不可能用动态规划解决
举个的例子说明:
如上图,求从A点到E点的最短距离,假如最短距离的路线经过图中的B点,那么子问题就是求从A点到B点之间的最短距离。
那么这个问题里,怎么证明最优化原理呢?
我们假设从A点到E点的最短距离为d,其最优策略的子策略假设经过B点,记该策略中B点到E点的距离为d1,A点到B点的距离为d2。我们可以使用反证法,假设存在B点到E点的最短距离d3,并且d3 < d1,那么 d3 + d2 < d1 + d2 = d,这与d是最短距离相矛盾,所以,d1是B点到E点的最短距离。
为了增加理解,这里再举一个反例:
图中有四个点,A、B、C、D,相邻两点有两条连线,代表两条通道,d1,d2,d3,d4,d5,d6代表的是道路的长度,求A到D的所有通道中,总长度除以4得到的余数最小的路径为最优路径,求一条最优路径。
按照最优化原理,A的最优取值应该可以由B的最优取值来确定,而B的最优取值为(3+5)mod 4 = 0,所以应该选d2和d6这两条道路。而实际上,全局最优解是d4+d5+d6或者d1+d5+d3。所以这里子问题的最优解并不是原问题的最优解,即不满足最优化原理。所以就不适合使用动态规划来求解了
无后效应
无后效应
:下一时刻的状态只与当前状态有关,而与当前状态之前的状态无关,当前状态是对以往策略的总结。换句话说,过去做的选择不会影响现在能做的最优选择,现在能做的最优选择只与当前的状态有关,与经过如何复杂的决策到达该状态的方式无关。
在上面的最短路径问题上,加上一个限制条件:同一个格子只能通过一次。
那么, 这个题就不符合无后效性了,因为前一个子问题的解会对后面子问题的选择策略有影响,比如说,如果从A到B选择了一条如下图中绿色表示的路线,那么从B点出发到达E点的路线就只有一条了。也就是说从A点到B点的路径选择会影响B点到E点的路径选择
问题解决思路
动态规划的理论设计都有一定的模式,一般需要经历一下几个步骤:
初始状态 -> |决策1| -> |决策2| -> |决策3|...-> |决策n| -> 结束状态
- 划分阶段:按照问题的时间或空间特征,把问题分为若干阶段
- 确定状态或者状态变量:将问题发展到各个阶段所处于的各种客观情况用不同的状态标识出来
- 确定决策并写出状态转移方程:如果确定了决策,状态转移方程也可写出,但事实上常常是反过来做,根据相邻两段个状态之间的关系来确定决策。
- 寻找边界条件:给出的状态转移方程是一个递归式,需要一个递推的终止条件或边界条件
使用动态规划求解问题,最重要的就是确定动态规划三要素:
- 问题的阶段
- 每个阶段的状态
- 从前一个阶段转化为后一个阶段之间的递推关系
其中递推关系必须是从次小的问题开始到较大的问题之间的转化。
从这个角度来讲,动态规划往往可以用递归程序实现
,不给过递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势。
设计算法实现步骤:
- 问题抽象化
- 建模
- 寻找约束条件
- 寻找递推关系式
- 确定初始值