给定n 个容量无限的垃圾箱,我想将m件物品装入其中(每个都有特定的重量),同时尽量减少最重垃圾箱的重量。
这不是一个传统的垃圾箱包装/背包问题,其中垃圾箱的容量有限,并且您试图尽量减少使用的垃圾箱数量;我有一定数量的垃圾箱,并且想全部使用它们以使最重的垃圾箱的重量尽可能低。
这个问题有名字吗?我浏览了许多带有关键词的论文,但我没有发现任何类似的东西。
干杯。
给定n 个容量无限的垃圾箱,我想将m件物品装入其中(每个都有特定的重量),同时尽量减少最重垃圾箱的重量。
这不是一个传统的垃圾箱包装/背包问题,其中垃圾箱的容量有限,并且您试图尽量减少使用的垃圾箱数量;我有一定数量的垃圾箱,并且想全部使用它们以使最重的垃圾箱的重量尽可能低。
这个问题有名字吗?我浏览了许多带有关键词的论文,但我没有发现任何类似的东西。
干杯。
如果限制的是 bin 的数量,而不是 bin 的容量,那么这不是 bin 打包,而是多处理器调度问题。
通常,您可以通过 LPT 算法来解决这个问题,结果非常好。不过,需要进行优化,这就是乐趣所在。
这是二维装箱问题的一种形式。第一个维度是每个 bin 的容量限制(=硬约束),第二个维度是最小化最重 bin 的权重(=软约束)。
使用Drools Planner,我将从云平衡示例开始并像这样实现它:
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