版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三01背包问题不同算法设计、分析与对比一问题描述给定n种物品和一背包。物品i的重量是w,其价值为v,背包的容量为c。ii问题:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。说明:在选择装入背包的物品时,对每种物品i只有两个选择,装入背包或不装入背包,也不能将物品装入背包多次。二实验内容与要求实验内容:1. 分析该问题适合采用哪些算法求解(包括近似解)。动态规划、贪心、回溯和分支限界算法。2. 分别给出不同算法求解该问题的思想与算法设计,并进行算法复杂性分析。动态规划:递推方程:m(i,j)=maxm(il,j),m(il,jwi)+vij>=wi;m(i-1,j)j&l
2、t;wi;时间复杂度为O(n).贪心法:算法思想:贪心原则为单位价值最大且重量最小,不超过背包最大承重量为约束条件。也就是说,存在单位重量价值相等的两个包,则选取重量较小的那个背包。但是,贪心法当在只有在解决物品可以分割的背包问题时是正确的。贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。用贪心法设计算法的特点是一步一步地进行,根据某个优化测度(可能是目标函数,也可能不是目标函数),每一步上都要保证能获得局部最优解。每一步只考虑一个数据,它的选取应满足局部优化条件。若下一个数据与部分最优解连在一起不再是可行解时,就不把该数
3、据添加到部分解中,直到把所有数据枚举完,或者不能再添加为止。回溯法:回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(boundingfunction)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。这种具有限界函数的深度优先生成法称为回溯法。对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。在搜索解空间树时,只要其左儿子结点是一个可行结点,搜索就进入左子树。当右子树中有可能包含最优解时就进入右子树搜索。时间复杂度为:O(2n)空间复杂度为:0(n)分支限界算法:首先,要对输入数据进行预处理,将各物品依其单位重量价值从
4、大到小进行排列。在优先队列分支限界法中,节点的优先级由已装袋的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和。算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。当扩展到叶节点时为问题的最优值。3. 设计并实现所设计的算法。4. 对比不同算法求解该问题的优劣。这动态规划算法和贪心算法是用来分别解决不同类型的背包问题的,当一件背包物品可以分割的时候,使用贪心算法,按物品的单位体积的价值排序,从大到小取即可。当一件背包物品不
5、可分割的时候,(因为不可分割,所以就算按物品的单位体积的价值大的先取也不一定是最优解)此时使用贪心是不对的,应使用动态规划。设计方法时间复杂度优点缺点动态规划Minnc,2可求得最优决策序列速度慢贪心方法O(2n)速度较快很难得到最优解回溯法O(n2n)能够得到最优解时间复杂度较高分支限界法O(2n)速度较快,易求解占用内存大,效率不咼5. 需要提交不同算法的实现代码和总结报告。动态规划方法:publicclassKnapsackpublicstaticvoidmain(Stringargs)intvalue=0,60,100,120;intweigh=0,10,20,30;intweight
6、=50;Knapsack1(weight,value,weigh);publicstaticvoidKnapsack1(intweight,intvalue,intweigh)intv=newintvalue.length;intw=newintweigh.length;intc=newintvalue.lengthweight+1;intd=newint100;for(inti=0;i<value.length;i+)vi=valuei;wi=weighi;for(inti=1;i<value.length;i+)for(intk=1;k<=weight;k+)if(wi&
7、lt;=k)cik=max(ci-1k,ci-1k-wi+vi);elsecik=ci-1k;System.out.println(cvalue.length-1weight);privatestaticintmax(inti,intj)intk=i>j?i:j;returnk;贪心法:publicclassGreedyKnapSackpublicstaticvoidmain(Stringargs)intvalue=0,60,100,120;intweigh=0,10,20,30;intweight=50;Knapsack1(weight,value,weigh);privatestat
8、icvoidKnapsack1(intweight,intv,intw)intn=v.length;doubler=newdoublen;intindex=newintn;for(inti=0;i<n;i+)ri=(double)vi/(double)wi;/按单位重量价值ri=vi/wi降序排列doubletemp=0;for(inti=0;i<n-1;i+)for(intj=i+1;j<n;j+)if(ri<rj)temp=ri;ri=rj;rj=temp;intx=indexi;indexi=indexj;indexj=x;/排序后的重量和价值分别存到w1和v1中
9、intw1=newintn;intv1=newintn;for(inti=0;i<n;i+)w1i=windexi;v1i=vindexi;System.out.println(Arrays.toString(w1);Systemout.println(Arrays.toString(v1);ints=0;/包内现存货品的重量intvalue=0;/包内现存货品总价值for(inti=0;i<n;i+)if(s+w1i<weight)value+=v1i;s+=w1i;+value);System.out.println("背包中物品的最大总价值为"回溯法
10、:publicclassBacktrackKnapSackpublicstaticvoidmain(Stringargs)intvalue=0,60,100,120;intweigh=0,10,20,30;intweight=50;Knapsack1(weight,value,weigh);privatestaticvoidKnapsack1(intweight,intv,intw)intn=v.length;doubler=newdoublen;intindex=newintn;for(inti=0;i<n;i+)ri=(double)vi/(double)wi;indexi=i;/按
11、单位重量价值ri=vi/wi降序排列doubletemp=0;for(inti=0;i<n-1;i+)for(intj=i+1;j<n;j+)if(ri<rj)temp=ri;ri=rj;rj=temp;intx=indexi;indexi=indexj;indexj=x;/排序后的重量和价值分别存到w1和v1中intw1=newintn;intv1=newintn;for(inti=0;i<n;i+)w1i=windexi;v1i=vindexi;/调用函数KnapSackBackTrack(),输出打印装完物品以后的最大价值KnapSackBackTrack(w1,
12、v1,w1.length,weight);privatestaticvoidKnapSackBackTrack(intw1,intv1,intlength,intweight)intCurrentWeight=0;intCurrentValue=0;intmaxValue=0;inti=0;intn=v1.length;while(i>=0)if(CurrentWeight+w1i<weight)CurrentWeight+=w1i;CurrentValue+=v1i;i+;elsebreak;if(i<n)+maxValue);maxValue=CurrentValue;S
13、ystem.out.println("1背包中物品的最大总价值为"分支限界算法:packagebag01b;importjava.util.ArrayList;publicclassbag01dopublicstaticvoidmain(Stringargs)/TODOAuto-generatedmethodstubArrayList<object>objects=newArrayList<>();objects.add(newobject(10,60);objects.add(newobject(20,100);objects.add(newobj
14、ect(30,120);bagb=newbag(50,objects);b.findmaxvalue();b.show();packagebag01b;importjava.util.ArrayList;importjava.util.Collections;importjava.util.PriorityQueue;publicclassbagprivateintbagv;privateArrayList<object>objects;privateintmaxvalue;privateArrayList<object>result_objects;publicbag
15、(intv,ArrayList<object>o)super();this.bagv=v;this.objects=o;this.maxvalue=0;this.result_objects=null;Collections.sort(objects);publicvoidshow()System.out.println("maxvalue:"+this.maxvalue);System.out.println("theobjectwhenmaxvalue:"+this.result_objects);publicvoidfindmaxval
16、ue()PriorityQueue<Node>enode=newPriorityQueue<>();Nodenode=newNode(0,null,bagv,this.objects);enode.offer(node);while(true)if(enode.isEmpty()break;node=enode.poll();if(node.isend()this.maxvalue=node.get_bag_value();this.result_objects=newArrayList<>(node.get_in_bag_object();return;i
17、nti=node.get_node_in();objectiobject=this.objects.get(i);if(node.get_bag_weight()+iobject.getweight()<=this.bagv)ArrayList<object>newnodeinbag=newArrayList<object>(node.get_in_bag_object();newnodeinbag.add(iobject);intnewnodebagv=node.get_bag_leftv()-iobject.getweight();Nodenewnode=ne
18、wNode(i+1,newnodeinbag,newnodebagv,this.objects);enode.add(newnode);if(newnode.get_bag_value()>this.maxvalue)this.maxvalue=newnode.get_bag_value();this.result_objects=newArrayList<>(newnode.get_in_bag_object();Nodenewnode=newNode(i+1,node.get_in_bag_object(),node.get_bag_leftv(),this.object
19、s);if(newnode.get_bag_prio()>this.maxvalue)enode.add(newnode);packagebag01b;importjava.util.ArrayList;publicclassNodeimplementsComparable<Node>privateintnode_in;privateArrayList<object>inbag_object;privateArrayList<object>outbag_object;privateintleftv;privateintprio;publicNode(i
20、nti,ArrayList<object>in,intl,ArrayList<object>out)super();this.node_in=i;if(in=null)in=newArrayList<>();this.inbag_object=in;this.leftv=l;this.outbag_object=out;this.prio=this.find_prio();privateintfind_prio()/TODOAuto-generatedmethodstubintbag_left=this.leftv;intp=this.get_bag_val
21、ue();inti=this.node_in;objectiobject=null;while(true)if(i>=this.inbag_object.size()break;iobject=this.inbag_object.get(i);if(iobject.getweight()>bag_left)break;bag_left-=iobject.getweight();p+=iobject.getvalue();i+;if(i<=this.inbag_object.size()-1)p+=iobject.getvw()*bag_left;returnp;publici
22、ntget_bag_weight()intw=0;for(objecto:this.inbag_object)w+=o.getweight();returnw;publicintget_bag_value()intw=0;for(objecto:this.inbag_object)w+=o.getvalue();returnw;OverridepublicintcompareTo(Nodeo)/TODOAuto-generatedmethodstubif(this.prio>o.prio)return-1;if(this.prio<o.prio)return1;return0;publicbooleanisend()if(this.node_in=this.outbag_object.size()returntrue;elsereturnfalse;publicArrayList<object>get_in_bag_object()returnthis.inbag_object;publicintget_node_in()retur
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 花字课件教学课件
- 吸墨白板课件教学课件
- 2024固定资产业权转让合同
- 2024年店铺买卖与租赁合同一本通
- 2024年广告装饰新篇章:工程合同全新范本
- 2024年办公室装修设计实施合同
- 2024年度供应链管理合同与物流服务协议
- 2024年工程项目人力资源配置与管理合同
- 2024年度国际广告传媒合作合同
- 2024光伏发电设备采购合同
- 银行业信息系统灾难恢复管理规范
- 医院重点岗位工作人员轮岗制度
- 2023光伏发电工程项目安全文明施工方案
- 带式输送机胶带安装
- 陈育民对FLAC3D常见问题的解答概要
- 专利文献检索方法与步骤课件
- 第5讲-申论大作文课件
- 大咯血的护理及急救课件
- 读《学生的精神》有感
- Module 5 Museums模块测试题二(含答案)(外研版九年级上册)
- 张家爷爷的小花狗2
评论
0/150
提交评论