实验五、优先队列式分支限界法解装载问题.doc_第1页
实验五、优先队列式分支限界法解装载问题.doc_第2页
实验五、优先队列式分支限界法解装载问题.doc_第3页
实验五、优先队列式分支限界法解装载问题.doc_第4页
实验五、优先队列式分支限界法解装载问题.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验五 优先队列式分支限界法解装载问题09电信实验班 I09660118 徐振飞1、 实验题目实现书本P201所描述的优先队列式分支限界法解装载问题2、 实验目的(1) 掌握并运用分支限界法基本思想(2) 运用优先队列式分支限界法实现装载问题(3)比较队列式分支限界法和优先队列式分支限界法的优缺点三、实验内容和原理(1)实验内容有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为Wi,且,要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。如果有,请给出方案。(2)实验原理解装载问题的优先队列式分支限界法用最大优先队列存储活结点表。活结点x在优先队列中的优先级定义为从根结点到结点x的路径所相应的载重量再加上剩余集装箱的重量之和。优先队列中优先级最大的活结点成为下一个扩展结点。优先队列中活结点x的优先级为x.uweight。以结点x为根的子树中所有结点相应的路径的载重量不超过x.uweight。子集树中叶结点所相应的载重量与其优先级相同。因此在优先队列式分支限界法中,一旦有一个叶结点成为当前扩展结点,则可以断言该叶结点所相应的解即为最优解,此时终止算法。上述策略可以用两种不同方式来实现。第一种方式在结点优先队列的每一个活结点中保存从解空间树的根结点到该活结点的路径,在算法确定了达到最优值的叶结点时,就在该叶结点处同时得到相应的最优解。第二种方式在算法的搜索进程中保存当前已构造出的部分解空间树,在算法确定了达到最优值的叶结点时,就可以在解空间树中从该叶结点开始向根结点回溯,构造出相应的最优解。在下面的算法中,采用第二种方式。4、 源程序import java.util.Comparator;import java.util.Iterator;import java.util.PriorityQueue;import java.util.Scanner;public class test5 public void addLiveNode(PriorityQueue H,bbnode E,int wt,boolean ch,int lev)bbnode b = new bbnode(E,ch);HeapNode N = new HeapNode(b, wt, lev);H.add(N);public int maxLoading(int w,int c,int n,boolean bestx)PriorityQueue H = new PriorityQueue(1000,new comp(); /*生成最大堆*/int r = new intn+1;rn = 0;for(int j=n-1;j0;j-)rj = rj+1 + wj+1;int i = 1;bbnode E = new bbnode(null,false);int Ew = 0;while(i!=n+1)if(Ew+wi0;j-)bestxj = E.Lchild;E = E.parent;return Ew;public static void main(String args)System.out.println(请输入物品总数:);Scanner sc1 = new Scanner(System.in);int n = sc1.nextInt();int w = new intn+1;System.out.println(请输入物品重量:);Scanner sc2 = new Scanner(System.in);for(int i=1;i=n;i+)wi = sc2.nextInt();System.out.println(请输入箱子重量:);Scanner sc3 = new Scanner(System.in);int c1 = sc3.nextInt();int c2 = sc3.nextInt();boolean bestx = new boolean100;test5 t = new test5();/处理第一个箱子System.out.println(first:+t.maxLoading(w, c1, n, bestx);System.out.print(可装重为:);int count = 0;for(int i=1;i=n;i+)if(bestxi)count+;System.out.print(wi+ ); /*输出一个可行方案*/System.out.println();/*处理第二个箱子*/int m = n - count;int ww = new intm+1;int k = 1;for(int i=1;i=n;i+)if(!bestxi)wwk = wi;k+;bestxi = false;System.out.println();System.out.println(second:+t.maxLoading(ww, c2, m, bestx);System.out.print(可装重为:);for(int i=1;i=m;i+)if(bestxi)System.out.print(wwi+ ); /*输出一个可行方案*/*堆结点类*/class HeapNodebbnode ptr;int uweight;int level;public HeapNode()public HeapNode(bbnode ptr,int uweight,int level)this.ptr = ptr;this.uweight = uweight;this.level = level;public String toString()return +this.uweight;class bbnodebbnode parent;boolean Lchild;public bbnode(bbnode node,boolean ch)this.parent = node;this.Lchild = ch;/定义比较器类class comp implements ComparatorOverridepublic int compare(HeapNode o1, HeapNode o2) int dif = o1.uweight-o2.uweight; if(dif0) return -1; else if(dif=0) return 0; else return 1; 5、 实验结果和分析a.输入格式说明:(1)首先输入物品总数量(2)第二栏输入所有物品重量(3)第三栏输入2个箱子的重量b.输出格式说明:(1) 首先输出first的字样,后面的数字表示第一个箱子所能装载的最大重量,紧接着的一行输出一种可以选择装载的方案(2) Second字样后面的数字表示第二个箱子所能装载的最大重量,紧接着的一行输出一种可行方案经过分析,上述结果正确。6、 实验心得和体会通过实验,了解了分支限界法的基本思想。掌握了利用优先队列式分支限界法实现具体的装载问题。由于本次实验利用java.util包下的PriorityQueue代替算法中的最大堆,免去了编写实现最大堆的程序代码(但这并不表示我不会编写最大堆程序,在这次实验中,最大堆的实现并不是主要部分),所以本次实验实现的相对顺利。存在的问题及分析:在此例中最合理的装载方法是第一个箱子装载重量为:10 50的物品,第二个箱子装载重量为20 20的物品。分析:由于程序中先装载第一个箱子,然后再装载第二个箱子;而分支限界法一旦扩展结点到达叶子结点时,程序便终止退出。所以在此例中当第一个箱子装满后(此时重量为10 20 30的物品已

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论