本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|动态规划的深入讨论东北育才学校李刚【关键字】动态规划、状态【摘要】本文讨论了一种解决问题十分有效的技术——“动态规划”。它较高的解题效率一直受到很大的关注。本文首先对“动态规划”的理论基础进行了讨论。给出了一个用“动态规划”可以解决的问题的两个先决条件:“最优子结构”与“无后效性”。接着,讨论了在实际应用中的两个比较常见的问题:“动态规划”中状态的选定与存储。再通过以上问题的讨论,引出了“动态规划”的基本思维方法:“不做已经做过....的工作”以及“动态规划”技术在解决问题中速度惊人的原因——“解决了查看中的冗余,达到了速度的极限”。最后,阐述了解决“动态规划”问题的一般步骤,即“思考,计划,应用”【正文】一.引论在信息学竞赛中,特别是最近几年,“动态规划”作为一种解题工具,经常被提及。其应用范围愈来愈广,应用程度也愈来愈深。那么,“动态规划”究竟与其它的算法有什么差别?它有什么具体的应用价值呢?本文将对此进行讨论。我们先通过一个具体问题认识一下“动态规划”。本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|〖例1〗:图1中给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。现在,我们想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少?假设:Dis[X]为城市X到E的最短路线的长度;(X表示任意一个城市)Map[I,J]表示I,J两个城市间的距离,若Map[I,J]=0,则两个城市不连通。这个问题我们可以用搜索法来做,程序很容易写出来:VarSe:未访问的城市集合;FunctionLong(Who:当前访问城市):Integer;:求当前访问城市与城市E的最短距离。BeginIfWho=EThenSearch:=0ElseBeginMin:=Maxint;ForI取遍所有城市DoIf(Map[Who,I]0)And(IInSe)ThenBeginSe:=Se-[I];J:=Map[Who,I]+Long(I);Se:=Se+[I];IfJMinThenMin:=J;End;Long:=Min;End;End;BeginSe:=除A外所有城市的集合;本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|[A]:=Long(A);End.这个程序的效率如何呢?我们可以看到,每次除了已经访问过的城市外,其他城市都要访问,所以时间复杂度为)!(NO,这是一个“指数级”的算法,那么,还有没有更好的算法呢?首先,我们来观察一下这个算法。在求从B1到E的最短路径的时候,先求出从C2到E的最短路径;而在求从B2到E的最短路径的时候,又求了一遍从C2到E的最短路径。也就是说,从C2到E的最短路径我们求了两遍。同样可以发现,在求从C1、C2到E的最短路径的过程中,从D1到E的最短路径也被求了两遍。而在整个程序中,从D1到E的最短路径被求了四遍,这是多么大的一个浪费啊!如果在求解的过程中,同时将求得的最短路径的距离“记录在案”,随时调用,那会是多么的方便啊!于是,一个新的思路诞生了,即:由后往前依次推出每个Dis值,直到推出Dis[A]为止。这个思路的确很好,但等等,究竟什么是“由后往前”呢?所谓“后”、“前”是我们自己为城市编的序号,当两个城市I,J的前后顺序定为I“前”J“后”时,必须满足这个条件:或者I,J不连通,或者Dis[I]+Map[I,J]≥Dis[J]。因为如果I,J连通且Dis[I]+Map[I,J]Dis[J],则说明Dis[J]存在更优的情况,可J位于I后,就不可能推出此情况,会影响最后的解。那么,我们如何划分先后次序呢?如图2所示。我用不同颜色给城市分阶段,可以用阶段表示每个城市的次序,因为阶段的划分有如下性质:1:阶段I的取值只与阶段I+1有关,阶段I的取值只对阶段I-1的取值产生影响;2:每个阶段的顺序是确定的,不可以调换任两个阶段顺序;通过这两个性质,可以推出阶段作为“前”、“后”顺序满足刚才提出的条件,所以我们可以用阶段作为每个城市的次序,然后从阶段3倒推至阶段1,再推出Dis[A]。公式:Dis[X]=Min{Dis[Y]:Y是下一个阶段中与X相连通的城市}本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|注:可以把E看成第4个阶段,A看成第0个阶段。程序:Dis[E]=0ForX=阶段3的每个城市Downto阶段0的每个城市DoBeginDis[X]:=Maxint;ForY=阶段X的下一个阶段中的每个城市DoIfDis[Y]+Map[X,Y]Dis[X]ThenDis[X]:=Dis[Y]+Map[X,Y];End。这个程序的时间复杂为)(2NO,比上一个程序的复杂度)!(NO要小得多。第二个算法就是“动态规划”算法。二.动态规划的理论基础通过上面的例子,我们对“动态规划”有了一个初步认识,它所处理的问题是一个“多阶段决策问题”。我们现在对一些概念进行具体定义:状态(State):它表示事物的性质,是描述“动态规划”中的“单元”的量。如例1中的城市A,B1,D2,E都为单个的状态。阶段(Stage):阶段是一些性质相近,可以同时处理....的状态集合。通常,一个问题可以由处理的先后次序划分为几个阶段。如例1中的问题由三个阶段组成,其中阶段1包含状态B1,B2。实际上,阶段只是标识那些处理方法相同、处理顺序无关的状态。一个阶段既可以包含多个状态,也可以只包含一个状态。其关系很类似分子与原子的关系。状态转移方程:是前一个阶段的状态转移到后一个的状态的演变规律,是关于两个相邻阶段状态的方程,是“动态规划”的中心。决策(Decision):每个阶段做出的某种选择性的行动。它是我们程序所需要完成的选择。动态规划所处理的问题是一个“多阶段决策问题”,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图3所示。总体上来说,一个“动态规划”算法应该包含上面提到的几种基本关系与属性。本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|那么,什么样的“决策问题”才可以划分阶段,来用“动态规划”求解呢?我们说一个“决策问题”只有具有以下性质时,才可以考虑划分阶段,用“动态规划”算法:一:最优子结构即一个问题的最优解只取决于其子问题的最优解,也就是说,非最优解对问题的求解没有影响。在例1中,如果我们想求Dis[B1]的最小值,我们只需要知道C1,C2,C3的最小值,而不用考虑其他的路径,因为其他的非最优路径肯定对Dis[B1]的结果没有影响。我们再来看一个问题:〖例2〗有4个点,分别是A、B、C、D,如图4所示,相邻两点用两条连线C2k,C2k-1(1≤k≤3)表示两条通行的道路。连线上方的数字表示道路的长度。我们定义从A到D的所有路径中,长度除以4所得余数最小的路径为最优路径。求一条最优路径。在这个题目中,我们如果还按照刚才的方法来求解就会发生错误。例如,按照例1的思维,A最优取值可以由B的最优取值来确定,而B的最优取值为0,所以A的最优值为2,而实际上,路径C1—C3—C5可得最优值为0,所以,B的最优路径并不是A最优路径的子路径,也就是说,A的最优取值不是由B的最优取值决定的,其不具有最优子结构。由此可见,并不是所有的“决策问题”都可以用“动态规划”来解决。所以,只有当一个问题呈现出最优子结构时,“动态规划”才可能是一个合适的侯选方法。二:无后效性即一个问题被划分阶段后,阶段I中的状态只能由阶段I+1中的状态通过状态转移方程得来,与其他状态没有关系,特别是与未发生的状态没有关系,这就是无后效性。实际上,如果我们把这个问题中的状态定义成图中的顶点,两个状态之间的转移定义为边,转移过程中的权值增量定义为边的权值,则这个问题实际上就是在一个“有向无环加权图”中寻找两个顶点路径的问题。因为无后效性,所以没有环路(否则,无论如何划分阶段,都可以出现后效性)。即这个图可以进行“拓扑排序”,那么,我们至少可以以他们拓扑排序的顺序划分阶段。我们来看一个具体例子:本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|〖例3〗:欧几里德货郎担问题是对平面给定的n个点确定一条连结各点的、闭合的游历路线问题。图5(a)给出了七个点问题的解。Bitonic旅行路线问题是欧几里德货郎担问题的简化,这种旅行路线先从最左边开始,严格地由左至右到最右边的点,然后再严格地由右至左到出发点,求路程最短的路径长度。图5(b)给出了七个点问题的解。这两个问题看起来很相似。但实质上是不同的。为了方便讨论,我将每个顶点标记了号码。由于必然经过最右边的顶点7,所以一条路(P1—P2)可以看成两条路(P1—7)与(P2—7)的结合。所以,这个题目的状态可以用两条道路结合的形式表示。我们可以把这些状态中,两条路中起始顶点相同的状态归于一个阶段,设为阶段[P1,P2]。那么,对于Bitonic旅行路线问题来说,阶段[P1,P2]如果可以由阶段[Q1,Q2]推出,则必须满足的条件就是:P1Q1或P2Q2。例如,阶段[3,4]中的道路可以由阶段[3,5]中的道路加一条边4—5得出,而阶段[3,5]的状态却无法由阶段[3,4]中的状态得出,因为Bitonic旅行路线要求必须严格地由左到右来旅行。所以如果我们已经知道了阶段[3,4]中的状态,则阶段[3,5]中的状态必然已知。因此我们可以说,Bitonic问题满足“无后效性原则”,可以用“动态规划”算法来解决,其程序可以参见Pro_3_1.Pas。对于欧几里德货郎担问题,阶段与阶段之间没有什么必然的“顺序”。如道路{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]对应的关系就如图6所示。我们可以很清晰地看出,这两个阶段的关系是“有后效性”的。因为这个图中存在“环路”。对于这个问题是不能像上一个问题那样来解决的,事实上,这个问题是一个NP完全问题,其解决的时间复杂度很可能是指数级的。所以,对于一个问题能否用“动态规划”来解决的一个十分关键的判断条件就是“它是否有后效性”。而我们在判断这个问题是否有“后效性”时,