ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:89.75KB ,
资源ID:24656395      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24656395.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验三动态规划.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验三动态规划.docx

1、实验三动态规划算法分析与设计实验报告 学号姓名班级上课地点教师上课时间实验三 动态规划1. 实验目的1.1理解动态规划算法的主要设计思想和基本步骤;1.2掌握用动态规划策略解决实际问题。2. 实验环境2.1 Eclipse2.2 Window XP3. 实验内容3.1 矩阵连乘问题3.2 最长公共子序列问题3.3 0-1背包问题4. 教师批改意见 签字:日期:成绩实验报告细表1.矩阵连乘问题 1.1 算法设计思想 (1) 分析最优解:计算Ai:j的最优次序所包含的计算矩阵子链 Ai:k和Ak+1:j的次序也是最优的 (2)建立递归关系:设计算Ai:j,1ijn,所需要的最少数乘次数mi,j,则

2、原问题的最优值为m1,n 当i=j时,Ai:j=Ai,因此,mi,i=0,i=1,2,n当ij时, 可以递归地定义mi,j为:k的位置有j-i种可能(3)计算最优值:用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法public static void MatrixChain(int p,int m,int s) int n=p.length-1; for(int i=1;i=n;i+)mii=0; for(int r=2;r=n;r+) fo

3、r(int i=1;i=n-r+1;i+) int j=i+r-1; mij=mi+1j+pi+1ij; sij=i; for(int k=i+1;kj;k+) int t=mik+mk+1j+pi-1kj; if(tmij) mij=t; sij=k; (4)构造最优解:算法matrixChain 记录了构造最优解所需的全部信息。 sij=k表明计算矩阵链Ai:j的最佳方式在矩阵Ak和 Ak+1之间断开,即最优的加括号方式为(Ai:k)(Ak+1:j)。 因此,从s1n记录的信息可知计算A1:n的最优加括号 方式为 (A1:s1n)(As1n+1:n)。而A1:s1n的最 优加括号方式为(A

4、1:s1s1n)(As1s1n+1:s1s1n)。 同理可以确定As1n+1:n的最优加括号方式在ss1n+1n处断开。照此递推下去,最终可以得到A1:n的最优完全加括号方式, 即构造出问题的一个最优解。public static void traceback(int s,int i,int j) if(i=j)return; traceback(s,i,sij); traceback(s,sij+1,j); System.out.println(Multiply A+i+,+sij+and A+(sij+1)+,+j);1.2 程序源码矩阵连乘代码:/* * 下面是矩阵连乘问题的动态规划算法

5、 * 假设有6个矩阵: * A1 A2 A3 A4 A5 A6 * 30*35 35*15 15*5 5*10 10*20 20*25 则matrixChain为 * 30, 35, 15, 5, 10, 20, 25 结果为 * (A1 * (A2 * A3) * (A4 * A5) * A6) ) * author zhanlingxia*/ package juzhenliancheng;public class juzhenliancheng public static void main(String args) intp = 30, 35, 15, 5, 10, 20, 25; /

6、 矩阵的维数存放于数组p中 matrixMultiply(p); /矩阵连乘 public static void matrixMultiply(int p) int dimen = p.length; intm = new intdimendimen; /定义了存放最优值数组m ints = new intdimendimen; /定义了记录断开位置的数组s MatrixChain(p,m,s); System.out.println(最优乘法次数: + m1dimen - 1); System.out.println(划分规则为:); traceback(s, 1, dimen - 1);

7、 /*1:首先计算出mii 2:然后根据递归式按矩阵链长递增的方式以此计算mii+1i=1,2,3.。 3:计算mij时,只要用到mik和mk+1j*/public static void MatrixChain(int p,int m,int s) int n=p.length-1; for(int i=1;i=n;i+)mii=0;/计算单一矩阵 /根据递归式按矩阵链长递增的方式以此计算mii+1i=1,2,3.。 for(int r=2;r=n;r+) for(int i=1;i=n-r+1;i+) int j=i+r-1; mij=mi+1j+pi+1*pi*pj; sij=i; fo

8、r(int k=i+1;kj;k+) int t=mik+mk+1j+pi-1*pk*pj; /更新mij,sij的值 if(tmij) mij=t; sij=k; / 按算法MatrixChain计算出断点矩阵s指示的加括号方式 public static void traceback(int s,int i,int j) if(i=j)return; traceback(s,i,sij); traceback(s,sij+1,j); System.out.println(Multiply A+i+,+sij+and A+(sij+1)+,+j); 1.3 实验结论 1.4心得体会算法设计真

9、的需要逻辑思维,能得到结果挺开心的。2:最长公共子序列2.1 算法设计思想(1) 设序列X=x1,x2,xm和Y=y1,y2,yn的最长公共子序列为Z=z1,z2,zk ,则若xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列。若xmyn且zkxm,则Z是Xm-1和Y的最长公共子序列。若xmyn且zkyn,则Z是X和Yn-1的最长公共子序列 (2)建立递归关系:由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。用cij记录序列和的最长公共子序列的长度。其中, Xi=x1,x2,xi;Yj=y1,y2,yj。当i=0或j=0时,空序列是Xi和Yj的最长公

