背包问题的回溯法求解实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

背包问题的回溯法求解实验报告

————————————————————————————————作者:————————————————————————————————日期:

一、实验目的

(1)理解回溯法的思想。

(2)掌握一些经典的问题解决方法。

二、实验内容与实验步骤

0-1背包问题

★问题描述

给定n种物品和一背包。物品i的重量是wi>0,其价值为vi>0,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最

大?

★编程任务

利用回溯法试设计一个算法求出0-1背包问题的解,也就是

求出一个解向量xi

(xi = 0 或1,xi = 0表示物体i不放入背包,xi =1表示

把物体i放入背包),

使得尽量多的价值装入背包。

★数据输入

由文件input.txt提供输入数据n,c,及每个物品的重量w[ ]和价值v[ ]。

★结果输出

程序运行结束时,将最优解输出到文件output.txt中。

输入文件示例输出文件示例

input.txt output.txt

1 1 0 1

4

5

2 1

3 2

12 10 20 15

三、实验环境

操作系统Windows 7

调试软件VC++6.0

上机地点综合楼211

四、问题分析

(1)分析要解决的问题,给出你的思路,可以借助图表等辅助表达。

01背包问题用回溯法实现就是要枚举其所有的解空

间,时间复杂度为(2)n

O左右。

搜索的具体方法如下:

对于每一个物品i,对于该物品只有选与不选2个决

策,总共有n个物品,可以顺序依次考虑每个物品,这

样就形成了一棵解空间树:

基本思想就是遍历这棵树,以枚举所有情况,最后

进行判断,如果重量不超过背包容量,且价值最大的

话,该方案就是最后的答案。

利用回溯算法写还可以加入一些优化,进行剪枝,

因为很多情况是没有意义的,例如当重量大于背包容量

的时候,没有必要对剩下的物品再来决策了。或者将剩

下的所有物品都选取其总价值也没有目前已经求得的方

案的价值还大的话,也是可以剪枝的。

(2)分析利用你的想法解决该问题可能会有怎样的时空复杂度。

O

时间复杂度估计:(2)n

因为物品只有选与不选2个决策,而总共有n个物

O。

品,所以时间复杂度为(2)n

空间复杂度估计:()

O n

因为递归栈最多达到n层,而且存储所有物品的信息也只需要常数个一维数组,所以最终的空间复杂度为()

O n。

五、问题解决

(1)根据对问题的分析,写出解决办法。

根据上面的分析,搜索的具体方法如下:

对于每一个物品i,对于该物品只有选与不选2个决

策,总共有n个物品,可以顺序依次考虑每个物品,这样

就形成了一棵解空间树,由父亲节点往下搜索的时候,

往左表示选择该物品,并且将该物品的重量和价值追加

到总重量和总价值中,最后,当到达第n+1层的时候,表

示所有的物品都已经决策完了,可以比较和更新最优

值。

当所有的分支和节点都遍历完时,此时的最优值就

是原问题的最优值。

优化方法:

剪枝一:可以进行剪枝,因为很多情况是没有意义

的,当重量大于背包容量的时候,没有必要对剩下的物

品再来决策了。

剪枝二:将剩下的所有物品都选取其总价值也没有

目前已经求得的方案的价值还大的话,也可以返回。

(1)描述你在进行实现时,主要的函数或操作内部的主要算法;分析这个算法的时、空复杂度,并说明你设计的巧妙之处,如有创新,将其清晰的表述。

void Knapsack(Typep p[ ], Typew w[ ], Typew c, int n)

{ //为Knap::Backtrack 初始化

Typew W = 0;

Typep P = 0;

FILE *fp;

Object * Q = new Object[n];

for ( int i = 1; i <= n; i++ ) {

Q[ i-1]. ID = i;

Q[ i-1]. d =1.0*p[i]/w[i];

P += p[i];

W += w[i];

}

Sort( Q, n);//对背包里的物品按性价比排序

Knap < Typew, Typep > K;

K.p = new Typep[ n+1 ];

K.w = new Typew[ n+1 ];

K.x = new int[ n+1 ];

for (i = 1; i <= n; i++){

K.p[i] = p[ Q[i-1].ID];

K.w[i] = w[ Q[i-1].ID];

}

K.cp = 0;

K. cw = 0;

K.c = c;

K.n = n;

K.bestp = 0;

// 回溯搜索

K.Backtrack(1);

delete [ ] Q;

delete [ ] K.w;

delete [ ] K.p;

if ((fp=fopen("output.txt","w"))==NULL)

{

fprintf(stderr, "Cannot open input file.\n");

exit(0);

}

fprintf(fp,"%d,%d,%d,%d",K.x[4],K.x[1],K.x[2],K.x[3]);

fclose(fp);

cout<<"当前最优装配:";

cout<

for (i=1;i

{

cout<<" "<< K.x[i] ;

}

cout<

}

template

相关文档
最新文档