Java语言描述:回溯法之最优装载问题

本文探讨如何使用回溯法解决最优装载问题,涉及将n个重量不等的集装箱分配到两艘载重量为c1和c2的轮船。通过实例解释了当集装箱重量满足一定条件时,如何寻找装载方案,以及在某些情况下无法找到可行方案的情况。
摘要由CSDN通过智能技术生成

问题描述:

有一批共有 n 个集装箱要装上两艘载重量分别为 c1 和 c2 的轮船,其中集装箱 i 的重量为 w[i], 且重量之和小于(c1 + c2)。装载问题要求确定是否存在一个合理的装载方案可将这 n 个集装箱装上这两艘轮船。如果有,找出一种装载方案。例如,当n=3,c1=c2=50,且w=[10,40,40]时,可将集装箱1和集装箱2装上一艘轮船,而将集装箱3装在第二艘轮船;如果w=[20,40,40],则无法将这3个集装箱都装上轮船。

/*
 * 该代码通过回溯法实现了最优装载问题。
 * 算法思想:要想让最终所有的箱子能够装上船,只需要尽可能将第一艘船装满(贪心选择性质)。
 * 所以问题转化为在不超载的情况下第一艘船的最大载重量可以达到多少。在第一艘船达到
 * 最优的情况下,如果剩余箱子重量总和小于第二艘船的载重量,则可以装载。反之,则不能装载。
 * 将该数学模型转化为一棵子集树,每一个箱子可以选择上1船,或不上1船。因此每个节点都包含有
 * 2个叶子节点。依次对每个叶子节点进行搜索,统计出最优的装载路径。
 * 
 * 剪枝函数:
 * 对于左节点,则计算该箱子装上1船后1船是否会超载,如果超载,则该节点置为死节点,
 * 该节点之后的节点全部不用再进行搜索。 
 * 对于右节点,则计算当这个箱子不上1船之后,1船已有货物的质量加上后面剩余箱子的质量能否
 * 超过已经找到的最优解,如果不能超过,则后面的搜索也是无意义的。将该右节点置为死节点。
 * */

package BackTrack;

public class bestOverload {
	int sumWeight = 160;
	int n = 5;
	int[] w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值