河北工业大学2016算法分析与设计实验报告_第1页
河北工业大学2016算法分析与设计实验报告_第2页
河北工业大学2016算法分析与设计实验报告_第3页
河北工业大学2016算法分析与设计实验报告_第4页
河北工业大学2016算法分析与设计实验报告_第5页
已阅读5页,还剩9页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、河北工业大学算法分析与设计2016实验报告学院: 计算机科学与软件学院班级: 姓名: 学号: 实验一【实验学时】4学时【实验目的】1深刻理解并掌握“分治算法”的设计思想;2提高应用“分治算法”设计技能;3理解这样一个观点:用递归方法编写的问题解决程序具有结构清晰,可读性强等优点,且递归算法的设计比非递归算法的设计往往要容易一些,所以当问题本身是递归定义的,或者问题所涉及到的数据结构是递归定义的,或者是问题的解决方法是递归形式的时候,往往采用递归算法来解决。【问题描述】设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各赛一次;(2)每

2、个选手一天只能赛一次; (3)循环赛一共进行n-1天.按照分治的策略,可将所有参赛的选手分为两部分,n2k个选手的比赛日程表就可以通过为n/22k-1个选手设计的比赛日程表来决定。递归地执行这种分割,直到只剩下2个选手时。【源程序】#include#includevoid GameTable(int k, int a8080)int n=2;int i, j, t, temp;a11=1; a12=2;a21=2; a22=1;for (t=1; tk; t+)temp=n; n=n*2;for(i=temp+1; i=n; i+)for(j=1; j=temp; j+)aij=ai-temp

3、j+temp;for(i=1; i=temp; i+)for(j=temp+1; j=n; j+)aij=ai+tempj-temp;for(i=temp+1;i=n; i+)for(j=temp+1; j=n; j+)aij=ai-tempj-temp;int main()int i,j,k;int a8080;printf(请输入k的数值 k=);scanf(%d,&k); GameTable(k,a);for(i=1; i=pow(2,k); i+)for(j=1; j=pow(2,k); j+)printf(%5d,aij);printf(n);return 0;【运行结果】【分析总结

4、】本次实验思路简单,并且编程实现也不复杂。通过这次试验,我对于分治法的设计思想理解地更加深入。其主要思想就是将一个大问题,分解为一个个的小问题,知道每个小问题很容易求出解为止。最后再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出元问题的解。实验二【实验学时】4学时【实验目的】(1)熟练掌握动态规划思想及教材中相关经典算法。(2)掌握动态规划算法求解问题的一般特征和步骤;使用动态规划法编程,求解0/1背包问题。【问题描述】0/1背包问题是给定n个重量为w1, w2, ,wn、价值为v1, v2, ,vn的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中

5、。在0/1背包问题中,物品i或者被装入背包,或者不被装入背包,设xi表示物品i装入背包的情况,则当xi=0时,表示物品i没有被装入背包,xi=1时,表示物品i被装入背包。0/1背包问题可以看作是决策一个序列(x1, x2, , xn),对任一变量xi的决策是决定xi=1还是xi=0。在对xi-1决策后,已确定了(x1, , xi-1),在决策xi时,问题处于下列两种状态之一:(1)背包容量不足以装入物品i,则xi=0,背包不增加价值;(2)背包容量可以装入物品i,则xi=1,背包的价值增加了vi。 这两种情况下背包价值的最大者应该是对xi决策后的背包价值。【源程序】/本程序的测试用例是课本上的

6、例题#include int x100, V100100; int max(int a, int b) return (ab ? a : b); int KnapSack(int w, int v, int n, int C) int i,j; /初始化第0列 for(i=0; i=n; i+) Vi0=0; /初始化第0行 for(j=0; j=C; j+) V0j=0; /双重for循环完成填表过程 for(i=1; i=n; i+) for(j=1; j=C ; j+) if(j0; i-) if(VijVi-1j) xi=1; j-=wi; else xi=0; /返回背包最大价值 r

