Algorithm 箱子包装的变化-带有箱子和对象类以及相互约束

Algorithm 箱子包装的变化-带有箱子和对象类以及相互约束,algorithm,optimization,np,bin-packing,Algorithm,Optimization,Np,Bin Packing,我正在研究一个问题,这是一个箱子包装的变体,但更一般的形式有额外的约束。问题定义如下- 我们有不同大小的对象,可以将它们分组到对象类中。我们有不同容量的箱子,这些箱子也被分组到箱子类别中。同一类别中的所有箱子具有相同的容量。对象类具有可将其放置在哪个箱子上的约束-例如,类“A”的对象可以放置在箱子类“X”或“Y”中。目标是找到每个类别中的最小箱子数量,以产生给定对象集的最佳包装 这个问题有没有一个很好的数学公式,以及你遇到的解决方法?这是否是装箱问题的一个扩展,可以应用相同的方法?我知道这是NP

我正在研究一个问题,这是一个箱子包装的变体,但更一般的形式有额外的约束。问题定义如下-

我们有不同大小的对象,可以将它们分组到对象类中。我们有不同容量的箱子,这些箱子也被分组到箱子类别中。同一类别中的所有箱子具有相同的容量。对象类具有可将其放置在哪个箱子上的约束-例如,类“A”的对象可以放置在箱子类“X”或“Y”中。目标是找到每个类别中的最小箱子数量,以产生给定对象集的最佳包装


这个问题有没有一个很好的数学公式,以及你遇到的解决方法?这是否是装箱问题的一个扩展,可以应用相同的方法?我知道这是NP难的。我找不到很多关于如何解决这个问题的方法,所以如果你能给我指出正确的方向,那将非常有帮助。

找到精确的解决方案是NP难的。但是找到一个最优的解决方案是很容易的

因为目标是最小化每个类的垃圾箱数量,所以我会这样做

从输入约束生成一个映射,该映射存储每个bin类可以打包的对象类。例如,对于类“A”的约束对象,可以将其放置在bin类“X”或“Y”中

M[X] = {A};
M[Y] = {A};
通过处理所有约束生成此映射。现在从对象数最少的bin类开始,开始打包到其中,并将对象标记为 压缩[Object_A]=真

现在,对映射中的bin类按其计数的降序重复上述步骤

在此之后,您将看到没有约束的对象和包含零个或多个对象的bin类

我们可以扩展First Fit算法来解决这部分问题。 根据容器类中的对象计数按递增顺序对容器类进行排序。在剩余的对象上运行一个循环,将其放入第一个Fit bin类中。在每次迭代中,您需要根据对象计数对bin类重新排序

我希望这能有所帮助。

目标是找到每个班级的最小垃圾箱数量

这是一个负载平衡或公平约束。诀窍是将每个班级的垃圾箱数量相加,然后按该数量的平方进行惩罚:

这样,您就不必计算每个类的平均存储箱数量:如果另一个硬约束阻止您在特定类中达到平均值,那么这种方法就失效了