从两排包装物品到几辆卡车

时间:2015-12-23 18:22:35

标签: algorithm packing bin-packing

连续的物品必须放在几辆卡车上。给出了物品的重量和卡车的数量及其共同容量。物品只能从排的两端移动到卡车上。我们如何确定可放入卡车的最大物品数量? (最多可以有10000件物品和100辆卡车。)

示例:
项目:(20,70,10,30,80,60,50,30)
卡车数量:3
卡车容量:100

这里我们可以放置最多7件商品,例如像这样:

item    to truck  remaining
 20     1         (70, 10, 30, 80, 60, 50, 30)
 30     2         (70, 10, 30, 80, 60, 50)
 70     2         (10, 30, 80, 60, 50)
 50     1         (10, 30, 80, 60)
 10     3         (30, 80, 60)
 30     1         (80, 60)
 60     3         (80)

我的想法是尝试尽可能地填满所有卡车,但包装问题对我来说很新,我对它们知之甚少。

1 个答案:

答案 0 :(得分:0)

问题确实可以通过动态编程来解决;然而,如果没有以前的经验,这可能是困难的。递归关系和状态空间可以定义如下。

n表示项目数量,i_1,...,i_n表示其大小;让m表示卡车的数量,让c_1,...,c_m表示他们的能力。状态空间可以实现为m+2维度表,其中位置(k_1,k_2,l_1,...,l_m)的条目被定义为从项{k_1,...,k_2}的补集中选择的最大可能项目数(其中然后是卡车k剩余负荷恰好为l_k的剩余货物队列,或者没有此类解决方案存在负面影响。在初始化对应于基本情况的状态之后,可以使用递归关系

迭代地评估状态空间
(k_1,k_2,l_1,...,l_m) = max
                        {
                            (k_1+1,k_2,l_1,...,l_m),
                            (k_1,k_2+1,l_1,...,l_m),

                            (k_1+1,k_2,l_1-i_k_1,...,l_m) + 1, m cases in total
                            ...,
                            (k_1+1,k_2,l_1,...,l_m-i_k_1) + 1,

                            (k_1,k_2-1,l_1-i_k_2,...,l_m) + 1, m cases in total
                            ...,
                            (k_1,k_2-1,l_1,...,l_m-i_k_2) + 1,
                        }

其中前两种情况对应于丢弃队列的左端和右端,下一个m个案例对应于将队列左端的项目打包到每个m卡车和最后m个案件对应于将队列右端的物品打包到每辆m卡车。

评估状态空间后,必须检查所有最终状态;这些是每件物品都被包装或丢弃的物品。这些状态是k_1 = k_2-1保持的状态,即队列为空。实施将采用这些的最大值;如果结果是负无穷大,则不存在可行的解决方案。