【算法设计与分析】回溯法:装载问题与批处理作业调度问题

1、装载问题的问题提出是,有一批共n个集装箱要装上2艘载重量分别为在这里插入图片描述
在这里插入图片描述
的轮船,其中集装箱i的重量为在这里插入图片描述
,且在这里插入图片描述
。问是否有一个合理的装载方案能将这n个集装箱装上这两艘轮船。
设n=4, 在这里插入图片描述
=10, 在这里插入图片描述
=12, w={5, 2, 1, 3}。采用回溯法解决该装载问题,并回答以下问题:
1)如何定义装载问题解空间?如何组织装载问题的解空间结构?
1.定义问题的解空间
首先定义问题的解空间。对于有4个集装箱要装上轮船的装载问题,其解空间由长度为4的0-1向量即{(0,0,0,0),(0,0,0,1),(0,0,1,0),(0,0,1,1),(0,1,0,0),(0,1,0,1),(0,1,1,0),(0,1,1,1),(1,0,0,0),(1,0,0,1),(1,0,1,0),(1,0,1,1),(1,1,0,0),(1,1,0,1),(1,1,1,0),(1,1,1,1)}组成。
2.建立解空间结构
装载问题的解空间结构是一棵完全二叉树。解空间树中每个结点都有左右两个分支,左分支用1标识,表示把第i个集装箱放上轮船,右分支用0标识,表示不把集装箱i放上轮船。解空间树的第i层到第i+1层边上的标号给出了变量的值,从树根到叶的任意一条路径表示解空间中的一个元素。
当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。装载问题的解空间树就是一棵子集树。子集树通常有2n个叶节点,遍历子集树需要的计算时间为O(2n)。

2)写出算法实现代码并截屏程序的运行结果。

package evelen_24;

public class Loading {
   
	//类数据成员
	static int n;//集装箱数
	static int[] w;//集装箱重量数组
	static int c;//第一艘轮船的载重量
	static int cw;//当前载重量
	static int bestw;//当前最优载重量
	static int r;//剩余集装箱重量(可选择重量和)
	static int[] x;//当前解
	static int[] bestx;//当前最优解
	
	public static void main(String[] args) {
   
		int[] ww = {
   0, 5, 2, 1, 3};
		int cc1 = 10, cc2 = 12;
		int result1 = Loading.maxLoading(ww, cc1);
		System.out.println("第一艘");
		System.out.println(result1+" "+(r-result1));
		
		int result2 = Loading.maxLoading(ww
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值