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

最低0.47元/天 解锁文章
3066

被折叠的 条评论
为什么被折叠?



