动态规划

本文深入讲解动态规划的基本概念、思想与策略,介绍算法设计方法及其适用范围,通过实例阐述动态规划求解问题的过程,帮助读者掌握动态规划的核心要素。

动态规划算法通常用于求解具有最优性质的问题

1.基本概念

      动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划(DP)。

2.基本思想与策略

      基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。

3.动态规划的算法设计

1:找出最优解的性质,并描述其结构特征

2:递归定义最优值

3:以自底向上的方式计算最优值

4:根据计算最优值时得到的信息构造出最优解

4.能采用动态规划求解的问题的一般要具有3个性质

      (1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
      (2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

      (3) 有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)动态规划将原来具有指数级时间复杂度的搜索算法改进成了具有多项式时间复杂度的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法。

5.使用动态规划求解问题,最重要的就是确定动态规划三要素

(1)问题的阶段 

(2)每个阶段的状态

(3)从前一个阶段转化到后一个阶段之间的递推关系

      递推关系必须是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解:f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}

6.动态规划的具体步骤

      (1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。
      (2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。
      (3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。
      (4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

7.举例说明

1)多阶段决策过程的最优化问题

首先,例举一个典型的且很直观的多阶段决策问题。

图1表示城市之间的交通路网,线段上的数字表示费用,单向通行由A→E。求A→E的最省费用。

图1 城市之间的交通路网

如图1所示,从A到E共分为4个阶段,即第一阶段从A到B,第二阶段从B到C,第三阶段从C到D,第四阶段从D到E。除起点A和终点E外,其他各点既是上一阶段的终点又是下一阶段的起点。例如,从A到B的第一阶段中,A为起点,终点有B1,B2,B3三个,因此这时走的路线有三个选择,A→B1,A→B2,A→B3。若选择A→B2,B2就是第一阶段在我们决策之下的结果,它既是第一阶段路线的终点,又是第二阶段路线的始点。在第二阶段,再从B2点出发,对于B2点就有一个可供选择的终点集合(C1,C2,C3);若选择由B2走至C2为第二阶段的决策,则C2就是第二阶段的终点,同时又是第三阶段的始点。同理递推下去,可看到各个阶段的决策不同,线路就不同。很明显,当某阶段的起点给定时,它直接影响着后面各阶段的行进路线和整个路线的长短,而后面各阶段的路线的发展不受这点以前各阶段的影响。故此问题的要求是:在各个阶段选取一个恰当的决策,使由这些决策组成的一个决策序列所决定的一条路线,其总路程最短。具体情况如下:

(1)由目标状态E向前推,可以分成四个阶段,即四个子问题。

(2)策略:每个阶段到E的最省费用为本阶段的决策路径。

(3)D1、D2是第一次输人的节点。他们到E都只有一种费用,在D1框上面标5,D2框上面标2。目前无法定下,那一个点将在全程最优策略的路径上。第二阶段计算中,5、2都应分别参加计算。

(4)C1、C2、C3是第二次输入节点,他们到D1、D2各有两种费用。此时应计算C1、C2、C3分别到E的最少费用。C1的决策路径是min{(C1D1),(C1D2)}。计算结果是C1+D1+E,在C1框上面标为8。同理,C2的决策路径计算结果是C2+D2+E,在C2框上面标为7。同理,C3的决策路径计算结果是C3+D2+E,在C3框上面标为12。此时也无法定下第一、二阶段的城市那两个将在整体的最优决策路径上。

(5)第三次输入节点为B1、B2、B3,而决策输出节点可能为C1、C2、C3。仿前计算可得B1、B2、B3的决策路径为如下情况。B1∶B1C1费用12+8=20,路径:B1+C1+D1+E。B2∶B2C1费用6+8=14,路径:B2+C1+D1+E。B3∶B2C2费用12+7=19,路径:B3+C2+D2+E。此时也无法定下第一、二、三阶段的城市那三个将在整体的最优决策路径上。

(6)第四次输入节点为A,决策输出节点可能为B1、B2、B3。同理可得决策路径为A∶AB2,费用5+14=19,路径A+B2+C1+D1+E。

此时才正式确定每个子问题的节点中,那一个节点将在最优费用的路径上。19显然符合最优原理。子问题的决策中,只对同一城市(节点)比较优劣。而同一阶段的城市(节点)的优劣由下一个阶段决定。

2)动态规划的概念

在例4-21多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化问题的方法为动态规划方法。

与穷举法相比,动态规划的方法大大减少了计算量,又丰富了计算结果。

从例4-21的求解结果中,我们不仅得到由A点出发到终点E的最短路线及最短距离,而且还得到了从所有各中间点到终点的最短路线及最短距离,这对许多实际问题来讲是很有用的。

动态规划的最优化概念是在一定条件下,找到一种途径,在对各阶段的效益经过按问题具体性质所确定的运算以后,使得全过程的总效益达到最优。

应用动态规划要注意阶段的划分是关键,必须依据题意分析,寻求合理的划分阶段(子问题)方法。而每个子问题是一个比原问题简单得多的优化问题。而且每个子问题的求解中,均利用它的一个后部子问题的最优化结果,直到最后一个子问题所得最优解,它就是原问题的最优解。

3)动态规划的适用范围

准确地说,动态规划不是万能的,它只适于解决一定条件的最优策略问题。许多看似不是这个范围中的问题都可以转化成这类问题。其中,“一定条件”是指状态必须满足最优化原理;状态必须满足无后效性。

动态规划的最优化原理是指无论过去的状态和决策如何,对前面的决策所形成的当前状态而言,余下的诸决策必须构成最优策略。可以通俗地理解为子问题的局部最优将导致整个问题的全局最优。在例4-21最短路径问题中,A到E的最优路径上的任一点到终点E的路径也必然是该点到终点E的一条最优路径,满足最优化原理。

动态规划的无后效性原则是指某阶段的状态一旦确定,则此后过程的演变不再受此前各状态及决策的影响。也就是说,“未来与过去无关”,当前的状态是此前历史的一个完整总结,此前的历史只能通过当前的状态去影响过程未来的演变。具体地说,如果一个问题被划分各个阶段之后,阶段I中的状态只能由阶段I+1中的状态通过状态转移方程得来,与其他状态没有关系,特别是与未发生的状态没有关系,这就是无后效性。

动态规划算法的难点在于 从实际问题中抽象出动态规划表dp,dp一般是一个数组,可能是一维的也可能是二维的,也可能是其他的数据结构:整个求解过程就可以用一个最优决策表来描述,最优决策表可以是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解:f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}

 

动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。

举例:

线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;

区域动规:石子合并, 加分二叉树,统计单词个数,炮兵布阵等;

树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等;

背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等;

应用实例:

最短路径问题 ,项目管理,网络流优化等;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值