动态规划

一.动态规划的基本概念

在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要做出决策,从而使整个过程达到最好的活动效果。当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线,如图所示:


这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题就称为多阶段决策问题。

动态规划的基本模型如下:

(1)确定问题的决策对象。

(2)对决策过程划分阶段。

(3)对各阶段确定状态变量。

(4)根据状态变量确定费用函数和目标函数。

(5)建立各阶段状态变量的转移过程,确定状态转移方程。

动态规划的常用名词

在学习动态规划之前,先得对下面的名词有所了解。本书将标准名词作了一些简化,便于大家更好的理解。

(1)状态(smte)

对于一个问题,所有可能到达的情况(包括初始情况和目标情况)都称为这个问题的一个状态。

(2)状态变量(sk)

对每个状态k关联一个状态变量sk,它的值表示状态k所对应的问题的当前解值。

(3)决策(decision)

决策是一种选择,对于每一个状态而言,你都可以选择某一种路线或方法,从而到达下一个状态。

(4)决策变量(dk)

在状态k下的决策变量dk的值表示对状态k当前所做出的决策。

(5)策略

策略是一个决策的集合,在我们解决问题的时候,我们将一系列决策记录下来,就是一个策略,其中满足某些最优条件的策略称之为最优策略。

(6)状态转移函数(t)

从一个状态到另一个状态,可以依据一定的规则来前进。我们用一个函数t来描述这样的规则,它将状态i和决策变量di映射到另一个状态j,记为t(i,di)=j

(7)状态转移方程(f)

状态转移方程f描述了状态变量之间的数学关系。一般来说,与最优化问题相应,状态转移方程表示si的值最优化的条件,或者说是状态i所对应问题的最优解值的计算公式,用代数式表示就是:si=f({(sj,dj)|i=t(j,dj),对决策变量dj所有可行的取值})

最优化原理

“最优化原理”(Principle ofoptimality):“一个过程的最优决策具有这样的性质:即无论其初始状态和初始决策如何,其今后诸策略对以第一个决策所形成的状态作为初始状态的过程而言,必须构成最优策略”。简言之,一个最优策略的子策略,对于它的初态和终态而言也必是最优的。

“满足一定条件”

(1)状态必须满足最优化原理;

(2)状态必须满足无后效性。

二.动态规划的逆向思维法

逆向思维法是指从问题目标状态出发倒推回初始状态或边界状态的思维方法。如果原问题可以分解成几个本质相同、规模较小的问题,很自然就会联想到从逆向思维的角度寻求问题的解决。

动态规划与分治法的不同之处在于动态规划允许这些子问题不独立(即各子问题可包含公共的子问题),它对每个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。这就是动态规划高效的一个原因。

动态规划的逆向思维法的要点可归纳为以下三个步骤:

(1)分析最优值的结构,刻画其结构特征;

(2)递归地定义最优值;

(3)按自底向上或自顶向下记忆化的方式计算最优值。

三.动态规划的正向思维法

正向思维法是指从初始状态或边界状态出发,利用某种规则不断到达新的状态,直到问题目标状态的方法。动态规划的正向思维法,正是从已知最优值的初始状态或边界状态开始,按照一定的次序遍历整个状态空间,递推出每个状态所对应问题的最优值。

提出动态规划的正向思维法的根本原因,是为了摆脱逆向思维法当中那种将大问题转化为子问题的思维框框,提供一种新的思维方式。在正向思维法中,我们不再区分原问题和子问题,将动态规划的过程看成是从状态到状态的转移。我们将所有的状态构造出一个状态空间,并在状态空间中设想一个状态网络,若对两个状态i,j,存在决策变量di使t(i,di)=j,则向状态网络添加有向边。给定己知最优值的初始状态或边界状态,我们可以沿着有向边推广到未知最优值的新状态,利用状态转移方程得到新状态的状态变量的最优值。我们可以用这种方式遍历整个状态空间,得到每个状态的状态变量的最优值。

因为正向思维法中不再区分原问题、子问题、子子问题,所以我们不再按照问题被递归调用求解的相反次序的方法确定状态最优值的计算次序。从上面我们知道可以按照状态的拓扑序列来计算每个状态的最优值,于是我们用一个新的名词“阶段”来描述在状态空间遍历的过程中,各个状态最优值的计算次序。我们将每个状态和一个阶段挂钩,前一个阶段的状态先计算,后一个阶段的状态后计算。有的时候我们甚至将一组状态和一个阶段挂钩,前一个阶段的那组状态先计算,后一个阶段的那组状态后计算,而在同一个阶段内,那些状态的计算次序可以是任意的。

动态规划的正向思维法的要点可归纳为以下三个步骤:

(1)构造状态网络;

(2)根据状态转移关系和状态转移方程建立最优值的递推计算式:

(3)按阶段的先后次序计算每个状态的最优值。

“从己知推广到未知”的思维,正是动态规划正向思维法的精髓。

(1)划分阶段:,按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

