在学习动态规划法之前,我们先来了解动态规划的几个概念
1、 阶段:把问题分成几个相互联系的有顺序的几个环节,这些环节即称为阶段。
2、 状态:某一阶段的出发位置称为状态。
3、 决策:从某阶段的一个状态演变到下一个阶段某状态的选择。
4、 状态转移方程:前一阶段的终点就是后一阶段的起点,前一阶段的决策选择导出了后一阶段的状态,这种关系描述了由k阶段到k+1阶段状态的演变规律,称为状态转 移方程。
动态规划法的定义:在求解问题中,对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃那些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局是最优解,这种求解方法称为动态规划法。
一般来说,适合于用动态规划法求解的问题具有以下特点:
1、可以划分成若干个阶段,问题的求解过程就是对若干个阶段的一系列决策过程。
2、每个阶段有若干个可能状态
3、一个决策将你从一个阶段的一种状态带到下一个阶段的某种状态。
4、在任一个阶段,最佳的决策序列和该阶段以前的决策无关。
5、各阶段状态之间的转换有明确定义的费用,而且在选择最佳决策时有递推关系(即动态转移方程)。
动态规划设计都有着一定的模式,一般要经历以下几个步骤:
1、划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。
2、确定状态:将问题发展到各个阶段时所处的各种客观情况用不同的状态表示出来。
3、确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态,所以如果确定了决策,状态转移方程也就可以写出。
4、寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。
5、程序设计实现:动态规划的主要难点在于理论上的设计,一旦设计完成,实现部分就会非常简单。
根据以上的步骤设计,可以得到动态规划设计的一般模式:
for k:=阶段最小值to 阶段最大值do {顺推每一个阶段}
for I:=状态最小值to 状态最大值do {枚举阶段k的每一个状态}
for j:=决策最小值to 决策最大值do {枚举阶段k中状态i可选择的每一种决策}
f[ik]:=min(max){f[ik-1]+a[ik-1,jk-1]|ik-1通过决策jk-1可达ik}
例如:多段图G=(V,E)是一个有向图。它具有如下特性:图中的结点被划分成k>2个不相交的集合Vi,1≤i≤k,其中V1和Vk分别只有一个结点s(源点)和t(汇点)。图中所有的边<u,v>均具有如下性质:若u∈Vi,则v∈Vi+1,1≤i<k-l,且每条边<u,v>均附有成本C(u,v)。从s到t的一条路径成本是这条路径上边的成本和。多段图问题(Multistage Graph Problem)是求由s到t的最小成本路径。每个集合Vi定义图中的一段。由于E的约束,每条从s到t的路径都是从第1段开始,在第k段终止。图1.1所示的就是一个5段图。
对于每一条由s到t的路径,可以把它看成是在k-2个阶段中作出的某个决策序列的相应结果。第i次决策就是确定Vi+1中的哪个结点在该路径上,1≤i≤k-2(在第k-1阶段无须做出决策,毫无疑问,只有汇点在这个路径上)。
下面证明最优性原理对多段图成立。
假设s,v2,v3, …, vk-1,t是一条由s到t的最短路径。再设从源点s(初始状态)开始,已作出了到结点v2的决策(初始决策),则v2就是初始决策所产生的状态。如果把v2看成是原始问题的一个子问题的初始状态,求解这个子问题就是找出一条由v2到t的最短路径。这条最短路径显然是v2,v3, …, vk-1,t。如若不然,可假设v2,q3,…,qk-1,t是一条由v2到t的更短路径,则s,v2,q3,…,qk-1,,t是一条比路径s,v2,v3, …, vk-1,t更短的由s到t的路径。与假设矛盾,故最优性原理成立。因此它为使
假设s,v2,v3, …, vk-1,t是一条由s到t的最短路径。再设从源点s(初始状态)开始,已作出了到结点v2的决策(初始决策),则v2就是初始决策所产生的状态。如果把v2看成是原始问题的一个子问题的初始状态,求解这个子问题就是找出一条由v2到t的最短路径。这条最短路径显然是v2,v3, …, vk-1,t。如若不然,可假设v2,q3,…,qk-1,t是一条由v2到t的更短路径,则s,v2,q3,…,qk-1,,t是一条比路径s,v2,v3, …, vk-1,t更短的由s到t的路径。与假设矛盾,故最优性原理成立。因此它为使
用动态规划法方法来解多段图问题提供了可能。
。