装载问题

 

Ø有一批共n个集装箱要装上2艘载重量分别为C1C2的轮船,其中集装箱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];

 }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值