回溯算法装载问题_第1页
回溯算法装载问题_第2页
回溯算法装载问题_第3页
回溯算法装载问题_第4页
回溯算法装载问题_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、实验六  回溯算法(2学时) 一、实验目的与要求1、掌握装载问题的回溯算法;2、初步掌握回溯算法;二、实验题有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且 装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。三、实验提示void backtrack (int i) / 搜索第i层结点 if (i > n) / 到达叶结点 更新最优解bestx,bestw;return; r -= wi; if (cw + wi <= c) / 搜索左子树 xi = 1; cw += wi; ba

2、cktrack(i + 1); cw -= wi; if (cw + r > bestw) xi = 0; / 搜索右子树 backtrack(i + 1); r += wi; 4、 实验代码方法1:import java.util.*;/* * 回溯法解决装载问题 * author Administrator * */ public class demo public static int n; /集装箱数 public static int first_weight; /第一艘载重量 public static int beautif_weight; /当前最优载重量 public

3、static int arr_weight; /集装箱重量数组 public static int xx; / public static int bestxx; public static int maxLoadingRE(int w, int c, int bestx) /递归回溯 n = w.length; first_weight = c; beautif_weight = 0; arr_weight = w; bestxx = bestx; xx = new intn; int r = 0; /剩余集装箱重量,未进行装载的重量 for (int i = 0; i < n; i+

4、) r += arr_weighti; trackback(0, 0, r); return beautif_weight; /到达层数,目前装载的重量,未装载的重量 private static void trackback(int i, int cw, int r) if (i = n) /到达叶结点 for (int j = 0; j < n; j+) bestxxj = xxj; beautif_weight = cw; return; /只是一次出栈操作,栈非空还要继续执行 if (cw + arr_weighti <= first_weight) /已装载的加上要装载的

5、小于第一个的载重量 xxi = 0; /0代表装在第一个上,1代表装在第二个上 trackback(i + 1, cw + arr_weighti, r); /试图装载下一个集装箱,r是针对第一个装的重量,因此装在第一个里不需要减,但装在第二个时就要减去该重量 if (r - arr_weighti > beautif_weight) /已装载的加上要装载的已经大于第一个的载重量,并且用总的载重量r减去当前要装载的还比最好的载重量大 xxi = 1; /放到第二个上 trackback(i + 1, cw, r - arr_weighti); public static int maxL

6、oading(int w, int c, int bestx) int i = 0; /当前层 int n = w.length; /层总数 int x = new intn; /x0, i为当前选择路径 Arrays.fill(x, -1); /初始化为-1,0表示选择第一个,1表示选择第二个 int bestw = 0; /当前最优装载重量 int cw = new intn; /当前载重量 int r = new intn; /剩余集装箱容量 int tor = 0; for (int item : w) /item取出w中的值,进行相加 tor += item; r0 = tor;/要

7、装载的重量 cw0 = 0; /搜索子树 while (i > -1) do xi += 1; if (xi = 0) /选择放在第一个(左子树) if (cwi + wi <= c) if (i < n - 1) cwi + 1 = cwi + wi; ri + 1 = ri; break; /能放下就直接跳出这个do-while循环 else /选择放在第二个(右子树) if (ri - wi > bestw) /剪枝函数,没有最优解好的话xi会自增到2,不会进入下面的if (xi < 2) if (i < n - 1) ri + 1 = ri - wi

8、; cwi + 1 = cwi; break; while (xi < 2); /对于放不下的在这里判断后才能取右子树 if (xi < 2) if (i = n - 1) for (int j = 0; j < n; j+) bestxj = xj; if (xi = 0) bestw = cwi + wi; else bestw = cwi; else i+; xi = -1; else /当xi=2时,说明已经遍历完两个叶节点,应向上一层继续遍历其它节点 i-; return bestw; public static void main(String args) int

9、 w = 0,10,40,40; int n = w.length; int c = 50; int bestx = new intn; System.out.println("重量分别为:"); for(int ws:w) System.out.print(","+ws); System.out.println("n"); int bestw = maxLoadingRE(w, c, bestx); System.out.println("回溯选择结果为: " + bestw); System.out.print

10、ln(Arrays.toString(bestx); 方法2:public class demo2 public static void main(String args) int n=3,m;int c=50,c2=50;int w=0,10,40,40;int bestx=new intw.length;demo2 demo2=new demo2(); m=demo2.MaxLoading(w, c, n, bestx); System.out.println("轮船的载重量分别为:");System.out.println("c(1)="+c+&q

11、uot;,c(2)="+c2);System.out.println("待装集装箱重量分别为:");System.out.print("w(i)=");for (int i=0;i<=n;i+)System.out.print(","+wi);System.out.println("");System.out.println("最优装载量为:");System.out.println("m(1)="+m);System.out.print("x(i)

12、=");for (int i=0;i<=n;i+)System.out.print(""+bestxi);System.out.println("");int m2=0;for (int j=1;j<=n;j+)m2=m2+wj*(1-bestxj); System.out.println("回溯选择结果为:"+m2);if(m2>c2) System.out.println("因为m(2)大于c(2),所以原问题无解!");int MaxLoading(int w,int c,int n,int bestx)/迭代回溯法,返回最优载重量及其相应解,初始化根结点int i=1;/当前层,x1:i-1为当前路径int x=new intn+1;int bestw=0; /当前最优载重量int cw=0; /当前载重量int r=0; /剩余集装箱重量for (int j=1;j<=n;j+)r+=wj;while(true)/搜索子树 while(i<=n &&cw+wi<=c)/进入左子树r-=wi;cw+=wi;xi=1;i+;

温馨提示

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

评论

0/150

提交评论