10、共子序列。故此时Cij=0。其他情况下,由最优子结构性质可建立递归关系如下:(3)计算最优值:算法lcsLength以序列X=x1,x2xm和Y=y1,y2ym作为输入。输出两个数组c和b。其中,cij存储Xi和Yj的最长公共子序列的长度,bij记录cij的值是由哪一个子问题的解得到的,问题的最优值存放于cmn中public static int lcsLength (charx,chary,intb) int m=x.length-1; int n=y.length-1; intc=new intm+1n+1; for(int i=1;i=m;i+)ci0=0; for(int i=1;i=

11、n;i+)c0i=0; for(int i=1;i=m;i+) for(int j=1;j=cij-1) cij=ci-1j; bij=2; else cij=cij-1; bij=3; return cmn; (4)构造最优解:public static void lcs(int i,int j,charx,intb) if(i=0|j=0)return; if(bij=1) lcs(i-1,j-1,x,b); System.out.print(xi); else if(bij=2)lcs(i-1,j,x,b); else lcs(i,j-1,x,b); 2.2 程序源码最长公共子序列代码:

12、/* * 下面是最长公共子序列问题的动态规划算法 * charx=A,B,C,D,A,B; * chary=B,D,C,A,B,A; * 打印结果为CAB * author zhanlingxia*/ package zuichanggonggongzixulie;public class zuichanggonggongzixulie /*计算最优值 cij存储Xi和Yi的最长公共子序列的长度 bij记录cij的值是由最长公共子序列*/ public static int lcsLength (charx,chary,intb) int m=x.length-1; int n=y.lengt

13、h-1; intc=new intm+1n+1; /空序列最长公共子序列 for(int i=1;i=m;i+)ci0=0; for(int i=1;i=n;i+)c0i=0; /对角线+1 for(int i=1;i=m;i+) for(int j=1;j=cij-1) cij=ci-1j; bij=2; /和左边一样 else cij=cij-1; bij=3; return cmn; /打印最长公共子序列 public static void lcs(int i,int j,charx,intb) if(i=0|j=0)return; if(bij=1) lcs(i-1,j-1,x,b)

14、; System.out.print(xi); else if(bij=2)lcs(i-1,j,x,b); else lcs(i,j-1,x,b); public static void main(String args) charx=A,B,C,D,A,B; chary=B,D,C,A,B,A; intb=new intx.length+1y.length+1; System.out.println(最长公共子序列:); int n=lcsLength(x,y,b); System.out.println(); System.out.println(其长度为:+n); System.out.

15、println(最长公共子序列为:); lcs(x.length-1,y.length-1,x,b); 2.3 实验结论2.4心得体会:最长公共子序列比较好理解哦。做起来也相较简单多了3 0-1背包问题 3.1 算法设计思想 (1) 分析最优解:设(y1,y2,yn)是所给0-1背包问题的一个最优解,则(y2,yn)是下面相应子问题的一个最优解。 (2)建立递归关系:设所给0-1背包问题的子问题的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,n时0-1背包问题的最优值。由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下。(3)计算最优值: pu

16、blic static void knapsack(int v, int w, int c, int m) int n = v.length-1; int jMax = Math.min(wn-1, c); for(int j = 0; j j 有 mnj=0 /mnj 表示只有n物品,背包的容量为j时的最大价值 for (int j = wn; j = c; j+) mnj = vn; /当wn=1; i-) jMax = Math.min(wi-1,c); for(int j = 0; j=jMax; j+) mij = mi+1j; for(int j = wi; j = w0) m0c

17、 = Math.max(m0c,m1c-w0+v0); System.out.println(+m0c); (4)构造最优解: public static void traceback(int m, int w, int c, int x) / 根据最优值求出最优解 int n = w.length-1; for(int i = 0; i0)?1:0; 3.2 程序源码0-1背包问题代码:/* * 下面是0-1的动态规划算法 *v w c 分别是价值、重量、和背包容量数组 *mij表示有in个物品,背包容量为j的最大价值。 * author zhanlingxia */ public clas

18、s beibao public static void knapsack(int v, int w, int c, int m) int n = v.length-1; int jMax = Math.min(wn-1, c); for(int j = 0; j j 有 mnj=0 /mnj 表示只有n物品,背包的容量为j时的最大价值 for (int j = wn; j = c; j+) mnj = vn; /当wn=1; i-) jMax = Math.min(wi-1,c); for(int j = 0; j=jMax; j+) mij = mi+1j; for(int j = wi;

19、j = w0) m0c = Math.max(m0c,m1c-w0+v0); System.out.println(+m0c); public static void traceback(int m, int w, int c, int x) / 根据最优值求出最优解 int n = w.length-1; for(int i = 0; i0)?1:0; public static void main(String args) /测试 int w = 2,2,6,5,4; int v = 6,3,5,4,6; int m = new int1111; System.out.println(0-1背包问题最优值:); knapsack(v,w,10,m); System.out.println(0-1背包问题最优解:); int x=new intw.length; traceback(m,w,10,x); for(int i = 0;ix.length;i+) System.out.print(xi); 3.3 实验结论 3.4心得体会 深夜了,我被0-1背包问题折磨了一晚上,总算搞定了;从伪代码到代码的历程好艰辛。不过还是有点成就感的

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1