回溯法分支限界法解01背包问题计算机算法设计与分析实验报告Word文档下载推荐.docx
- 文档编号:15996351
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:21
- 大小:395.53KB
回溯法分支限界法解01背包问题计算机算法设计与分析实验报告Word文档下载推荐.docx
《回溯法分支限界法解01背包问题计算机算法设计与分析实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《回溯法分支限界法解01背包问题计算机算法设计与分析实验报告Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
2.要求交互输入背包容量,物品重量数组,物品价值数组;
3.要求显示结果。
三、实验环境和工具:
操作系统:
win7操作系统
开发工具:
eclipse3.4、jdk1.6
开发语言:
java
四、实验结果与结论:
(经调试正确的源程序和程序的运行结果)
1.1、回溯法求解0-1背包问题源代码:
packagecn.lgh;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.util.Arrays;
importjava.util.Comparator;
/**
*回溯法解0-1背包问题。
*@author蓝冠恒
*/
publicclassBTKnapsack{
doublec;
//背包重量
intn;
//物品总数
double[]w;
//物品重量数组
double[]p;
//物品价值数组
doublecw;
//当前重量
doublecp;
//当前价值
doublebestp;
//当前最优价值
/**
*@parampp
*物品价值数组
*@paramww
*物品重量数组
*@paramcc
*背包重量
*@return最优价值
publicdoubleknapsack(doublepp[],doubleww[],doublecc){
c=cc;
n=pp.length;
cw=0.0;
cp=0.0;
bestp=0.0;
Element[]q=newElement[n];
for(inti=0;
i<
n;
i++){
q[i]=newElement(i+1,pp[i]/ww[i]);
}
Arrays.sort(q,newElemComparator());
p=newdouble[n+1];
w=newdouble[n+1];
for(inti=1;
=n;
p[i]=pp[q[i-1].id-1];
w[i]=ww[q[i-1].id-1];
backtrack
(1);
returnbestp;
}
//回溯过程
privatevoidbacktrack(inti){
if(i>
n){//达到叶节点
bestp=cp;
return;
if(cw+w[i]<
=c){
cw+=w[i];
cp+=p[i];
backtrack(1+i);
cw-=w[i];
cp-=p[i];
if(bound(i+1)>
bestp){
//计算上界值
privatedoublebound(inti){
doublecleft=c-cw;
doublebound=cp;
//以物品单位重量价值递减顺序装入物品
while(i<
=n&
&
w[i]<
=cleft){
cleft-=w[i];
bound+=p[i];
i++;
//装满背包
if(i<
=n){
bound+=p[i]*cleft/w[i];
returnbound;
*物体编号和单位重量价值载体。
publicclassElement{
intid;
//编号
doubled;
//单位重量价值
publicElement(intid,doubled){
this.id=id;
this.d=d;
*比较器
publicclassElemComparatorimplementsComparator<
Object>
{
publicintcompare(Objectobject1,Objectobject2){
Elementelement1=(Element)object1;
Elementelement2=(Element)object2;
if(element1.d<
element2.d){
return1;
}else{
return0;
}
publicstaticvoidmain(String[]args){
Stringinput;
Stringflag;
doublecapacity=0;
double[]pp;
double[]ww;
doublebestP=0.0;
BTKnapsackbtKnapsack=newBTKnapsack();
BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));
do{
try{
do{
System.out.println("
请选择数字功能键:
1--输入数据,2--退出系统"
);
flag=in.readLine().trim();
}while(!
(flag.equals("
1"
)||flag.equals("
2"
)));
if(flag.equals("
)){
break;
}
请输入各物品重量,数据之间必须以顿号间隔分开!
"
input=in.readLine().trim();
input=in.readLine().replaceAll("
"
"
}while(input.equals("
));
if(input.equals("
)){
Stringdatas[]=input.split("
[、]"
intn1=datas.length;
pp=newdouble[n1];
ww=newdouble[n1];
for(inti=0;
n1;
ww[i]=Double.parseDouble(datas[i]);
请输入各物品价值,数据之间必须以顿号间隔分开!
datas=input.split("
intn2=datas.length;
if(n1!
=n2){
输入数据个数不一致,重新输入"
continue;
pp[i]=Double.parseDouble(datas[i]);
请输入背包的容量:
capacity=Double.parseDouble(input);
bestP=btKnapsack.knapsack(pp,ww,capacity);
System.out.println("
回溯法解得最优价值:
+bestP);
}catch(Exceptione){
e.printStackTrace();
}while(true);
}
1.2、运行结果:
2.1、分支限界法求解0-1背包问题源代码:
*分支界限法解0-1背包问题。
publicclassBBKnapsack{
int[]bestx;
//最优解
MaxHeapmaxHeap=newMaxHeap();
//活节点优先队列
//计算节点所对应的节点的上界
doubleb=cp;
//以物品单位重量价值递减装填剩余容量
b+=p[i];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 回溯 分支 限界 01 背包 问题 计算机 算法 设计 分析 实验 报告