鉴于无限容量的 n 箱,我想将 m 物品装入其中(每个都有一个特定的重量),同时尽量减轻最重的箱子的重量。< / p>
这不是传统的垃圾箱包装/背包问题,其中垃圾箱具有有限的容量,并且您尝试最小化使用的垃圾箱数量;我有一定数量的垃圾箱,想要使用它们,以尽可能降低最重的箱子重量。
这个问题有名字吗?我查看过一些关键词的论文,但我没有发现任何相似的内容。
干杯。
答案 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