动态规划算法解析

时间:2022-05-06 18:43:26

一、多阶段决策过程最优化问题

——动态规划的基本模型

在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。这种把一个问题看做是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策最优化问题。
    【例题1】最短路径问题。图中给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。现在,想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少?

动态规划算法解析

【分析】把从A到E的全过程分成四个阶段,用k表示阶段变量,第1阶段有一个初始状态A,两条可供选择的支路ABl、AB2;第2阶段有两个初始状态B1、 B2,B1有三条可供选择的支路,B2有两条可供选择的支路……。用dk(xk,xk+1)表示在第k阶段由初始状态xk到下阶段的初始状态xk+1的路径距离,Fk(xk)表示从第k阶段的xk到终点E的最短距离,利用倒推方法求解A到E的最短距离。具体计算过程如下:

    S1:K=4,有:F4(D1)=3,F4(D2)=4,F4(D3)=3 

 S2: K=3,有:F3(C1)=min{d3(C1,D1)+F4(D1),d3(C1,D2)+F4(d2)}=min{8,10}=8

F3(C2)=d3(C2,D1)+f4(D1)=5+3=8

F3(C3)=d3(C3,D3)+f4(D3)=8+3=11

F3(C4)=d3(C4,D3)+f4(D3)=3+3=6 

 S3: K=2,有:F2(B1)=min{d2(B1,C1)+F3(C1),d2(B1,C2)+f3(C2),d2(B1,C3)+F3(C3)}=min{9,12,14}=9

F2(m)=min{d2(B2,c2)+f3(C2),d2(B2,C4)+F3(C4)}=min{16,10}=10 

 S4:k=1,有:F1(A)=min{d1(A,B1)+F2(B1),d1(A,B2)+F2(B2)}=min{14,13}=13

     因此由A点到E点的全过程的最短路径为A—>B2一>C4—>D3—>E。最短路程长度为13。
    从以上过程可以看出,每个阶段中,都求出本阶段的各个初始状态到过程终点E的最短路径和最短距离,当逆序倒推到过程起点A时,便得到了全过程的最短路径及最短距离,同时附带得到了一组最优结果(即各阶段的各状态到终点E的最优结果)。

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

根据上例分析和动态规划的基本概念,可以得到动态规划的基本模型如下:
    (1)确定问题的决策对象。
    (2)对决策过程划分阶段。
    (3)对各阶段确定状态变量。
    (4)根据状态变量确定费用函数和目标函数。
    (5)建立各阶段状态变量的转移过程,确定状态转移方程。

 

 

动态规划的基本知识

动态规划是研究一类最优化问题的方法,在经济、工程技术、企业管理、工农业生产及军事等领域中都有广泛的应用。近年来,在ACM/ICPC中,使用动态规划(或部分应用动态规划思维)求解的题不仅常见,而且形式也多种多样。而在与此相近的各类信息学竞赛中,应用动态规划解题已经成为一种趋势,这和动态规划的优势不无关系。

   1、动态规划的常用名词

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

   (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所有可行的取值})

   2、最优化原理

   1951年美国数学家R.Bellman等人,根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。一些静态模型,只要人为地引进“时间”因素,分成时段,就可以转化成多阶段的动态模型,用动态规划方法去处理。与此同时,他提出了解决这类问题的“最优化原理”(Principleof optimality):

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

   这个“最优化原理”如果用数学化一点的语言来描述的话,就是:假设为了解决某一优化问题,需要依次作出n个决策D1,D2,…,Dn,如若这个决策序列是最优的,对于任何一个整数k,1< k <n,不论前面k个决策是怎样的,以后的最优决策只取决于由前面决策所确定的当前状态,即以后的决策Dk+1,Dk+2,…,Dn也是最优的。

   最优化原理是动态规划的基础。任何一个问题,如果失去了这个最优化原理的支持,就不可能用动态规划方法计算。

   3、什么是动态规划

   动态规划是运筹学的一个分支。与其说动态规划是一种算法,不如说是一种思维方法来得更贴切。因为动态规划没有固定的框架,即便是应用到同一道题上,也可以建立多种形式的求解算法。许多隐式图上的算法,例如求单源最短路径的Dijkstra算法、广度优先搜索算法,都渗透着动态规划的思想。还有许多数学问题,表面上看起来与动态规划风马牛不相及,但是其求解思想与动态规划是完全一致的。

   因此,动态规划不像深度或广度优先那样可以提供一套模式,需要的时候,取来就可以使用;它必须对具体问题进行具体分析处理,需要丰富的想象力去建立模型,需要创造性的思想去求解。

   4、动态规划适于解决什么样的问题

   准确地说,动态规划不是万能的,它只适于解决一定条件的最优策略问题。

   或许,大家听到这个结论会很失望:其实,这个结论并没有削减动态规划的光辉,因为属于上面范围内的问题极多,还有许多看似不是这个范围中的问题都可以转化成这类问题。

   上面所说的“满足一定条件”主要指下面两点:

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

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

   所谓的无后效性是指:“过去的决策只能通过当前状态影响未来的发展,当前的状态是对以往决策的总结”。

   这条特征说明什么呢?它说明动态规划适于解决当前决策和过去状态无关的问题。状态,出现在策略的任何一个位置,它的地位都是相同的,都可以实施同样的决策。这就是无后效性的内涵。 

   5、用动态规划解题的好处

   说了这么多的动态规划,它到底给我们解题能带来什么好处呢?

   其实动态规划的最大优势在于它具有极高的效率,而且动态规划还有其他的优势,例如:动态规划可以得出一系列解,算法清晰简便,程序易编、易调,等等。

 

 

 

