装载问题(回溯方法/python)

装载问题

1. 问题描述

问题
有n个集装箱,需要装上两艘载重分别为 c 1 c_{1} c1 c 2 c_{2} c2的轮船。 w i w_{i} wi为第 i i i个集装箱的重量,且 w 1 + w 2 + . . . . + w n &lt; = c 1 + c 2 w_{1}+w_{2}+....+w_{n}&lt;= c_{1}+c_{2} w1+w2+....+wn<=c1+c2。问:是否存在一个合理的装载方法把这 n n n个集装箱装上船?如果有,请给出一种方案。
实例
W = &lt; 90 , 80 , 20 , 12 , 10 , 30 , 40 &gt; W = &lt;90,80,20,12,10,30,40&gt; W=<90,80,20,12,10,30,40>
c 1 = 152 , c 2 = 130 c_1=152,c_2=130 c1=152,c2=130

1 , 3 , 6 , 7 1,3,6,7 1,3,6,7装第一艘船,其余第2艘船

2. 求解思路

输入
W = &lt; w 1 , w 2 , . . . . , w n &gt; W=&lt;w_1,w_2,....,w_n&gt; W=<w1,w2,....,wn>为集装箱重量, c 1 c_1 c1 c 2 c_2 c2为船的最大重量
算法思想
令第一艘船的装入量为 W 1 W_1 W1,
1.用回溯算法求使得 c 1 − W 1 c_1-W_1 c1W1达到最小值的装载方案
2.若满足
        w 1 + w 2 + . . . . + w n − W 1 &lt; = c 2 w_{1}+w_{2}+....+w_{n}-W_1&lt;=c_2 w1+w2+....+wnW1<=c2
则回答‘Yes’,否则回答‘No’

3. 伪代码

  1. 算法 L o a d i n g ( W , c 1 ) Loading(W, c_1) Loading(W,c1)
  2. S o r t ( W ) Sort(W) Sort(W);
  3. B ← c 1 ; b e s t ← c 1 ; i ← 1 ; B \leftarrow c_1;best \leftarrow c_1; i \leftarrow 1; Bc1;bestc1;i1;
  4. while  i ≤ n i \leq n in do
  5.    if 装入 i i i后重量不超过 c 1 c_1 c1
  6.   then B ← B − w i ; x [ i ] ← 1 ; i ← i + 1 ; B\leftarrow B-w_i; x[i] \leftarrow 1;i \leftarrow i+1; BBwi;x[i]1;ii+1;
  7.   else x [ i ] ← 0 ; i ← i + 1 ; x[i] \leftarrow 0;i \leftarrow i+1; x[i]0;ii+1;
  8. if B &lt; b e s t B&lt;best B<best then记录解 ; ; ; b e s t ← B ; best \leftarrow B; bestB;
  9. B a c k t r a c k ( i ) ; Backtrack(i); Backtrack(i);
  10. if i = 1 i=1 i=1 then return 最优解
  11. else goto 4.

4. python代码

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值