装载问题
有一批共n个集装箱要装上两艘载重量分别为c1和c2的轮船,集装箱总重量小于等于c1+c2,要求定一个合理的装载方案可将这n个集装箱装上这两艘轮船。
可以证明,如果一个给定装载问题有解,则采用下面的策略可得到最优的装载方案:
1)首先将第一艘轮船尽可能装满
2)将剩余的集装箱装上第二艘轮船
将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和接近第一艘轮船载重量c1.
该问题类似于0-1背包问题,可以用动态规划法解决。
用回溯法解装载问题时,用子集树表示其解空间显然是最合适的。
回溯法实现:
/*
* 装载问题
* 有一批共n个集装箱要装上两艘载重量分别为c1和c2的轮船
* 要求确定一个合理的装载方案可将这n个集装箱装上这两艘轮船。
*
* 解决策略:
* 1)首先将第一艘轮船尽可能装满
* 2)将剩余的集装箱装上第二艘轮船
* 将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和接近轮船载重量。
* 类似于0-1背包问题 可以使用动态规划解决
*
* 回溯法解决:
* 用子集树表示解空间
*
*
* date:2010/12/12
* auther: cm
*/
public class LoadProblem
{
private int n; //集装箱数量
private double[] w; //集装箱重量数组
private double c; //第一艘轮船的载重量
private double cw; //当前载重量
private double bestw; //最优载重量
//用于剪去不含最优解的子树
private double rw; //剩余集装箱重量
//用于构造最优解
private int[] x; //当前解
private int[] bestx; //当前最优解
public LoadProblem(double[] w, double c)
{
this.w = w;
this.c = c;
n = w.length;
x = new int[n];
bestx = new int[n];
for (int i = 0; i < n; i++)
{
rw += w[i];
}
}
//计算最优载重量
public double maxLoading()
{
backtrack(0);
return bestw;
}
//回溯算法
private void backtrack(int i)
{
//搜索第i层节点
if (i >= n) //到达页节点
{
//System.out.println("达到叶节点.............");
if (cw > bestw)
{
//System.out.println("更新bestw...........");
bestw = cw;
for (int j = 0; j < x.length; j++)
{
bestx[j] = x[j];
}
}
return;
}
//搜索子树
if (cw + w[i] <= c)
{
x[i] = 1;
cw += w[i];
backtrack(i + 1);
cw -= w[i];
}
rw -= w[i];
//搜索右子树
if (cw + rw > bestw) //剪去不含最优解的子树
{
x[i] = 0;
backtrack(i + 1);
}
rw += w[i];
}
public int[] getBestx()
{
return bestx;
}
public static void main(String[] args)
{
double[] w = {40, 40, 10};
double c1 = 50;
LoadProblem load = new LoadProblem(w, c1);
System.out.println(load.maxLoading());
int[] x = load.getBestx();
for (int i = 0; i < x.length; i++)
{
System.out.print(x[i] + " ");
}
}
}
分享到:
相关推荐
最优装载问题——回溯法 最优装载问题——回溯法 最优装载问题——回溯法
计算计算法设计与分析实验,最优装载问题 c++
最优装载问题的回溯算法,用回溯法解决装载问题的c++算法。
分支限界法解决装载问题 C++实现。 分支限界法类似于回溯法,也是一种在问题的解空间树T中搜索问题解的算法。
最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。 Input 输入的第一个为测试样例的个数T( T ),接下来有T个测试样例。每个测试样例的第一行是一个整数n( n )和一个非负数C( C )...
1 [斩尾行动]贪心算法实现哈夫曼编码; 2 用回溯法解决0-1背包问题;比较穷举法、动态规划法、贪心法实现的0-1背包...3 用回溯法编程实现装载问题,比较此装载问题与贪心法装载问题区别,思考不同算法的适用问题类型。
本例采用java编写的装载问题,采用的是FIFO队列形式,参考:算法设计与分析
问题描述 有一批集装箱要装上一艘载重量为c的轮船,其中集装箱i的重量为wi (1≤i≤n) 。 最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
装载问题描述如下:有一批共n个集装箱要装上载重量为c的轮船,其中集装箱i的重量为wi。找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
描述: 有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。 输入: 多个测例,每个测例的输入占两行。...
使用混合遗传算法来解决单个集装箱装载问题,通过优化集装箱的使用体积、数量和总值。在所提出算法的框架内,使用了一种特殊的个体二倍体表示方案,并采用了一种改进的启发式包装方法,该方法源自最深的左下填充...
最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。 编程任务: 对于给定的n个集装箱和轮船的载重量C,编程计算装入最多时的集装箱个数。 Input 输入由多组测试数据组成。 每组测试...
分支限界法中的优先队列式分支限界法解装载问题
贪心法解决最优装载问题 输入 20 2000 125 89.5 142.8 65 298 100 150 86 88 42 55 16 129.6 238.6 45 110 217 168 180 80 输出 1888.9 18 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1
贪心算法-背包装载问题
java算法分析与设计之集装箱装载问题源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络资源少的可怜,...
针对货物装载地和运送目的地均已确定情况下的车辆装载问题,给出了基于遗传算法求解的数学模型,并对基本遗传算法的各个算子针对问题的特点提出了改进方法,同时引入启发式策略,形成了一种混合遗传算法。...
回溯法 背包问题和装载问题 书上的算法。
背包最优装载问题C++源代码 输入文件为in.in 输出文件为out.out 输入文件自行编写 第一行为背包大小w与物品个数n 第二、三行分别为物品的价值与大小
该文档是C语言和算法设计中求解装载问题的一个文档,可以解决装载问题