




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
动态规划算法的基本思想动态规划方法是处理分段过程最优化问题的一类及其有效的方法。在实际生活中,有一类问题的活动过程可以分成若干个阶段,而且在任一阶段后的行为依赖于该阶段的状态,与该阶段之前的过程是如何达到这种状态的方式无关。这类问题的解决是多阶段的决策过程。20世纪50年代,贝尔曼(Richard Bellman)等人提出了解决这类问题的“最优化原则”,从而创建了最优化问题的一种新的算法动态规划算法。最优化原则指出,多阶段过程的最优决策序列应当具有性质:无论过程的初始状态和初始决策是什么,其余的决策都必须相对于初始决策所产生的状态构成一个最优决策序列。这要求原问题的最优解包含了其子问题的一个最优解(称为最优子结构性质)。动态规划算法采用最优原则来建立递归关系式(关于求最优值的),在求解问题时有必要验证该递归关系式是否保持最优原则。若不保持,则不可用动态规划算法。在得到最优值的递归式之后,需要执行回溯以构造最优解。在使用动态规划算法自顶向下(Top-Down)求解时,每次产生的子问题并不总是新问题,有些子问题反复计算多次,动态规划算法正是利用了这种子问题重叠性质。对每一个问题只计算一次,而后将其解保存在一个表格中,当再次要解此子问题时,只是简单地调用(用常数时间)一下已有的结果。通常,不同的子问题个数随着输入问题的规模呈多项式增长,因此,动态规划算法通常只需要多项式时间,从而获得较高的解题效率。最优子结构性质和子问题重叠性质是采用动态规划算法的两个基本要素。例1多段图问题设G=(V,E)是一个赋权有向图,其顶点集V被划分成k2个不相交的子集Vi: 1ik,其中,V1和Vk分别只有一个顶点s(称为源)和一个顶点t(称为汇),下图中所有的边(u,v)的始点和终点都在相邻的两个子集Vi和Vi1中:uVi,vVi1。V1 V2 V3 V4 V51ts3729224611781134526554185427759716157453267891011121 图6-1-1 一个5段图多阶段图问题:求由s到t的最小成本路径(也叫最短路径)。对于每一条由s到t的路径,可以把它看成在k-2个阶段作出的某个决策序列的相应结果:第i步决策就是确定Vi+1中哪个顶点在这条路径上。今假设s, v2, v3, , vk-1, t是一条由s到t的最短路径,再假定从源点s(初始状态)开始,已经作出了到顶点v2的决策(初始决策),则v2就是初始决策产生的状态。若将v2看成是原问题的子问题的初始状态,这个子问题就是找一条由v2到t的最短路径。事实上,路径v2, v3, , vk-1, t一定是v2到t的一条最短路径。不然,设v2, q3, , qk-1, t是一条由v2到t的比v2, v3, , vk-1, t更短的路径,则s, v2, q3, , qk-1, t是一条由s到t的比s, v2, v3, , vk-1, t更短的路径。与前面的假设矛盾。这说明多段图问题具有最优子结构性质。例2 0/1背包问题有n件物品,第i件重量和价值分别是wi和pi, i=1, 2, , n。要将这n件物品的某些件装入容量为c的背包中,要求每件物品或整个装入或不装入,不许分割出一部分装入。0/1背包问题就是要给出装包方法,使得装入背包的物品的总价值最大。这个问题归结为数学规划问题:s.t. (6.1.1)0/1背包问题具有最优子结构性质。事实上,若是最优解,则将是0/1背包问题的子问题: s.t. (6.1.2)最优解。因为,若是子问题(6.1.2)的最优解,且使得 (6.1.3)则将是原问题(6.1.1)的可行解,并且使得 (6.1.4)这与是最优解相悖。例3. 矩阵连乘问题给定n个数字矩阵A1,A2,An,其中Ai与Ai+1是可乘的,i=1,2,n-1.求矩阵连乘A1A2An的加括号方法,使得所用的数乘次数最少。考察两个矩阵相成的情形:C=AB。如果矩阵A,B分别是pr和rq矩阵,则它们的乘积C将是pq矩阵,其(i, j)元素为 (6.1.5)i=1,p, j=1,q, 因而AB所用的数乘次数是prq。如果有至少3个以上的矩阵连乘,则涉及到乘积次序问题,即加括号方法。例如3个矩阵连乘的加括号方法有两种:(A1A2)A3)和(A1(A2A3)。设A1,A2,A3分别是p0p1,p1p2,p2p3矩阵,则以上两种乘法次序所用的数乘次数分别为:p0p1p2+p0p2p3和p0p1p3+p1p2p3。如果p0=10, p1=100, p2=5, p3=50, 则两种乘法所用的数乘次数分别为:7500和750000。可见,由于加括号的方法不同,使得连乘所用的数乘次数有很大差别。对于n个矩阵的连乘积,令P(n)记连乘积的完全加括号数,则有如下递归关系 (6.1.6)由此不难算出P=C(n-1),其中C表示Catalan数: (6.1.7)也就是说,P(n)是随n指数增长的,所以,我们不能希望列举所有可能次序的连乘积,从中找到具有最少数乘次数的连乘积算法。事实上,矩阵连乘积问题具有最优子结构性质,我们可以采用动态规划的方法,在多项式时间内找到最优的连乘积次序。 用Ai:j表示连乘积AiAi1Aj。分析计算A1:n的一个最优次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链分开,1kn,则完全加括号方式为(A1A2Ak)( Ak1An),依此次序,我们先分别计算A1:k和Ak+1:n,然后将计算的结果相乘得到A1:n。可见,A1:n的一个最优序所包含的矩阵计算子链A1:k和Ak+1:n的次序也一定是最优的。也就是说,矩阵连乘问题具有最优子结构性质。如上三个例子都具有最优子结构性质,这个性质决定了解决此类问题的基本思路是:首先确定原问题的最优值和其子问题的最优值之间的递推关系(自上向下),然后自底向上递归地构造出最优解(自下向上)。最优子结构性质是最优化原理得以采用的先决条件。一般说来,分阶段选择策略确定最优解的问题往往会形成一个决策序列。Bellman认为,利用最优化原理以及所获得的递推关系式去求解最优决策序列,可以使枚举数量急剧下降。这里有一个问题值得注意:最优子结构性质提示我们使用最优化原则产生的算法是递归算法,简单地使用递归算法可能会增加时间与空间开销。例如,用递归式直接计算矩阵连乘积A1:n的算法RecurMatrixChain的时间复杂度将是: 程序6-1-1 计算矩阵连乘的递归算法 int RecurMatrixChain(int i, int j) if (i=j) return 0;int u=RecurMatrixChain(i, i) +RecurMatrixChain(i+1,j) +pi-1*pi*pj;sij=i;for(int k=i+1; kj; k+) int t=RecurMatrixChain(i,k) +RecurMatrixChain(k+1,j) +pi-1*pk*pj; if (tu) u=t; sij=k; return u; 如果用T(n)表示该算法的计算A1:n的时间,则有如下递归关系式: 当时 ,可用数学归纳法直接证明:,这显然不是我们所期望的。注意到,在用递归算法自上向下求解具有最优子结构的问题时,每次产生的子问题并不总是新问题,有些问题被反复计算多次。如果对每一个问题只解一次,而后将其解保存在一个表格中,当再次需要解此问题时,只是简单地用常数时间查看一下结果。则可以节省大量的时间。在矩阵的连乘积问题中,若用mij表示由第i个矩阵到第j个矩阵的连乘积所用的最少数乘次数,则计算m1n时共有个子问题。这是因为,对于,不同的有序对(i, j)对应于不同的子问题,不同子问题最多只有个。下面将会看到,用动态规划解此问题时,可在多项式时间内完成。程序6-1-2 求矩阵连乘最优次序的动态规划算法 void MatrixChain(int p, int n, int * *m, int * *s) for (int i=1; i=n; i+) mii=0;for (int r=2; r=n; r+) for (int i=1; i=n-r+1; i+) int j=i+r-1; r是跨度 mij= mi+1j+pi-1*pi*pj; sij=i; for (int k=i+1; kj; k+) int t= mik+ mk+1j+pi-1*pk*pj; if (t mij) mij=t; sij=k; 算法MatrixChain的主要计算量取决于程序中对r, i和k的三重循环,循环体内的计算量为O(1),三重循环的总次数是O(n3),所以,算法的计算时间上界为O(n3)。例子 求以下6个矩阵连乘积最少数乘计算次数及所采用乘法次序。一般的计算以及的过程如下图所示:1 2 3 4 5 60 15750 7875 9375 11875 15125 0 2625 4375 7125 10500 0 750 2500 5375 0 1000 35000 5000 0123456ij1 2 3 4 5 60 1 1 3 3 3 0 2 3 3 3 0 3 3 3 0 4 50 5 0123456ij 注意,上述算法只是明确给出了矩阵最优连乘次序所用的数乘次数m1n,并未明确给出最优连乘次序,即完全加括号方法。但是以sij为元素的2维数组却给出了足够的信息。事实上,sij=k说明,计算连乘积Ai:j的最佳方式应该在矩阵Ak和Ak+1之间断开,即最优加括号方式为(Ai:k)(Ak+1:j)。下面的算法Traceback按算法MatrixChain计算出的断点信息s指示的加括号方式输出计算Ai:j的最优次序。 程序6-1-3 根据最优值算法构造最优解 Void Traceback(int i, int j, int * * s) if (i=j) return;Traceback(i, sij, s);Traceback(sij+1, j, s);cout “Multiply A” i “,” sij;cout “and A” (sij +1) “,” j endl; 总结上面解矩阵连乘积问题,我们可以归纳出使用动态规划算法的基本步骤:1 分析最优解的结构在这一步中,应该确定要解决的问题应该是具有最小子结构性质,这是选择动态规划算法的基础。2. 建立递归关系第一步的结构分析已经为建立递归关系奠定了基础。这一步的主要任务是递归地定义最优值,并建立该问题与其子问题最优值之间的递归关系。例如在矩阵连乘积问题中,递归关系为在0/1背包问题中的递归关系是(表示0/1背包问题Knap(j+1,n,X)的最优
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年环保产业行业绿色技术创新与市场前景研究报告
- 2025年物联网技术应用场景与发展前景研究报告
- 2025年区块链行业技术应用前景展望研究报告
- 商场员工安全培训资料课件
- 2025年生物医药行业创新药物研发与市场前景分析报告
- 2025年运输行业无人驾驶技术发展前景研究报告
- 山西省2025山西长治医学院招聘博士研究生40人笔试历年参考题库附带答案详解
- 商场业主管理培训课件
- 夏县2025山西运城市夏县事业单位引进高素质青年人才25人笔试历年参考题库附带答案详解
- 国家事业单位招聘2025中国农业科学院作物科学研究所科研管理处招聘1人笔试历年参考题库附带答案详解
- 新入职教师法律法规培训
- 数字经济与就业
- 2024年-2025年司法考试真题及复习资料解析
- 幼儿园护学岗职责
- 国开电大《组织行为学》形考任务1-4
- 施工安全生产风险分级管控和隐患排查治理双重预防机制建设实施方案
- 精细化工技术-大学专业介绍
- 餐饮财务问题的研究报告
- 慢性疾病运动干预中心服务要求(征求意见稿)
- 林同炎与美洲银行大厦
- (正式版)SH∕T 3548-2024 石油化工涂料防腐蚀工程施工及验收规范
评论
0/150
提交评论