- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
01背包分支限定法.doc
0—1背包问题
一、实验目的
学习掌握分支限定法思想。
二、实验内容
用分支限定法求解0—1背包问题,并输出问题的最优解。0—1背包问题描述如下:
给定n种物品和一背包。物品i的重量是Wi,其价值为Vi,背包的容量是c,问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。
三、实验条件
Jdk1.5以上
四、需求分析
对于给定n种物品和一背包。在容量最大值固定的情况下,要求装入的物品价值最大化。
五、基本思想:
对物品的选取与否构成一棵解树,左子树表示不装入,右表示装入,通过检索问题的解树得出最优解,并用结点上界杀死不符合要求的结点。
六、详细设计
/*
* Bound_Branch.java
*
* Created on 2007年6月2日, 下午6:07
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package sunfa;
public class Bound_Branch {
static double c;
static int n;
static double[]w;
static double[]p;
static double cw;
static double cp;
static int []bestX;
static MaxHeap heap;
//上界函数bound计算节点所相应价值的上界
private static double bound(int i){
double cleft=c-cw;
double b=cp;
while(i=nw[i]=cleft){
cleft-=w[i];
b+=p[i];
i++;
}
//装填剩余容量装满背包
if(i=n)
b+=p[i]/w[i]*cleft;
return b;
}
//addLiveNode将一个新的活节点插入到子集树和优先队列中
private static void addLiveNode(double up,double pp,double ww,int lev,BBnode par,boolean ch){
//将一个新的活节点插入到子集树和最大堆中
BBnode b=new BBnode(par,ch);
HeapNode node =new HeapNode(b,up,pp,ww,lev);
heap.put(node);
}
private static double bbKnapsack(){
// TODO 自动生成方法存根
//优先队列式分支限界法,返回最大价值,bestx返回最优解
//初始化
BBnode enode=null;
int i=1;
double bestp=0;//当前最优值
double up=bound(1);//当前上界
while(i!=n+1){
//非叶子节点
//检查当前扩展节点的右儿子子节点
double wt=cw+w[i];
if(wt=c){
if(cp+p[i]bestp)
bestp=cp+p[i];
addLiveNode(up,cp+p[i],cw+w[i],i+1,enode,true);
}
up=bound(i+1);
if(up=bestp)
addLiveNode(up,cp,cw,i+1,enode,false);
HeapNode node =(HeapNode)heap.removeMax();
enode=node.liveNode;
cw=node.weight;
cp=node.profit;
up=node.upperProfit;
i=node.level;
}
for(int j=n;j0;j--){
bestX[j]=(enode.leftChild)?1:0;
enode=enode.parent;
}
return cp;
}
public static double knapsack(double []pp,double []ww,double cc,int []xx){
//返回最大值,bestx返回最优解
文档评论(0)