箱包装:在箱柜上设定数量,希望最小化最大箱重量

时间:2011-01-28 06:20:24

标签: optimization complexity-theory combinations bin-packing

鉴于无限容量的 n 箱,我想将 m 物品装入其中(每个都有一个特定的重量),同时尽量减轻最重的箱子的重量。< / p>

这不是传统的垃圾箱包装/背包问题,其中垃圾箱具有有限的容量,并且您尝试最小化使用的垃圾箱数量;我有一定数量的垃圾箱,想要使用它们,以尽可能降低最重的箱子重量。

这个问题有名字吗?我查看过一些关键词的论文,但我没有发现任何相似的内容。

干杯。

2 个答案:

答案 0 :(得分:1)

如果箱子的数量是约束,而不是箱子的容量,那么它不是箱子包装,这是multiprocessor scheduling问题。

通常,您可以通过LPT算法来获得相当好的结果。不过需要进行优化,这就是乐趣所在。

答案 1 :(得分:0)

这是 2D 垃圾箱包装问题的一种形式。第一个维度是每箱容量的限制(= 硬约束),第二个维度是最小化最重的箱子的重量( = 软约束)。

使用Drools Planner,我将从the cloud balance example开始并按照以下方式实施:

rule "maxCapacity"
  when
    // When there is a bin ...
    $bin : Bin($binCapacity : binCapacity)
    // ... where the total of the item capacity is bigger than the bin capacity ...
    $itemCapacityTotal : Number(intValue > $binCapacity) from accumulate(
        ItemAssignment(
            bin == $bin,
            $itemCapacity : itemCapacity),
        sum($itemCapacity)
    )
  then
    // ... then lower the hard score with the insufficient capacity
    insertLogical(new IntConstraintOccurrence("maxCapacity",
            ConstraintType.NEGATIVE_HARD,
            $itemCapacityTotal.intValue() - $binCapacity,
            $bin));
end


rule "calculateWeight"
  when
    $bin : Bin()
    $itemWeightTotal : Number() from accumulate(
        ItemAssignment(
            bin == $bin,
            $itemWeight : itemWeight),
        sum($itemWeight)
    )
  then
    insertLogical(new BinToWeight($bin, $itemWeightTotal);
end
rule "minimizeWeight"
  when
    BinToWeight($bin : bin, $itemWeightTotal : itemWeightTotal)
    not BinToWeight (itemWeightTotal > $itemWeightTotal,  bin != $bin)
  then
    insertLogical(new IntConstraintOccurrence("minimizeWeight",
            ConstraintType.NEGATIVE_SOFT,
            $itemWeightTotal,
            $bin));
end