(3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两段各状态之间的关系来确定决策。

(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

(5)程序设计实现:动态规划的主要难点在于理论上的设计,一旦设计完成,实现部分就会非常简单。

 

[例题]钉子与小球 (NOI'99)

有一个三角形木板,竖直立放,上面钉着n(n+1)/2颗钉子,还有(n+1)个格子(当n=5时如下图a)。每颗钉子和周围的钉子的距离都等于d,每个格子的宽度也都等于d,且除了最左端和最右端的格子外每个格子都正对着最下面一排钉子的间隙。

让一个直径略小于d的小球中心正对着最上面的钉子在板上自由滚落,小球每碰到一个钉子都可能落向左边或右边(概率各1/2),且球的中心还会正对着下一颗将要碰上的钉子。例如图b就是小球一条可能的路径。

我们知道小球落在第i个格子中的概率为:

其中i为格子的编号,从左至右依次为0,1,...,n。

现在的问题是计算拔掉某些钉子后,小球落在编号为m的格子中的概率pm。假定最下面一排钉子不会被拔掉。例如图3是某些钉子被拔掉后小球一条可能的路径。

图a             图b         图c

输入:

第1行为整数n(2<=n<=50)和m(0<=m<=n)。

以下n行依次为木板上从上至下n行钉子的信息,每行中‘ * ’表示钉子还在,‘ . ’表示钉子被拔去,注意在这n行中空格符可能出现在任何位置。

输出:

仅一行,是一个既约分数(0写成0/1),为小球落在编号为m的格子中的概率pm。

既约分数的定义:A/B是既约分数,当且仅当A、B为正整数且A和B没有大于1的公因子。

样例输入:

5 2

*

* .

* * *

* . * *

* * * * *

样例输出:

7/16

这个题目一看就不觉让人想起一道经典的动态规划题。下面先让我们回顾一下这个问题。

 

[例题]数字三角形(IOI'94)

在下图中求从顶至低某处的一条路径,使该路径所经过的数字的总和最大,每一步只能向左下或右下走。

7

3  8

8  1  0

2  7  4  4

4  5  2  6  5

在这个问题中,我们按走过的行数来划分阶段,以走到每一行时所在的位置来作为状态,决策就是向左下走(用0表示)或向右下走(用1表示)。

状态转移方程:

规划方程:

边界条件:

这是一个比较简单的最优化问题,我们还可以把这个问题改成一个更加简单的整数统计问题:求顶点到每一点的路径总数。把这个总数用fk(xk)表示,那么递推公式就是:

在这里,虽然求和公式只有两项,但我们仍然用∑的形式表示,就是为了突出这个递推公式和上面的规划方程的相似之处。这两个公式的边界条件都是一模一样的。

再回到我们上面的“钉子与小球”问题,这是一个概率统计问题。我们继续沿用上面的思想,用fk(xk)表示小球落到第k行第xk个钉子上的概率,则递推公式如下:

这里函数Existk(xk)表示第k行第xk个钉子是否存在,存在则取1,不存在则取0;边界条件

可以看出这个公式较之上面的两个式子虽然略有变化,但是其基本思想还是类似的。在解这个问题的过程中,我们再次运用了动态规划的思想。

 

四.动态规划与搜索——动态规划是高效率、高消费算法

对于上图(a)这样几个状态构成的一个隐式图,用搜索算法就会出现重复,如上图(b)所示,状态C2被搜索了两次。在深度搜索中,这样的重复会引起以C2为根整个的整个子搜索树的重复搜索;在宽度搜索中,虽然这样的重复可以立即被排除,但是其时间代价也是不小的。而动态规划就没有这个问题,如上图(c)所示。

一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。

 

五.动态规划与网络流——动态规划是易设计易实现的算法

[例题] 单源最短路径问题

已知从A到J的路线及费用如上图,求从A到J的最小费用路线。

问题的分析和解答:

本问题没有明显的阶段划分,各点间没有一定的先后次序,不能按照最少步数来决定顺序,如从A到D走捷径需4,但A-C-D只需3,更优。看来图中出现回路,不能实施动态规划。其实不然。细想一下,从A到J的最优策略,它每一部分也是最优的(可以用反证法来证明),换言之,本题也具有最优化性质,只是阶段不明显而已。

对于这类问题,我们可以换个角度分析,构造算法。比较一下前面所讲的动态规划法,都是以某个状态为终点,寻找到达次点的路径,然后比较优劣,确定此状态最优值。可是,本题阶段不明显,各状态之间的道路会出现嵌套,故此法不能使用。变一下角度,每次都以某个状态为起点,遍历由它引申出去的路径,等所有已知状态都扩展完了,再来比较所有新状态,把值最小的那个状态确定下来,其它的不动。如上图,先从A出发,找到3个结点B,D,C,费用为F(B)=3,F(D)=4,F(C)=2。因为F(B),F(D)都大于F(C),那么可以确定:不可能再有路线从B或D出发到C,比A-C更优。这样F(C)的最优值便确定了。可是,有没有路线从C出发到B或D,比A-B或A-D更优呢?还不清楚。继续下去,因为A扩展完了,只有从C开始,得到A-C-D=3,A-C-F=3,于是F(D)的值被刷新了,等于3。现在,有F(B)=F(D)=F(F)=3,于是,三点的最优值都确定下来了。然后以分别以三个点为起点,继续找。以此类推,直到J点的最优值确定为止。

细心观察,其实本题的隐含阶段就是以各结点的最优值的大小来划分的,上述过程就是按最优值从小到大运用动态规划。人们习惯上把此题归入到图论范畴中,并将上述方法称为标号法。这个算法就是图论中著名的Dijkstra单源最短路径算法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值