- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回溯算法装载问题
实验六? 回溯算法(2学时)一、实验目的与要求
1、掌握装载问题的回溯算法;
2、初步掌握回溯算法;
二、实验题
有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。
三、实验提示
void backtrack (int i){// 搜索第i层结点if (i n) // 到达叶结点更新最优解bestx,bestw;return;r -= w[i];if (cw + w[i] = c) {// 搜索左子树x[i] = 1;cw += w[i];backtrack(i + 1);cw -= w[i];}if (cw + r bestw) {x[i] = 0; // 搜索右子树backtrack(i + 1);}r += w[i];}
实验代码
方法1:
import java.util.*;
/**
* 回溯法解决装载问题
* @author Administrator
*
*/
public class demo {
public static int n; //集装箱数
public static int first_weight; //第一艘载重量
public static int beautif_weight; //当前最优载重量
public 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 int[n];
int r = 0; //剩余集装箱重量,未进行装载的重量
for (int i = 0; i n; i++) {r += arr_weight[i];
}
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++) {bestxx[j] = xx[j];}beautif_weight = cw;return; //只是一次出栈操作,栈非空还要继续执行
}
if (cw + arr_weight[i] = first_weight) { //已装载的加上要装载的小于第一个的载重量xx[i] = 0; //0代表装在第一个上,1代表装在第二个上trackback(i + 1, cw + arr_weight[i], r); //试图装载下一个集装箱,r是针对第一个装的重量,因此装在第一个里不需要减,但装在第二个时就要减去该重量
}
if (r - arr_weight[i] beautif_weight) { //已装载的加上要装载的已经大于第一个的载重量,并且用总的载重量r减去当前要装载的还比最好的载重量大xx[i] = 1; //放到第二个上trackback(i + 1, cw, r - arr_weight[i]);
}
}
public static int maxLoading(int[] w, int c, int[] bestx) {
int i = 0;//当前层
int n = w.length; //层总数
int[] x = new int[n]; //x[0, i]为当前选择路径
Arrays.fill(x, -1); //初始化为-1,0表示选择第一个,1表示选择第二个 int bestw = 0;//当前最优装载重量
int[] cw = new int[n]; //当前载重量
int[] r = new int[n]; //剩余集装箱容量
int tor = 0;for (int item : w) {//item取出w中的值,进行相加tor += item;
}
r[0] = tor;//要装载的重量
cw[0] = 0;
//搜索子树
您可能关注的文档
最近下载
- 2025年湖南省长沙市中考物理试卷及答案解析 .pdf VIP
- 《给水排水设施施工及验收手册》GB50268-2023.pdf VIP
- 2024年“民用无人机及多旋翼无人机”驾驶员操控员技能与理论知识考试题库含答案.docx
- 2025年湖南省长沙市中考英语试卷及答案解析 .pdf VIP
- 第十五届全国交通运输行业“极智杯”公路收费及监控员职业技能大赛理论题库.pdf VIP
- word格式电子版个人简历模板.docx
- 重难点专题39 齐次化妙解圆锥曲线九大题型汇总(解析版).docx VIP
- 数学建模论文(副标题:摩天轮高度与时间的关系).doc
- 徐州市中医院 中医推拿保健 颈椎病诊断与治疗-人体解剖.pptx VIP
- 水肥一体化灌溉系统应用技术规程.pdf VIP
文档评论(0)