三、最优化原理与无后效性

 

上面已经介绍了动态规划模型的基本组成,现在需要解决的问题是:什么样的“多阶段决策问题”才可以采用动态规划的方法求解?

   一般来说,能够采用动态规划方法求解的问题必须满足.最优化原理和.无后效性原则。

 

(1)动态规划的最优化原理。作为整个过程的最优策略具有如下性质:无论过去的状态和决策如何,对前面的决策所形成的当前状态而言,余下的诸决策必须构成最优策略。

   可以通俗地理解为子问题的局部最优将导致整个问题的全局最优,即问题具有最优子结构的性质,也就是说一个问题的最优解只取决于其子问题的最优解,非最优解对问题的求解没有影响。在例题1最短路径问题中,A到E的最优路径上的任一点到终点E的路径也必然是该点到终点E的一条最优路径,满足最优化原理。下面来讨论另外一个问题。

【例题2】余数最少的路径。    

如图所示,有4个点,分别是A、B、C、D,相邻两点用两条连线C2k,C2k-1(1≤k≤3)表示两条通行的道路。连线上的数字表示道路的长度。定义从A到D的所有路径中,长度除以4所得余数最小的路径为最优路径。

    求一条最优路径。动态规划算法解析 

【分析】在这个问题中,如果还按照例题1中的方法去求解就会发生错误。按照例题1的思想,A的最优取值可以由B的最优取值来确定,而B的最优取值为(1+3)mod 4 = 0,所以A的最优值应为2,而实际上,路径C1-C3-C5可得最优值为(2+1+1) mod 4 =0,所以,B的最优路径并不是A的最优路径的子路径,也就是说,A的最优取值不是由B的最优取值决定的,即其不满足最优化原理,问题不具有最优子结构的性质。

   由此可见,并不是所有的“决策问题”都可以用“动态规划”来解决,运用“动态规划”来处理问题必须满足最优化原理。

 

(2)动态规划的无后效性原则。所谓无后效性原则,指的是这样一种性质:某阶段的状态一旦确定,则此后过程的演变不再受此前各状态及决策的影响。也就是说,“未来与过去无关”,当前的状态是此前历史的一个完整总结,此前的历史只能通过当前的状态去影响过程未来的演变。具体地说,如果一个问题被划分各个阶段之后,阶段I 中的状态只能由阶段 I+1中的状态通过状态转移方程得来,与其他状态没有关系,特别是与未发生的状态没有关系,这就是无后效性。从图论的角度去考虑,如果把这个问题中的状态定义成图中的顶点,两个状态之间的转移定义为边,转移过程中的权值增量定义为边的权值,则构成一个有向无环加权图,因此,这个图可以进行“拓扑排序”,至少可以按他们拓扑排序的顺序去划分阶段。

   看一看下面的两个具体例子。

【例题3】货郎担问题。对于平面给定的n个点,编程确定一条连结各点的、闭合的游历路线问题。图中给出了7个点的情况问题的解。

【例题4】旅行路线问题。在货郎担问题的基础上,若规定这种游历路线先从最左边开始,严格地由左至右到最右边的点,然后再严格地由右至左到出发点,求整个路程最短的路径长度。图中给出了7个点问题的解。

动态规划算法解析例3图 货郎担问题 动态规划算法解析例4图 旅行路线图

 

【分析】这两个问题看起来很非常相似,但本质上是完全不同的。为了方便讨论,可以将每个顶点标记号码。由于必然经过最右边的顶点7,所以一条路(P1-P2)可以看做两条路(P1-7)与(P2-7)的结合。因此,这个题目的状态可以用两条道路结合的形式表示。可以把这些状态中,两条路中起始顶点相同的状态归于一个阶段,设为阶段[P1,P2]。

   那么,对于旅行路线问题来说,阶段[P1,P2]如果可以由阶段[Q1,Q2]推出,则必须满足的条件就是:Pl< Q1或P2 <Q2。例如,阶段[3,4]中的道路可以由阶段[3,5]中的道路加一条边4—5得出,而阶段[3,5]的状态却无法由阶段[3,4]中的状态得出,因为在旅行路线问题的要求中必须严格地由左到右来旅行。所以如果已经知道了阶段[3,4]中的状态,则阶段[3,5]中的状态必然已知,因此,问题满足无后效性原则,可以考虑用动态规划方法求解。   

