算法设计与分析综合性实验报告.docx
- 文档编号:27749963
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:12
- 大小:63.76KB
算法设计与分析综合性实验报告.docx
《算法设计与分析综合性实验报告.docx》由会员分享,可在线阅读,更多相关《算法设计与分析综合性实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
算法设计与分析综合性实验报告
华南农业大学《算法设计与分析》课程综合性实验
实验起止日期:
2015~2016学年第一学期
系别
班级
学号
(最多三名)
姓名
(最多三名)
实验
题目
0-1背包问题的多种算法设计与分析
□设计性√综合性
自
我
评
价
小组
成员
分工
说明
201330330209何熠辉:
回溯法
教
师
评
语
能够实现实验要求的功能□A全部□B大部分□C部分□D无
算法描述清晰□A很清晰□B好□C一般□D杂乱
算法有新意□A很有亮点□B有点新意□C一般□D无新意
程序运行通过□A有完整测试□B有通过□C未提及□D无通过
算法思想与程序设计参数等说明□A完善□B简单提及□C仅功能□D缺
遇到的困难部分是否流畅解决□A完美解决□B尝试但效果不佳□C提及但未解决□D缺
对每种算法的分析□A分析详尽□B常规分析□C提及□D忽视
对多种算法的对比□A有对比且完整□B常规对比□C提及□D忽视
报告的整体结构□A结构合理□B某方面过重或过轻□C过于简单□D不合理
报告有总结和体会□A深刻总结□B一般□C提及□D无
按期上交文档报告及附属源程序□A按期且资料全□B未按期□C缺源程序文件□D无
其余评语:
成绩
教师签名:
批改日期:
年月日
1、实验内容和要求
1.实验题目
0-1背包问题的多种算法设计与分析。
2.实验要求
给定一组共n个物品,每种物品都有自己的重量wi,i=1~n和价值vi,i=1~n,在限定的总重量(背包的容量C)内,如何选择才能使得选择物品的总价值之和最高。
选择最优的物品子集放置于给定背包中,最优子集对应n元解向量(x1,…xn),xi∈{0或1}。
此实验主要研究和实现n(0<=n<=200)和C(C<=2000,C为整数)都较大的情形,随机产生n个物品的重量向量wi(1<=wi<=100,wi为整数)和价值向量vi(1<=vi<=100,vi为整数)。
用3种以上的方法求解0-1背包问题,获得精确最优解或近似最优解皆可,并对所采用的多种算法从运行时间、寻找是否为最优解、能够求解的问题规模等方面进行对比和分析。
3.输入输出
(1)输入:
采用文件输入的形式每组测试数据包含n+1行,第1行为C和n,表示背包容量为C且有n个物品,接下来n行是这n个物品的重量wi和价值vi。
背包容量和物品重量都为整数。
n,C,wi,vi范围如上所述。
(2)输出:
输出n+1行,第1行为所选物品的最大价值之和,接下来n行为装入背包的物品所对应的n元最优解向量(x1,…xn),xi∈{0或1},但每行以"ixi"形式输出。
2、算法详细设计
本次综合性实验选用三种算法来完成0-1背包问题,分别是回溯法...
1.算法伪代码
(1)回溯法:
voidBacktrack(inti,intcv,intcw)
{//i:
递归深度cv:
当前总价值cw:
当前总重量
intj;
if(i>物品数量)
{//判断当前总价值是否为最优
if(cv>所选物品最大价值之和)
{
最优总价值=cv;//更新当前最优总价值为当前总价值
更新最优解向量;
}
}
else
{
for(j=0;j<=1;j++)//for循环对物品i装与不装两种情况进行讨论
{
当前物品选取情况=j;
if(总重量不大于背包容量)
{
更新当前总重量cw+=当前物品重量*当前物品选取情况;
更新当前总价值cv+=当前物品价值*当前物品选取情况;
Backtrack(i+1,cv,cw);//递归继续进行选取
返回当前总价值和当前总重量;
}
}//当j>1时,for循环结束
}
}//当i=1时,若已测试完所有选取方案,外层调用全部结束
(2)
(3)
2.数据类型定义
intn;//物品数量0~200
intc;//背包容量<=2000
intcv;//当前背包物品总价值
intcw;//当前背包物品总重量
intbestp;//所选物品最大价值之和
intv[200];//物品价值数组1~100
intw[200];//物品重量数组1~100
intx[500];//辅助数组暂存物品选取情况
intbestx[200];//最优解向量
3.主程序及其模块之间的调用关系
4.算法分析
0-l背包问题是子集选取问题。
回溯法是一种系统地搜索问题解答的方法。
为了实现回溯,首先需要为问题定义一个解空间,解空间可用子集树表示。
这个解空间必须至少包含问题的一个解(可能是最优的)。
回溯法中一旦定义了解空间的组织方要选择一个对象的子集,将它们装入背包,以便获得的收益最大,则解空间应组织成子集树的形状。
首先形成一个递归算法,去找到可获得的最大收益。
然后,对该算法加以改进,形成代码,改进后的代码可找到获得最大收益时包含在背包中的对象的集合。
具体设计分析如下:
考虑到每种物品只有2种选择,即装入背包或不装入背包,并且物品数和背包容量已给定,要计算装入背包物品的最大价值之和以及最优装入方案解向量,用回溯法搜索子集树的算法进行求解。
(1)物品有n种,背包容量为C,分别用v[i]和w[i]存储第i种物品的价值和重量,用
x[i]标记第i种物品是否装入背包,用bestx[i]存储第i种物品的最优装载方案;
(2)用递归函数Backtrack(i,cp,cw)来实现回溯法搜索子集树,其中形式参数i表示递归深度,n用来控制递归深度,形式参数cp和cw表示当前总价值和总重量,bestp表示当前
最优总价值:
①若i>n,则算法搜索到一个叶结点,判断当前总价值是否最优:
a.若cp>bestp,更新当前最优总价值为当前总价值(bestp=cp):
更新装载方案(即bestx[i]=x[i](1<=i<=n));
②采用for循环对物品i装与不装两种情况进行讨论(0<=j<=1):
a.x[i]=j;
b.若总重量不大于背包容量(cw+x[i]*w[i]<=c),则更新当前总价值和总重
量(cw+=w[i]*x[i],cp+=p[i]*x[i]),对物品i+1调用递归函数
Backtrack(i+1,cp,cw)继续进行装载;
c.函数Backtrack(i+1,cp,cw)调用结束后则返回当前总价值和总重量
(cw-=w[i]*x[i],cp-=p[i]*x[i]);
d.当j>1时,for循环结束;
③当i=1时,若已测试完所有装载方案,外层调用就全部结束;
(3)主函数调用一次backtrack(1,0,0)即可完成整个回溯搜索过程,最终得到的bestp和bestx[i]即为所选物品最大价值之和和最优解向量
三、算法调试和测试:
1.问题及解决方案
2.算法改进设想(时空分析方面)
3.测试用例及自拟测试实例
初始过程中使用了三种类型的测试样例。
一种是“0-1背包问题测试数据(提供参考).xls”文件里面的数据,另外一个是书本上面提供的测试样例,还有一种是个人设计的测试样例。
(1)测试可以全部放进背包:
(2)不能全部放进背包的:
4.调试的经验和体会
在做算法的过程中一定要细心,有时候就是一个小小的失误都可以将自己的思维卡在一个地方一整天。
四、算法对比
算法类型
运行时间()
是否为最优解
求解的问题规模
回溯
2.678s
是
忽视问题规模
5、附录多种算法实现清单
#include
#include
#include
#include
usingnamespacestd;
intn;//物品数量0~200
intc;//背包容量<=2000
intbestp;//所选物品最大价值之和
intbestx[200];//最优解向量
intv[200];//物品价值数组1~100
intw[200];//物品重量数组1~100
intx[10000];//辅助数组暂存物品选种情况
voidBacktrack(inti,intcv,intcw)
{
intj;
if(i>n)//回溯结束
{
if(cv>bestp)
{
bestp=cv;
for(i=0;i<=n;i++)bestx[i]=x[i];
}
}
else
{
for(j=0;j<=1;j++)
{
x[i]=j;
if(cw+x[i]*w[i]<=c)
{
cw+=w[i]*x[i];
cv+=v[i]*x[i];
Backtrack(i+1,cv,cw);
cw-=w[i]*x[i];
cv-=v[i]*x[i];
}
}
}
}
intmain()
{
clock_tstart,finish;/*精确到ms(毫秒)级的时间*/
doubleduration;/*测量一个事件持续的时间*/
start=clock();
intcv=0;//当前背包物品总价值
intcw=0;//当前背包物品总重量
inti,k;
bestp=0;
cout<<"0-1背包问题—回溯法:
"< cout<<"(by何熠辉)"< while(k=1) { cout< 0~2000): "; cin>>c; cout< 0~200): "; cin>>n; cout< 1~100): "< for(i=1;i<=n;i++) { cin>>w[i]; } cout< 1~100): "< for(i=1;i<=n;i++) { cin>>v[i]; } Backtrack(1,cv,cw); cout< "< cout< 未选,1: 选中): "< for(i=1;i<=n;i++) { cout< } cout< cin>>k; } return0; finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; printf("%fseconds\n",duration);/*此duration单位为秒*/ }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 综合性 实验 报告