7、eturn VnC; int main() /n是物品个数;C是背包总容量 int w100, v100, n, C; printf(请输入物品种类:); scanf(%d,&n); printf(请输入背包重量:); scanf(%d,&C); printf(请输入重量矩阵:); for(int i=1; i=n; i+) scanf(%d,&wi);/这里注意i从1开始取值 printf(请输入价值矩阵:); for(int i=1; i=n; i+) scanf(%d,&vi);/这里注意i从1开始取值 printf(n); printf(背包取得的最大价值为:%dn,KnapSack(

8、w, v, n, C); printf(问题的最优解序列为:); for(int i=1; i=n; i+) printf(%2d,xi); printf(nn); printf(二维矩阵V为:n); for(int i=0; i=n; i+) for(int j=0; j=C; j+) printf(%3d,Vij); printf(n); return 0;【运行结果】【分析总结】通过这次试验,我体会到了动态规划法设计思想的巧妙之处。动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,都希望找到具有最优值的解。动态规划算法与分治法类似,

9、其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。实验三【实验学时】6学时【实验目的】掌握贪心算法求解问题的一般特征和步骤;通过使用贪心算法求解0/1背包和TSP问题,进一步加深对贪心算法的理解和运用。【问题描述】0/1背包问题是给定n个重量为w1, w2, ,wn、价值为v1, v2, ,vn的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中每次从物品集合中选择单位重量价值最大的物品,如果其重量小于背包容量,就可以把它装入,并将背包容

10、量减去该物品的重量。因此背包问题具有最优子结构性质。TSP问题是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。1)最近邻点策略:从任意城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。2)最短链接策略:每次在整个图的范围内选择最短边加入到解集合中,但是,要保证加入解集合中的边最终形成一个哈密顿回路。【0/1背包源程序】/本程序的测试用例来源于课本例题#include#includeusing namespace std;struct G double v; double w; double x=0; int f

11、lag=0;good100;bool cmp1(G a, G b)/按照性价比降序排序 return a.v/a.w b.v/b.w;bool cmp2(G a, G b)/按照序号升序排序 return a.flag b.flag;int main() int i, n, C; double maxValue=0; printf(请输入物品种类:); scanf(%d,&n); printf(请输入背包重量:); scanf(%d,&C); printf(请输入重量矩阵:); for(int i=0; in; i+) scanf(%lf,&goodi.w); goodi.flag=i; pr

12、intf(请输入价值矩阵:); for(int i=0; in; i+) scanf(%lf,&goodi.v); sort(good, good+n, cmp1); for(i=0; goodi.w=C; i+) goodi.x=1; maxValue+=goodi.v; C-=goodi.w; goodi.x=(double)C/goodi.w; maxValue+=goodi.x*goodi.v; printf(背包的最大价值为:%.2fn,maxValue); sort(good, good+n, cmp2); printf(问题的最优解向量为:); for(int i=0; in;

13、i+) printf(%.1f ,goodi.x); printf(n); return 0;【运行结果】【TSP源程序】#include /#define LOCALint arc1010;int n;/城市个数int w;/起点城市int TSP(int n, int w) int edgeCount = 0, TSPLength = 0; int min = 100, u, v; int flag10=0;/可以对于flag数组中所有元素清零; u=w; flagw=1; while(edgeCount n-1) min = 100; for(int j=1; j=n; j+) if(f

14、lagj=0 & arcuj, u); u=v; printf(%d-%dn, v, w); return (TSPLength+arcuw);int main() #ifdef LOCAL freopen(data.in, r, stdin); freopen(data.out, w, stdout); #endif / LOCAL printf(请输入城市个数:); scanf(%d,&n); printf(请输入代价矩阵:n); for(int i=1; i=n; i+) for(int j=1; j0,其价值为vi0,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总

15、价值最大? TSP问题是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。【0/1背包源程序】#includeusing namespace std;int n,c,bestp;/物品的个数,背包的容量,最大价值int p100,w100,x100,bestx100;/物品的价值,物品的重量,xi暂存物品的选中情况,物品的选中情况void Backtrack(int i,int cp,int cw)/cw当前包内物品重量,cp当前包内物品价值 int j; if(in)/结束回溯 if(cpbestp) bestp=cp; for(i=0;i=n;i+

16、)bestxi=xi; else for(j=0;j=1;j+) xi=j; if(cw+xi*wi=c) cw+=wi*xi; /每个解向量的分量的c与当前的wi和前一个解向量分量的cw有关 cp+=pi*xi;Backtrack(i+1,cp,cw); /递归调用 int main() coutendl; coutendl; int i; bestp=0;cout输入物品个数:n;cout输入背包最大容量:c;cout依次输入物品的重量:endl; for(i=1;iwi;cout请依次输入物品的价值:endl; for(i=1;ipi; Backtrack(1,0,0);cout最大价值为:endlbestpendl;cout物品的选中情况依次为(0表示没有被选中,1表示被选中)endl; for(i=1;i=n;i+)coutbestxi; coutendl; return 0;【运行结果】【分析总结】1、 重温了算法课程里面学过的回溯法,强化了这种编程思想。2、 深刻理解了递归调用的思想。3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论