而对于货郎担问题,阶段与阶段之间没有什么必然的“顺序”。如道路{3—2—5—7,4—6—7}属于阶段[3,4],可由属于阶段[2,4]的道路{2—5—7,4—6—7}推出;而道路{2—3—6—7,4—5—7}属于阶段[2,4],可由属于阶段[3,4]的道路{3—6—7,4—5—7}推出。如果以顶点表示阶段,推出关系表示边,那么,阶段[3,4]与阶段[2,4]对应的关系就如图右所示。可以很清晰地看出,这两个阶段的关系是“有后效性”的。因为这个图中存在“环路”。对于这个问题是不能像上一个问题那样来解决的。 动态规划算法解析阶段关系图、

 

 

 

 

四、动态规划设计方法的一般模式

 

动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图所示。动态规划的设计都有着一定的模式,一般要经历以下几个步骤。

┌───┐┌───┐┌───┐

初始状态→│决策1│→│决策2│→…→│决策n│→结束状态

└───┘└───┘└───┘

     图1动态规划决策过程示意图    

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

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

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

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

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

   根据上述动态规划设计的步骤,可得到大体解题框架如图2所示。

动态规划算法解析
    图2动态规划设计的一般模式

   上述提供了动态规划方法的一般模式,对于简单的动态规划问题,可以按部就班地进行动态规划的设计。

   下面,给出一个利用动态规划方法求解的典型例子。 

   【例题6】数字三角形问题。图3示出了一个数字三角形宝塔。数字三角形中的数字为不超过100的整数。现规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。

  任务一:假设三角形行数≤10,键盘输入一个确定的整数值M,编程确定是否存在一条路径,使得沿着该路径所经过的数字的总和恰为M,若存在则给出所有路径,若不存在,则输出“NOAnswer!”字样。

   任务二:假设三角形行数≤100,编程求解从最顶层走到最底层的一条路径,使得沿着该路径所经过的数字的总和最大,输出最大值。

   输人数据:由文件输入数据,任务一中文件第一行是三角形的行数N和整数值M。以后的N行分别是从最顶层到最底层的每一层中的数字。任务二中文件数据格式同任务一,只是第一行中没有整数值M。在例子中任务二的文件数据表示如下:

 

                输入:5

     7           输出:

    3 8      7            输出路径和最大值

   8 1 0     38          或“No Answer!”字样。

  2 7 7 4    810

 4 5 2 6 5   2744

图3  数字三角形45265   

【分析】对于这一问题,很容易想到用枚举的方法去解决,即列举出所有路径并记录每一条路径所经过的数字总和。然后判断数字总和是否等于给定的整数值M或寻找出最大的数字总和,这一想法很直观,而且对于任务一,由于数字三角形的行数不大(<=10),因此其枚举量不是很大,应该能够实现。但对于任务二,如果用枚举的方法,当三角形的行数等于100时,其枚举量之大是可想而知的,显然,枚举法对于任务二的求解并不适用。其实,只要对对任务二稍加分析,就可以得出一个结论:

   如果得到一条由顶至底的某处的一条最佳路径,那么对于该路径上的每一个中间点来说,由顶至该中间点的路径所经过的数字和也为最大。因此该问题是一个典型的多阶段决策最优化的问题。算法设计与分析如下:

   对于任务一,合理地确认枚举的方法,可以优化问题的解法。由于从塔顶到底层每次都只有两种走法,即左或右。设“0”表示左, “1”表示右,对于层数为N的数字塔,从顶到底的一种走法可用一个N-1位的二进制数表示。如例中二进制数字串1011,其对应的路径应该是:8—1—4—6。这样就可以用一个N—l位的二进制数来模拟走法和确定解的范围。穷举出从0到2n-1个十进制数所对应的N-1位二进制串对应的路径中的数字总和,判定其是否等于M而求得问题的解。

   对于任务二,采用动态规划中的顺推解法。按三角形的行划分阶段,若行数为n,则可把问题看做一个n-1个阶段的决策问题。从始点出发,依顺向求出第一阶段、第二阶段……第n—1阶段中各决策点至始点的最佳路径,最终求出始点到终点的最佳路径。

   设:fk(Uk)为从第k阶段中的点Uk至三角形顶点有一条最佳路径,该路径所经过的数字的总和最大,fk(Uk)表示为这个数字和;

   由于每一次决策有两个选择,或沿左斜线向下,或沿右斜线向下,因此设:

   Uk1为k-1阶段中某点Uk沿左斜线向下的点;

   Uk2为k-1阶段中某点Uk沿右斜线向下的点;

   dk(Uk1)为k阶段中Uk1的数字;dk(Uk2)为k阶段中Uk2的数字。

   因而可写出顺推关系式(状态转移方程)为:

   fk(Uk)=max{fk-1(Uk)+dk(Uk1),fk-1(Uk)+dk(Uk2)}(k=1,2,3,…,n)

   f0(U0)=0

   经过一次顺推,便可分别求出由顶至底N个数的N条路径,在这N条路径所经过的N个数字和中,最大值即为正确答案。

 

 

http://apps.hi.baidu.com/share/detail/30927878

http://blog.csdn.net/penzo/archive/2010/11/06/5992383.aspx