- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法基础-8PPT
Chapter 8 DYNAMIC PROGRAMMING 当ij时,m[i][j]=min{m[i][k]+m[k+1][j]+pi-1*pk*pj} (i=kj)。 除此之外,若将对应于m[i][j]的断开位置记为s[i][j],在计算出最优值m[i][j]后,可以递归地由s[i][j]构造出相应的最优解 Chapter 8 DYNAMIC PROGRAMMING (3)计算最优值。 如果直接套用m[i][j]的计算公式,进行简单的递归计算需要耗费指数计算时间。然而,实际上不同的子问题的个数只是n的平方项级(对于1=i=j=n不同的有序对(i,j)对应于不同的子问题)。用动态规划解决此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。 Chapter 8 DYNAMIC PROGRAMMING 态规划算法: void matrixChain (int * p, int n, int * * m, int * * s) {? for ( int i=1;i=n;i++)??????? m[i][i]=0; ??? for ( int r=2;r=n;r++) //链长度控制 for ( int i=1;i=n-r+1;i++) //链起始位置 ??????? { int j=i+r-1; //链终止位置 ??????????? m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; ??????????? s[i][j]=i; Chapter 8 DYNAMIC PROGRAMMING for ( int k=i+1;kj;k++) ?????????? { ??????????????? int t=m[i][k]+m[k+1][j]+p[i- 1]*p[k]*p[j]; ??????????????? if (tm[i][j]) ?????????????? { ??????????????????? m[i][j]=t; ??????????????????? s[i][j]=k; ??????????????? } ??????????? } Chapter 8 DYNAMIC PROGRAMMING 算法首先设定m[i][i]=0(i=1,2,...,n)。然后再根据递归式按矩阵链长的递增方式依此计算出各个m[i][j],在计算某个固定的m[i][j]时,只用到已计算出的m[i][k]和m[k+1][j]。 稍加分析就可以得出,这个算法以O(n^2)的空间消耗大大降低了时间复杂度,计算时间的上界为O(n^3)。 Chapter 8 DYNAMIC PROGRAMMING (4)构造最优解。 通过以上算法的计算,我们知道了要计算所给矩阵连乘积所需的最少数乘次数,但是还不知道具体应该按照什么顺序来做矩阵乘法才能达到这个次数。然而,s[i][j]已经存储了构造最优解所需要的足够的信息。从s[1][n]记录的信息可知计算A[1:n]的最优加括号方式为(A[1:s[1][n]])(A[s[1][n]+1:n])。同理,每个部分的最优加括号方式又可以根据数组s的相应元素得出。照此递推下去,最终可以确定A[1:n]的最优完全加括号方式,即构造出问题的一个最优解。 Chapter 8 DYNAMIC PROGRAMMING 8.7 再论最优性原则 解决一个问题的过程中,需要依次作出n个决策D1,D2,…Dn,若这个决策序列是最优的,对于任何一个整数k,1kn,不论前面k个决策是怎样的,以后的最优决策只取决于前面的决策,即前k个是最优的,则k+1也是最优的。 例1:某工厂购进1000太机器,准备生产P1,P2产品,生产产品P1,机器的年利润是50000元,机器损坏率是65%,生产产品P2,机器的年利润是40000元,机器损坏率是40%。三年后机器全部淘汰,换更先进的机器。 Chapter 8 DYNAMIC PROGRAMMING 问如何安排生产计划,使三年的收益最大。计划以1年为周期。 设Pi(n)是n台机器i年中的最大收益。i=1时:一年的最大收益: 即x3=n 考虑2年内的在大收益,即i=2 x2为2年中第一年生产P1产品的机器数。1年后剩余的机器是0.35x2+0.4(n-x2) Chapter 8 DYNAMIC PROGRAMMING P1(k)=50000k 所以: 当 X2=0 最后考虑:i=3,第1
文档评论(0)