Ø有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且∑wi≤C1+C2
Ø装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。
Ø容易证明,如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案:
§(1)首先将第一艘轮船尽可能装满;
§(2)将剩余的集装箱装上第二艘轮船。
Ø将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近。由此可知,装载问题等价于以下特殊的0-1背包问题。
Ø解空间:子集树
Ø可行性约束函数(选择当前元素):
Ø上界函数(不选择当前元素):
当前载重量CW+剩余集装箱的重量R
≤当前最优载重量BestW
Ø用回溯法设计解装载问题的O(2n)计算时间算法。在某些情况下该算法优于动态规划算法。
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];
}