资源描述
算法设计与分析算法设计与分析第六章第六章 动态规划法动态规划法6.1 概概 述述 6.2 图问题中的动态规划法图问题中的动态规划法6.3 组合问题中的动态规划法组合问题中的动态规划法6.4 查找问题中的动态规划法查找问题中的动态规划法历史及研究问题历史及研究问题动态规划是运筹学的一个分支,动态规划是运筹学的一个分支,20世纪世纪50年代初美国年代初美国数学家数学家R.E.Bellman等人在研究多阶段决策过程的优化等人在研究多阶段决策过程的优化问题时,提出了著名的最优性原理,把多阶段过程转化问题时,提出了著名的最优性原理,把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法优化问题的新方法动态规划。动态规划。多阶段决策问题:求解的问题可以划分为一系列相互多阶段决策问题:求解的问题可以划分为一系列相互联系的阶段,在每个阶段都需要做出决策,且一个阶段联系的阶段,在每个阶段都需要做出决策,且一个阶段决策的选择会影响下一个阶段的决策,从而影响整个过决策的选择会影响下一个阶段的决策,从而影响整个过程的活动路线,求解的目标是选择各个阶段的决策是整程的活动路线,求解的目标是选择各个阶段的决策是整个过程达到最优。个过程达到最优。动态规划主要用于求解以时间划分阶段的动态过程的动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),可以人为地引进时间因素,把它视划、非线性规划),可以人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。为多阶段决策过程,也可以用动态规划方法方便地求解。动态规划是考察问题的一种途径,或是求解某类问题动态规划是考察问题的一种途径,或是求解某类问题的一种方法。的一种方法。动态规划问世以来,在经济管理、生产调度、工程技动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比其它方法求解更为方便。用动态规划方法比其它方法求解更为方便。6.1 概概 述述 6.1.1最优化问题最优化问题6.1.2最优性原理最优性原理6.1.3动态规划法的设计思想动态规划法的设计思想付付款款问问题题:超超市市的的自自动动柜柜员员机机(POS机机)要要找找给给顾顾客客数数量量最最少少的的现现金金。例例如如,要要找找4元元6角角现现金金,如如果果POS机机送送出出一一大大堆堆硬硬币币,比比如如46个个1角角钱钱,就就让让人人笑笑话话了了,而最好找而最好找2个个2元、元、1个个5角和角和1个个1角。角。假假定定POS机机中中有有n张张面面值值为为pi(1in)的的货货币币,用用集集合合P=p1,p2,pn表表示示,如如果果POS机机需需支支付付的的现现金金为为A,那那么,它必须从么,它必须从P中选取一个最小子集中选取一个最小子集S,使得,使得(式(式6.1)如果用向量如果用向量X=(x1,x2,xn)表示表示S中所选取的货币,中所选取的货币,则则(式(式6.2)6.1.1最优化问题最优化问题那么,那么,POS机支付的现金必须满足机支付的现金必须满足 (式(式6.3)集合集合P是该问题的输入,满足式是该问题的输入,满足式6.1的解称为可行解,式的解称为可行解,式6.2是解的表现形式,因为向量是解的表现形式,因为向量X中有中有n个元素,每个元个元素,每个元素的取值为素的取值为0或或1,所以,可以有,所以,可以有2n个不同的向量,所有个不同的向量,所有这些向量的全体构成该问题的解空间,式这些向量的全体构成该问题的解空间,式6.3是该问题是该问题的约束条件,式的约束条件,式6.4是该问题的目标函数,使式是该问题的目标函数,使式6.4取得取得极小值的解称为该问题的最优解。极小值的解称为该问题的最优解。并且并且 (式(式6.4)该问题有该问题有n个输入,它的解由这个输入,它的解由这n个输入的一个子集组成,个输入的一个子集组成,这个子集必须满足某些事先给定的条件,这些条件称为这个子集必须满足某些事先给定的条件,这些条件称为约束条件约束条件,满足约束条件的解称为问题的,满足约束条件的解称为问题的可行解可行解。满足。满足约束条件的可行解可能不只一个,为了衡量这些可行解约束条件的可行解可能不只一个,为了衡量这些可行解的优劣,事先给出一定的标准,这些标准通常以函数的的优劣,事先给出一定的标准,这些标准通常以函数的形式给出,这些标准函数称为形式给出,这些标准函数称为目标函数目标函数,使目标函数取,使目标函数取得极值(极大或极小)的可行解称为最优解,这类问题得极值(极大或极小)的可行解称为最优解,这类问题就称为就称为最优化问题最优化问题。6.1.2最优性原理最优性原理基本概念:基本概念:状态:表示每个阶段开始时,问题或系统所处的客观状态:表示每个阶段开始时,问题或系统所处的客观状况。状态既是该阶段的某个起点,又是前一个阶段的状况。状态既是该阶段的某个起点,又是前一个阶段的某个终点。通常一个阶段有若干个状态。某个终点。通常一个阶段有若干个状态。状态无后效性:如果某个阶段状态给定后,则该阶段状态无后效性:如果某个阶段状态给定后,则该阶段以后过程的发展不受该阶段以前各阶段状态的影响,也以后过程的发展不受该阶段以前各阶段状态的影响,也就是说状态具有马尔科夫性。就是说状态具有马尔科夫性。适于动态规划法求解的问题具有状态的无后效性适于动态规划法求解的问题具有状态的无后效性 策略:各个阶段决策确定后,就组成了一个决策序列,策略:各个阶段决策确定后,就组成了一个决策序列,该序列称之为一个策略。由某个阶段开始到终止阶段的该序列称之为一个策略。由某个阶段开始到终止阶段的过程称为子过程,其对应的某个策略称为子策略。过程称为子过程,其对应的某个策略称为子策略。6.1.2最优性原理最优性原理对对于于一一个个具具有有n个个输输入入的的最最优优化化问问题题,其其求求解解过过程程往往往往可可以以划划分分为为若若干干个个阶阶段段,每每一一阶阶段段的的决决策策仅仅依依赖赖于于前前一一阶阶段段的的状状态态,由由决决策策所所采采取取的的动动作作使使状状态态发发生生转转移移,成成为为下下一一阶阶段段决决策策的的依依据据。如如图图6.16.1所所示示,S S0 0是是初初始始状状态态,依依据据此此状状态态作作出出决决策策P P1 1,按按照照P P1 1所所采采取取的的动动作作,使使状状态态转转换换为为S S1 1,依依据据状状态态S S1 1作作出出决决策策P P2 2,按按照照P P2 2所所采采取取的的动动作作,使使状状态态S S1 1转转换换为为S S2 2,经经过过一一系系列列的的决决策策和和状状态态转转换换,到到达达最最终终状状态态S Sn n,从从而而,一一个个决决策策序序列列在在不不断断变变化化的的状状态态中中产产生生。这这个个决决策策序序列列产产生生的的过程称为多阶段决策过程。过程称为多阶段决策过程。S0P1P2Pn图图6.1多阶段决策过程多阶段决策过程S1S2Sn-1Sn最优性原理最优性原理(Optimal Principle):无论决策过程的初始状态和):无论决策过程的初始状态和初始决策是什么,其余的决策都必须相对于初始决策所产生的当前初始决策是什么,其余的决策都必须相对于初始决策所产生的当前状态,构成一个最优决策序列。换言之,在多阶段决策中,各子问状态,构成一个最优决策序列。换言之,在多阶段决策中,各子问题的解只与它前面的子问题的解相关,而且各子问题的解都是相对题的解只与它前面的子问题的解相关,而且各子问题的解都是相对于当前状态的最优解,整个问题的最优解是由各个子问题的最优解于当前状态的最优解,整个问题的最优解是由各个子问题的最优解构成。如果一个问题满足最优性原理通常称此问题具有构成。如果一个问题满足最优性原理通常称此问题具有最优子结构最优子结构性质。性质。最优性原理最优性原理u无论过程的初始状态和初始决策是什么,其余的决无论过程的初始状态和初始决策是什么,其余的决策都必须相对于初始决策所产生的状态构成一个最优策都必须相对于初始决策所产生的状态构成一个最优决策序列。决策序列。u原理告诉我们,一个最优问题的任何实例的最优解原理告诉我们,一个最优问题的任何实例的最优解是由该实例的子实例的最优解组成。是由该实例的子实例的最优解组成。u一般来说,如果所求解问题对于最优性原理成立,一般来说,如果所求解问题对于最优性原理成立,则说明用动态规划方法有可能解决该问题。而解决问则说明用动态规划方法有可能解决该问题。而解决问题的关键在于获取各阶段问的递推关系式。题的关键在于获取各阶段问的递推关系式。6.1.3动态规划法的设计思想动态规划法的设计思想动态规划法将待求解问题分解成若干个相互重叠的子问动态规划法将待求解问题分解成若干个相互重叠的子问题,每个子问题对应决策过程的一个阶段,一般来说,题,每个子问题对应决策过程的一个阶段,一般来说,子问题的重叠关系表现在对给定问题求解的递推关系子问题的重叠关系表现在对给定问题求解的递推关系(也就是动态规划函数)中,将子问题的解求解一次并(也就是动态规划函数)中,将子问题的解求解一次并填入表中,当需要再次求解此子问题时,可以通过查表填入表中,当需要再次求解此子问题时,可以通过查表获得该子问题的解而不用再次求解,从而避免了大量重获得该子问题的解而不用再次求解,从而避免了大量重复计算。为了达到这个目的,可以用一个表来记录所有复计算。为了达到这个目的,可以用一个表来记录所有已解决的子问题的解,这就是动态规划法的设计思想。已解决的子问题的解,这就是动态规划法的设计思想。具体的动态规划法是多种多样的,但他们具有相同的填具体的动态规划法是多种多样的,但他们具有相同的填表形式。表形式。原问题的解原问题的解原问题原问题图图6.3动态规划法的求解过程动态规划法的求解过程填填表表子问题子问题1子问题子问题2子问题子问题n划分阶段:划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。按照问题的时间或空间特征,把问题分为若干个阶段。选择状态:选择状态:将问题发展到各个阶段时所处于的各种客观情况用不同将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。的状态表示出来。确定决策并写出状态转移方程:确定决策并写出状态转移方程:状态转移就是根据上一阶段的状态和决策来导出本阶段状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。的状态。写出规划方程(包括边界条件):写出规划方程(包括边界条件):动态规划的基本方程是规划方程的通用形式化表达式。动态规划的基本方程是规划方程的通用形式化表达式。动态规划算法的基本步骤动态规划算法的基本步骤可以用动态规划法求解的问题除了能够分解为相互重叠的可以用动态规划法求解的问题除了能够分解为相互重叠的若干子问题外,还要满足最优性原理(也称最优子结构性若干子问题外,还要满足最优性原理(也称最优子结构性质),这类问题具有如下特征:该问题的最优解中也包含质),这类问题具有如下特征:该问题的最优解中也包含着其子问题的最优解。在分析问题是否满足最优性原理时,着其子问题的最优解。在分析问题是否满足最优性原理时,通常先假设由问题的最优解导出的子问题的解不是最优的,通常先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。好的解,从而导致矛盾。动动态态规规划划法法利利用用问问题题的的最最优优性性原原理理,以以自自底底向向上上的的方方式式从从子子问问题题的的最最优优解解逐逐步步构构造造出出整整个个问问题题的的最最优优解解。应应用用动态规划法设计算法一般分成三个阶段:动态规划法设计算法一般分成三个阶段:(1 1)分段:将原问题分解为若干个相互重叠的子问题;)分段:将原问题分解为若干个相互重叠的子问题;(2 2)分分析析:分分析析问问题题是是否否满满足足最最优优性性原原理理,找找出出动动态态规规划划函数的递推式;函数的递推式;(3 3)求解:利用递推式自底向上计算,实现动态规划过程。)求解:利用递推式自底向上计算,实现动态规划过程。6.2图问题中的动态规划法图问题中的动态规划法6.2.1TSP问题问题6.2.2多段图的最短路径问题多段图的最短路径问题6.2.1TSP问题问题TSP问题是指旅行家要旅行是指旅行家要旅行n个城市,要个城市,要求各个城市求各个城市经历且且仅经历一次然后回到一次然后回到出出发城市,并要求所走的路程最短。城市,并要求所走的路程最短。各个城市各个城市间的距离可以用代价矩的距离可以用代价矩阵来表来表示,如果示,如果(i,j)E,则cij。假设从顶点假设从顶点i出发,令出发,令d(i,V)表示从顶点表示从顶点i出发经过出发经过V中各个顶点一次且仅一次,最后回到出发点中各个顶点一次且仅一次,最后回到出发点i的最短路的最短路径长度,开始时,径长度,开始时,VVi,于是,于是,TSP问题的动问题的动态规划函数为:态规划函数为:d(i,V)=mincik+d(k,Vk)(kV)(式(式6.5)d(k,)=cki(ki)(式(式6.6)从城市从城市0出发,经城市出发,经城市1、2、3然后回到城市然后回到城市0的最短路的最短路径长度是:径长度是:d(0,1,2,3)=minc01+d(1,2,3),c02+d(2,1,3),c03+d(3,1,2)这这是是最最后后一一个个阶阶段段的的决决策策,它它必必须须依依据据d(1,2,3)、d(2,1,3)和和d(3,1,2)的计算结果,而:的计算结果,而:d(1,2,3)=minc12+d(2,3),c13+d(3,2)d(2,1,3)=minc21+d(1,3),c23+d(3,1)d(3,1,2)=minc31+d(1,2),c32+d(2,1)这一阶段的决策又依赖于下面的计算结果:这一阶段的决策又依赖于下面的计算结果:d(1,2)=c12+d(2,)d(2,3)=c23+d(3,)d(3,2)=c32+d(2,)d(1,3)=c13+d(3,)d(2,1)=c21+d(1,)d(3,1)=c31+d(1,)而而下下式式可可以以直直接接获获得得(括括号号中中是是该该决决策策引引起起的的状状态态转转移移):d(1,)=c10=5(10)d(2,)=c20=6(20)d(3,)=c30=3(30)再向前推导,有:再向前推导,有:d(1,2)=c12+d(2,)=2+6=8(12)d(1,3)=c13+d(3,)=3+3=6(13)d(2,3)=c23+d(3,)=2+3=5(23)d(2,1)=c21+d(1,)=4+5=9(21)d(3,1)=c31+d(1,)=7+5=12(31)d(3,2)=c32+d(2,)=5+6=11(32)再向推导,有:再向推导,有:d(1,2,3)=minc12+d(2,3),c13+d(3,2)=min2+5,3+11=7(12)d(2,1,3)=minc21+d(1,3),c23+d(3,1)=min4+6,2+12=10(21)d(3,1,2)=minc31+d(1,2),c32+d(2,1)=min7+8,5+9=14(32)最后有:最后有:d(0,1,2,3)=minc01+d(1,2,3),c02+d(2,1,3),c03+d(3,1,2)=min3+7,6+10,7+14=10(01)从从顶顶点点0出出发发的的TSP问问题题的的最最短短路路径径长长度度为为10,路路径径是是01230。假设对假设对n n个顶点分别用个顶点分别用0 0n-1n-1的数字编号,考虑从顶点的数字编号,考虑从顶点0 0出发求解出发求解TSPTSP问题的填表形式。首先,按个数为问题的填表形式。首先,按个数为1 1、2 2、n-1n-1的顺序生成的顺序生成1 1n-1n-1个元素的子集存放在数组个元素的子集存放在数组V2n-1V2n-1中,例如当中,例如当n=4n=4时,时,V1=1,V2=2,V3=3,V4=1,2,V5=1,3,V1=1,V2=2,V3=3,V4=1,2,V5=1,3,V6=2,3,V7=1,2,3V6=2,3,V7=1,2,3。设数组。设数组dn2n-1存放迭代结果,存放迭代结果,其中其中dij表示从顶点表示从顶点i经过子集经过子集Vj中的顶点一次且仅一次,最后中的顶点一次且仅一次,最后回到出发点回到出发点0的最短路径长度。首先,根据式的最短路径长度。首先,根据式6.6将数组将数组d的第的第0列初列初始化,然后根据式始化,然后根据式6.5逐列计算,其填表过程如图所示。逐列计算,其填表过程如图所示。ji1231,21,32,31,2,30101586726951033121114图6.7动态规划法的填表过程设顶点之间的代价存放在数组cnn中,动态规划法求解TSP问题的算法如下:算法算法6.1TSP问题问题1for(i=1;in;i+)/初始化第初始化第0列列di0=ci0;2for(j=1;j2n-1-1;j+)for(i=1;i=0;i-)2.1对顶点对顶点i的每一个邻接点的每一个邻接点j,根据式,根据式6.7计算计算costi;2.2根据式根据式6.8计算计算pathi;3输出最短路径长度输出最短路径长度cost0;4.输出最短路径经过的顶点:输出最短路径经过的顶点:4.1i=04.2循环直到循环直到pathi=n-14.2.1输出输出pathi;4.2.2i=pathi;动态规划法求解多段图的最短路径问题的算法动态规划法求解多段图的最短路径问题的算法6.3 6.3 组合问题中的动态规划法组合问题中的动态规划法 6.3.1 0/16.3.1 0/1背包问题背包问题 6.3.2 6.3.2 最长公共子序列问题最长公共子序列问题6.3.10/1背包问题背包问题给给定定n种种物物品品和和一一个个背背包包,物物品品i的的重重量量是是wi,其其价价值值为为vi,背背包包的的容容量量为为C。背背包包问问题题是是如如何何选选择择装装入入背背包包的的物物品品,使使得得装装入入背背包包中中物物品品的的总总价价值值最最大大?如如果果在在选选择择装装入入背背包包的的物物品品时时,对对每每种种物物品品i只只有有两两种种选选择择:装装入入背背包包或或不不装装入入背背包包,即即不不能能将将物物品品i装装入入背背包包多多次次,也也不不能能只只装装入入物物品品i的的一一部部分分,则则称称为为0/1背包问题。背包问题。在在0/1背背包包问问题题中中,物物品品i或或者者被被装装入入背背包包,或或者者不不被被装装入入背背包包,设设xi表表示示物物品品i装装入入背背包包的的情情况况,则则当当xi=0时时,表表示示物物品品i没没有有被被装装入入背背包包,xi=1时时,表表示示物物品品i被被装装入入背背包包。根根据据问问题题的的要要求求,有有如如下下约约束束条条件件和和目标函数:目标函数:(式(式6.9)(式(式6.10)问问题题归归结结为为寻寻找找一一个个满满足足约约束束条条件件式式6.9,并并使使目目标函数式标函数式6.10达到最大的解向量达到最大的解向量X=(x1,x2,xn)。首先证明首先证明0/1背包问题满足最优性原理。背包问题满足最优性原理。设设(x1,x2,xn)是是所所给给0/1背背包包问问题题的的一一个个最最优优解解,则则(x2,xn)是下面一个子问题的最优解:是下面一个子问题的最优解:如若不然,设如若不然,设(y2,yn)是上述子问题的一个最优解,是上述子问题的一个最优解,则则 ,且,且 。因此,。因此,这说明,这说明(x1,y2,yn)是所给是所给0/1背包问题比背包问题比(x1,x2,xn)更优的解,从而导致矛盾。更优的解,从而导致矛盾。0/1背包问题可以看作是决策一个序列背包问题可以看作是决策一个序列(x1,x2,xn),对,对任一变量任一变量xi的决策是决定的决策是决定xi=1还是还是xi=0。在对。在对xi-1决策后,决策后,已确定了已确定了(x1,xi-1),在决策,在决策xi时,问题处于下列两种状时,问题处于下列两种状态之一:态之一:a.背包容量不足以装入物品背包容量不足以装入物品i,则,则xi=0背包不增加价值;背包不增加价值;b.背包容量可以装入物品背包容量可以装入物品i,则,则xi=1背包的价值增加了背包的价值增加了vi。这这两两种种情情况况下下背背包包价价值值的的最最大大者者应应该该是是对对xi决决策策后后的的背背包包价价值值。令令V(i,j)表表示示在在前前i(1in)个个物物品品中中能能够够装装入入容容量量为为j(1jC)的的背背包包中中的的物物品品的的最最大大值值,则则可可以以得得到到如如下下动态规划函数:动态规划函数:V(i,0)=V(0,j)=0(式(式6.11)式式6.11表明:把前面表明:把前面i个物品装入容量为个物品装入容量为0的背包和把的背包和把0个物品装个物品装入容量为入容量为j的背包,得到的价值均为的背包,得到的价值均为0。式。式6.12的第一个式子表的第一个式子表明:如果第明:如果第i个物品的重量大于背包的容量,则装入前个物品的重量大于背包的容量,则装入前i个物品个物品得到的最大价值和装入前得到的最大价值和装入前i-1个物品得到的最大价值是相同的,个物品得到的最大价值是相同的,即物品即物品i不能装入背包;第二个式子表明:如果第不能装入背包;第二个式子表明:如果第i个物品的重个物品的重量小于背包的容量,则会有以下两种情况:(量小于背包的容量,则会有以下两种情况:(1)如果把第)如果把第i个个物品装入背包,则背包中物品的价值等于把前物品装入背包,则背包中物品的价值等于把前i-1个物品装入容个物品装入容量为量为j-wi的背包中的价值加上第的背包中的价值加上第i个物品的价值个物品的价值vi;(;(2)如果第)如果第i个物品没有装入背包,则背包中物品的价值就等于把前个物品没有装入背包,则背包中物品的价值就等于把前i-1个物个物品装入容量为品装入容量为j的背包中所取得的价值。显然,取二者中价值较的背包中所取得的价值。显然,取二者中价值较大者作为把前大者作为把前i个物品装入容量为个物品装入容量为j的背包中的最优解。的背包中的最优解。第一阶段第一阶段,只装入前,只装入前1个物品,确定在各种情况下的背包能够得个物品,确定在各种情况下的背包能够得到的最大价值;到的最大价值;第二阶段第二阶段,只装入前,只装入前2个物品,确定在各种情况下的背包能够得个物品,确定在各种情况下的背包能够得到的最大价值;依此类推,直到第到的最大价值;依此类推,直到第n个阶段。个阶段。最后最后,V(n,C)便是在容量为便是在容量为C的背包中装入的背包中装入n个物品时取得的最大个物品时取得的最大价值。为了确定装入背包的具体物品,从价值。为了确定装入背包的具体物品,从V(n,C)的值向前推,如的值向前推,如果果V(n,C)V(n-1,C),表明第,表明第n个物品被装入背包,前个物品被装入背包,前n-1个物品被个物品被装入容量为装入容量为C-wn的背包中;否则,第的背包中;否则,第n个物品没有被装入背包,个物品没有被装入背包,前前n-1个物品被装入容量为个物品被装入容量为C的背包中。依此类推,直到确定第的背包中。依此类推,直到确定第1个物品是否被装入背包中为止。由此,得到如下函数:个物品是否被装入背包中为止。由此,得到如下函数:例如,有例如,有5个物品,其重量分别是个物品,其重量分别是2,2,6,5,4,价值,价值分别为分别为6,3,5,4,6,背包的容量为,背包的容量为10,求装入背包的,求装入背包的物品和获得的最大价值。物品和获得的最大价值。根据动态规划函数,用一个根据动态规划函数,用一个(n+1)(C+1)的二维表的二维表V,Vij表示把前表示把前i个物品装入容量为个物品装入容量为j的背包中获得的最大价值,根的背包中获得的最大价值,根据式据式6.11把表的第把表的第0行和第行和第0列初始化为列初始化为0,然后一行一行地,然后一行一行地计算计算Vij,如图,如图6.9所示。所示。图6.90/1背包求解(填表)过程x5=1x4=0 x3=0 x2=1x1=10123456789 1000000000000w1=2v1=6100666666666w2=2v2=3200669999999w3=6v3=5300669999111114w4=5v4=44006699910111314w5=5v5=6500669912 12151515可可以以看看到到,装装入入背背包包的的物物品品的的最最大大价价值值是是15,根根据据式式6.13,装入背包的物品为,装入背包的物品为X=1,1,0,0,1。设设n个个物物品品的的重重量量存存储储在在数数组组wn中中,价价值值存存储储在在数数组组vn中中,背背包包容容量量为为C,数数组组Vn+1C+1存存放放迭迭代代结结果果,其其中中Vij表表示示前前i个个物物品品装装入入容容量量为为j的的背背包包中中获获得得的的最最大大价价值值,数数组组xn存存储储装装入入背背包包的的物物品品,动动态态规规划法求解划法求解0/1背包问题的算法如下:背包问题的算法如下:算法算法6.30/1背包问题背包问题intKnapSack(intn,intw,intv)for(i=0;i=n;i+)/初始化第初始化第0列列Vi0=0;for(j=0;j=C;j+)/初始化第初始化第0行行V0j=0;for(i=1;i=n;i+)/计算第计算第i行,进行第行,进行第i次迭代次迭代for(j=1;j=C;j+)if(j0;i-)if(VijVi-1j)xi=1;j=j-wi;elsexi=0;returnVnC;/返回背包取得的最大价值返回背包取得的最大价值6.3.2最长公共子序列问题最长公共子序列问题对对给给定定序序列列X=(x1,x2,xm)和和序序列列Z=(z1,z2,zk),Z是是X的的子子序序列列当当且且仅仅当当存存在在一一个个严严格格递递增增下下标标序序列列(i1,i2,ik),使使得得对对于于所所有有j=1,2,k,有有zj=xij(1ijm)。例例如如,对对于于序序列列X=(a,b,c,b,d,a,b),序序列列(b,c,d,b)是是X的的一一个个长长度度为为4的的子子序序列列,相相应应的的递递增增下下标标序序列列为为(2,3,5,7),序序列列(a,c,b,d,b)是是X的的一一个个长长度度为为5的的子子序序列列,相相应应的的递递增增下下标标序序列列为为(1,3,4,5,7)。可见,一个给定序列的子序列可以有多个。可见,一个给定序列的子序列可以有多个。给定两个序列给定两个序列X和和Y,当另一个序列,当另一个序列Z既是既是X的子序列又是的子序列又是Y的子序列时,称的子序列时,称Z是序列是序列X和和Y的公共子序列。例如,序列的公共子序列。例如,序列X=(a,b,c,b,d,b),Y=(a,c,b,b,a,b,d,b,b),序列,序列(a,c,b)是序列是序列X和和Y的一个长度为的一个长度为3的公共子序列,序列的公共子序列,序列(a,b,b,d,b)是序列是序列X和和Y的的一个长度为一个长度为5的公共子序列。最长公共子序列问题就是在序列的公共子序列。最长公共子序列问题就是在序列X和和Y的公共子序列中查找长度最长的公共子序列。的公共子序列中查找长度最长的公共子序列。设设序序列列X=x1,x2,xm和和Y=y1,y2,yn的的最最长长公公共共子子序序列列为为Z=z1,z2,zk,记记Xk为为序序列列X中中前前k个个连连续续字字符符组组成成的的子子序序列列,Yk为为序序列列Y中中前前k个个连连续续字字符符组组成成的的子子序序列列,Zk为为序序列列Z中中前前k个个连连续续字字符符组组成的子序列,显然有下式成立:成的子序列,显然有下式成立:(1)若)若xm=yn,则,则zk=xm=yn,且,且Zk-1是是Xm-1和和Yn-1的最长公共子序列;的最长公共子序列;(2)若)若xmyn且且zkxm,则,则Z是是Xm-1和和Y的最长公共子序列;的最长公共子序列;(3)若)若xmyn且且zkyn,则,则Z是是X和和Yn-1的最长公共子序列。的最长公共子序列。可可见见,两两个个序序列列的的最最长长公公共共子子序序列列包包含含了了这这两两个个序序列列的的前前缀缀序序列列的的最长公共子序列。因此,最长公共子序列问题满足最优性原理。最长公共子序列。因此,最长公共子序列问题满足最优性原理。要要找找出出序序列列X=x1,x2,xm和和Y=y1,y2,yn的的最最长长公公共共子子序序列列,可按下述递推方式计算:当可按下述递推方式计算:当xm=yn时,找出时,找出Xm-1和和Yn-1的最长公共子序列,然后在其尾部加上的最长公共子序列,然后在其尾部加上xm即可得到即可得到X和和Y的最长的最长公共子序列;当公共子序列;当xmyn时,必须求解两个子问题:找出时,必须求解两个子问题:找出Xm-1和和Y的最长公共子序列以及的最长公共子序列以及Xm和和Yn-1的最长公共子序列,这两个公共的最长公共子序列,这两个公共子序列中的较长者即为子序列中的较长者即为X和和Y的最长公共子序列。用的最长公共子序列。用Lij表示子表示子序列序列Xi和和Yj的最长公共子序列的长度,可得如下动态规划函数:的最长公共子序列的长度,可得如下动态规划函数:L00=Li0=L0j=0(1L00=Li0=L0j=0(1i im,1m,1j jn)n)(式(式6.146.14)(式(式6.156.15)由此,把序列由此,把序列X=x1,x2,xm和和Y=y1,y2,yn的最长公的最长公共子序列的搜索分为共子序列的搜索分为m个阶段,第个阶段,第1阶段,按照式阶段,按照式6.15计算计算X1和和Yj的最长公共子序列长度的最长公共子序列长度L1j(1jn),第),第2阶段,按照式阶段,按照式6.15计算计算X2和和Yj的最长公共子序列长度的最长公共子序列长度L2j(1jn),依此),依此类推,最后在第类推,最后在第m阶段,计算阶段,计算Xm和和Yj的最长公共子序列长度的最长公共子序列长度Lmj(1jn),则),则Lmn就是序列就是序列Xm和和Yn的最长公共子序的最长公共子序列的长度。列的长度。为了得到序列为了得到序列Xm和和Yn具体的最长公共子序列,设二维表具体的最长公共子序列,设二维表Sm+1n+1,其中,其中Sij表示在计算表示在计算Lij的过程中的搜索状态,的过程中的搜索状态,并且有:并且有:若若Sij=1,表明,表明ai=bj,则下一个搜索方向是,则下一个搜索方向是Si-1j-1;若若Sij=2,表明,表明aibj且且Lij-1Li-1j,则下一个搜索方向是,则下一个搜索方向是Sij-1;若若Sij=3,表明,表明aibj且且Lij-1Li-1j,则下一个搜索方向,则下一个搜索方向是是Si-1j。如:序列如:序列X=(a,b,c,b,d,b),Y=(a,c,b,b,a,b,d,b,b),建立两,建立两个个(m+1)(n+1)的二维表的二维表L和表和表S,分别存放搜索过程中得到的子,分别存放搜索过程中得到的子序列的长度和状态。首先把表序列的长度和状态。首先把表L和表和表S的第的第0行和第行和第0列初始化为列初始化为0,然后根据式,然后根据式6.15和和6.16逐行计算填入表逐行计算填入表L和表和表S中。计算结果如中。计算结果如图图6.10所示。所示。(a)长度矩度矩阵L(b)状状态矩矩阵S图6.10最最长公共子序列求解示意公共子序列求解示意图0 1 2 3 4 5 6 7 8 90 1 2 34 5 6 7 8 90 0 0 0 0 0 0 0 0 00 0 0 0 00 0 0 0 0 01 0 1 1 1 1 1 1 1 1 11 0 1 2 22 1 2 2 2 22 0 1 1 2 2 2 2 2 2 22 0 3 2 11 2 1 2 1 13 0 1 2 2 2 2 2 2 2 23 0 3 1 22 2 2 2 2 24 0 1 2 3 3 3 3 3 3 34 0 3 3 11 3 1 3 1 15 0 1 2 3 3 3 3 4 4 45 0 3 3 32 2 2 1 2 26 0 1 2 3 4 4 4 4 5 56 0 3 3 11 3 1 2 1 16.4查找问题中的动态规划法查找问题中的动态规划法6.4.1最优二叉查找树最优二叉查找树6.4.2近似串匹配问题近似串匹配问题 设设r1,r2,rn是是n个个记记录录的的集集合合,其其查查找找概概率率分分别别是是p1,p2,pn,最最优优二二叉叉查查找找树树(OptimalBinarySearchTrees)是是以以这这n个个记记录录构构成成的的二二叉叉查查找找树树中中具具有有最最少少平平均均比比较较次次数数的的二二叉叉查查找找树树,即即 最最小小,其其中中pi是是记记录录ri的的查查找概率,找概率,ci是在二叉查找树中查找是在二叉查找树中查找ri的比较次数。的比较次数。例例如如,集集合合 A A,B B,C C,D D 的的查查找找概概率率是是0.1,0.1,0.2,0.2,0.4,0.4,0.30.3,图图6.116.11给给出出了了三三棵棵二二叉叉查查找找树树,在在查查找找成成功功的的情情况况下下,二二叉叉查查找找树树(a)(a)的的平平均均比比较较次次数数是是0.110.110.22+0.43+0.34=2.90.22+0.43+0.34=2.9,二二叉叉查查找找树树(b)(b)的的平平均均比比较较次次数数是是0.120.120.21+0.42+0.33=2.10.21+0.42+0.33=2.1,最最优优二二叉叉查查找找树树是是(c)(c),平平均均比比较较次次数数是是0.130.130.22+0.41+0.32=1.70.22+0.41+0.32=1.7。6.4.1最优二叉查找树最优二叉查找树ABCD(a)(b)(c)图6.11二叉查找树示例BCDAABCD 将由将由r1,r2,rn构成的二叉查找树记为构成的二叉查找树记为T(1,n),其中,其中rk(1kn)是)是T(1,n)的根结点,则其左子树的根结点,则其左子树T(1,k-1)由由r1,rk-1构成,其右子树构成,其右子树T(k+1,n)由由rk+1,rn构成,如图构成,如图6.12所示。所示。显然,若显然,若T(1,n)是最优二叉查找树,则其左子树是最优二叉查找树,则其左子树T(1,k-1)和右子和右子树树T(k+1,n)也是最优二叉查找树,如若不然,假设也是最优二叉查找树,如若不然,假设T(1,k-1)是是比比T(1,k-1)更优的二叉查找树,则更优的二叉查找树,则T(1,k-1)的平均比较次数小于的平均比较次数小于T(1,k-1)的平均比较次数,从而由的平均比较次数,从而由T(1,k-1)、rk和和T(k+1,n)构成构成的二叉查找树的二叉查找树T(1,n)的平均比较次数小于的平均比较次数小于T(1,n)的平均比较次的平均比较次数,这与数,这与T(1,n)是最优二叉查找树的假设相矛盾。因此最优二是最优二叉查找树的假设相矛盾。因此最优二叉查找树满足最优性原理。叉查找树满足最优性原理。rkT(1,n)图6.12以rk为根的二叉查找树T(k+1,n)T(1,k-1)设T(i,j)是由记录ri,rj(1ijn)构成的二叉查找树,C(i,j)是这棵二叉查找树的平均比较次数。虽然最后的结果是C(1,n),但遵循动态规划法的求解方法,需要求出所有较小子问题C(i,j)的值,考虑从ri,rj中选择一个记录rk作为二叉查找树的根结点,可以得到如下关系:因此,得到如下动态规划函数:因此,得到如下动态规划函数:C(i,i-1)=0(1in+1)(式(式6.17)C(i,i)=pi(1in)(式(式6.18)C(i,j)=minC(i,k-1)+C(k+1,j)+(1ijn,ikj)(式(式6.19)式式6.17解解释释为为空空树树的的比比较较次次数数为为0,式式6.18解解释释为为只只包包含含记记录录ri的的二二叉叉查查找找树树。设设一一个个二二维维表表Cn+1n+1,其其中中Cij表表示示二二叉叉查查找找树树T(i,j)的的平平均均比比较较次次数数。注注意意到到在在式式6.19中中,当当k=1时时,求求Cij需需要要用用到到Ci0,当当k=n时时,求求Cij需需要要用用到到Cn+1j,所所以以,二二维维表表Cn+1n+1行行下下标标的的范范围围为为1n+1,列列下下标标的的范范围围为为0n。为为了了在在求求出出由由r1,r2,rn构构成成的的二二叉叉查查找找树树的的平平均均比比较较次次数数的的同同时时得得到到最最优优二二叉叉查查找找树树,设设一一个个二二维维表表Rn+1n+1,其其下下标标范范围围与与二二维维表表C相相同同,Rij表表示示二二叉叉查查找树找树T(i,j)的根结点的序号。的根结点的序号。例例如如,集集合合A,B,C,D的的查查找找概概率率是是0.1,0.2,0.4,0.3,二维表,二维表C和和R的初始情况如图的初始情况如图6.13所示。所示。(a)二维表二维表C(b)二维表二维表R图图6.13初始表的状态初始表的状态01234100.1200.2300.4400.35001234112233445 在二维表在二维表C和和R中只需计算主对角线以上的元素,首中只需计算主对角线以上的元素,首先计算先计算C(1,2):因此,在前两个记录构成的最优二叉查找树的根结点的因此,在前两个记录构成的最优二叉查找树的根结点的序号是序号是2,按对角线逐条计算每一个,按对角线逐条计算每一个C(i,j)和和R(i,j),得到如,得到如图图6.14所示的最终表。所示的最终表。01234100.10.41.11.7200.20.81.4300.41.0400.35001234112332233333445(a)二维表二维表C(b)二维表二维表R图图6.14最终表的状态最终表的状态d=1d=2d=3d=1d=2d=3适用条件适用条件动态规划法的有效性依赖于问题本身所具动态规划法的有效性依赖于问题本身所具 有的两个重要有的两个重要的适用性质的适用性质1.最优子结构最优子结构 如果问题的最优解是由其子问题的最优解来构造,如果问题的最优解是由其子问题的最优解来构造,则称则称 该问题具有最优子结构性质。该问题具有最优子结构性质。2.重叠子问题重叠子问题 在用递归算法自顶向下解问题时,每次产生的子问在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态题并不总是新问题,有些子问题被反复计算多次。动态规划规划 算法正是利用了这种子问题的重叠性质,对每一个算法正是利用了这种子问题的重叠性质,对每一个子问子问 题只解一次,而后将其解保存在一个表格中,在以题只解一次,而后将其解保存在一个表格中,在以后该后该 子问题的求解时直接查表。子问题的求解时直接查表。动态规划的思想实质是分治思想和解决冗余。动态规划的思想实质是分治思想和解决冗余。与分治法类似的与分治法类似的是将原问题分解成若干个子问题,是将原问题分解成若干个子问题,先求解子问题,然后从先求解子问题,然后从 这些子问题的解得到原问题这些子问题的解得到原问题的解。的解。与分治法不同的与分治法不同的是经分解的子问题往往不是互相独是经分解的子问题往往不是互相独立的。若用分治法来立的。若用分治法来 解,有些共同部分(子问题或解,有些共同部分(子问题或子子问题)被重复计算了子子问题)被重复计算了 很多次。很多次。如果能够保存已解决的子问题的答案,在需要时再如果能够保存已解决的子问题的答案,在需要时再查找,这样就可以避免重复计算、节省时间。动态查找,这样就可以避免重复计算、节省时间。动态规划法用一个表来记录所有已解的子问题的答案。规划法用一个表来记录所有已解的子问题的答案。这就是动态规划法的基本思路。具体的动态规划算这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表方式。法多种多样,但它们具有相同的填表方式。生产与存储问题生产与存储问题 某工厂每月需供应市场一定数某工厂每月需供应市场一定数量的产品。供应需求所剩余产品应量的产品。供应需求所剩余产品应存入仓库,一般地说,某月适当增存入仓库,一般地说,某月适当增加产量可降低生产成本,但超产部加产量可降低生产成本,但超产部分存入仓库会增加库存费用,要确分存入仓库会增加库存费用,要确定一个每月的生产计划,在满足需定一个每月的生产计划,在满足需求条件下,使一年的生产与存储费求条件下,使一年的生产与存储费用之和最小。用之和最小。投资决策问题投资决策问题 某公司现有资金某公司现有资金Q Q亿元,在亿元,在今后今后5 5年内考虑给年内考虑给A A、B B、C C、D D四个四个项目投资,这些项目的投资期限、项目投资,这些项目的投资期限、回报率均不相同,问应如何确定回报率均不相同,问应如何确定这些项目每年的投资额,使到第这些项目每年的投资额,使到第五年末拥有资金的本利总额最大。五年末拥有资金的本利总额最大。设备更新问题设备更新问题 企业在使用设备时都要考虑企业在使用设备时都要考虑设备的更新问题,因为设备越陈设备的更新问题,因为设备越陈旧所需的维修费用越多,但购买旧所需的维修费用越多,但购买新设备则要一次性支出较大的费新设备则要一次性支出较大的费用。用。现在某企业要决定一台设备未来现在某企业要决定一台设备未来8 8年的更新计划,已预测到第年的更新计划,已预测到第j j年年购买设备的价格为购买设备的价格为K Kj j,G Gj j为设备为设备经过经过j j年后的残值,年后的残值,C Cj j为设备连续为设备连续使用使用j-1j-1年后在第年后在第j j年的维修费用年的维修费用(j=1,28)(j=1,28),问应在哪年更新设,问应在哪年更新设备可使总费用最小。备可使总费用最小。p经常不断地学习,你就什么都知道。你知道得越多,你就越有力量pStudyConstantly,AndYouWillKnowEverything.TheMoreYouKnow,TheMorePowerfulYouWillBe写在最后谢谢你的到来学习并没有结束,希望大家继续努力Learning Is Not Over.I Hope You Will Continue To Work Hard演讲人:XXXXXX 时 间:XX年XX月XX日
展开阅读全文