我正在处理一个问题,这是一个bin-packing的变体,但是更具有额外约束的一般形式。问题定义如下 -
我们有不同大小的对象,可以分组为对象类。我们有不同容量的容器,它们也被分组到bin类中(同一类中的所有容器具有相同的容量)。对象类具有对可以放入哪些箱的约束 - 例如,类'A'的对象可以放置在箱类“X”或“Y”中的任一个中。目标是找到每个类中最小的二进制数,这可以产生给定对象集的最佳包装。
这个问题是否存在良好的数学公式,以及您遇到的解决方法?这是否是可以应用相同方法的bin-packing问题的扩展?我明白这是NP难。我无法找到解决问题的方法,所以如果你能指出我正确的方向,那将会非常有帮助。
答案 0 :(得分:0)
找到确切的解决方案是NP难的。但是找到最佳解决方案很容易。
由于目标是尽量减少每个班级的箱数,我会做这样的事情。
从输入约束生成一个Map,用于存储每个bin类可以打包的对象类。例如。对于约束"类的对象' A'可以放在任何一个bin类中' X'或者' Y'。 "
M[X] = {A};
M[Y] = {A};
通过处理所有约束来生成此地图。现在从具有最小对象数的bin类开始,然后开始打包并将对象标记为 打包[Object_A] = true;
现在按照计数的递减顺序对地图中的bin类重复上述步骤。
在此之后,您将留下没有约束的对象和具有零个或多个对象的bin类。
我们可以扩展First Fit算法来解决这个问题。 基于其中的对象计数按升序对bin类进行排序。在左边的对象上运行一个循环,进入First Fit bin类。在每次迭代中,您需要根据对象计数重新排序bin类。
我希望它有所帮助。
答案 1 :(得分:0)
目标是找到每个班级中最小的箱数
这是一种负载平衡(或公平)约束。诀窍是总计每个类别的数量,并惩罚该数字的平方:
这样,你不必每个班级的平均垃圾箱数量:如果另一个硬约束阻止你达到特定班级的平均值,那么这种方式就会崩溃。