我正在寻找一种垃圾箱包装问题,但并不完全相同。 该问题要求将 n 项目放入最小数量的箱子中,而总重量不超过箱柜容量。 (经典定义)
区别在于: 每个项目都有权重和 绑定 ,并且bin的容量由最小绑定动态确定那个箱子里的物品。
如, 我有四个项目A [11,12],B [1,10],C [3,4],D [20,22]( [weight,bound] )。 现在,如果我将项目A放入垃圾箱,将其称为b1,那么b1的容量将变为12.现在我尝试将项目B放入b1,但由于总重量为11 + 1 = 12而失败,因此容量为b1变为10,小于总重量。因此,B被放入bin b2,其容量变为10.现在,将项目C放入b2,因为总重量为1 + 3 = 4,b2的容量变为4。
我不知道这个问题是否已在一些名称已经解决的问题上得到解决。或者它是bin-packing的一种变体,已在某处讨论过。 我不知道这是否是发布问题的正确位置,任何帮助都表示赞赏!
答案 0 :(得分:3)
通常使用NP-hard问题的算法设计,有必要重用技术而不是整个算法。在这里,使用分支定界和列生成的标准bin打包算法可以很好地进行。
我们的想法是制定一个巨大的set cover实例,其中集合是适合单个bin的项目集。整数编程对于普通集合覆盖是一种很好的技术,但是我们需要做很多集合,即column generation。集合和列之间存在一对一的对应关系,因此我们剔除线性编程求解器的一部分,该求解器使用强力来找到一个好的列进入并用求解器替换它,结果是背包这个问题的类比。
这个修改后的背包问题是,给定具有权重,利润和界限的项目,找到总权重小于最小界限的最有利可图的项目集。用于解决具有小整数权重的背包的动态程序愉快地转移而不会降低效率。只需按降序界限对项目进行排序;然后,当形成涉及最近项目的集合时,权重限制就是该项目的界限。
答案 1 :(得分:1)
以下内容基于Anony-mouse's answer。我不是算法专家,所以请考虑以下因为"只是我的两分钱",因为它们的价值。
我认为Anony-mouse从最小的项目开始是正确的(通过绑定)。这是因为随着您添加的项目越多,容器的容量越小; bin的最大容量是根据放置在其中的第一个项目确定的,在此之后它永远不会变大。
因此,不是从一个大型垃圾箱开始,并且其容量慢慢减少,并且不得不担心取出之前适合的太大的物品,让我们试着保持垃圾桶的状态。能力尽可能保持不变。如果我们能保留垃圾箱'容量稳定,我们可以使用"标准"算法什么都不知道"绑定"。
所以我建议:
按绑定对所有项目进行分组。
这将允许您使用标准bin打包算法每组,因为如果所有项目具有相同的边界(即绑定是常量),则基本上可以忽略它。现在所有的约束意味着你知道所产生的箱子'容量提前。
从具有最小边界的组开始,并为其项目执行标准bin包装。
这将导致一个或多个容器的容量等于其中所有项的界限。
继续具有下一个更大边界的项目组。查看是否有任何物品仍然可以存放在现有的箱子中(即前面步骤生成的箱子)。
请注意,可以再次忽略bound;因为所有预先存在的垃圾箱已经具有比这些附加物品更小的容量。捆绑,垃圾桶容量不受影响;只有重量是相关的,所以你可以使用"标准"算法。
我怀疑此步骤是(多个)背包问题的一个实例,因此请查看背包算法,以确定如何将这些项目分配到预先存在的,部分填充的垃圾箱中。
上一组中的项目组可能只是部分处理过,可能还有剩余项目。这些将进入一个或多个新箱:基本上,重复步骤3.
重复上述步骤(从3开始),直到不再有任何项目为止。
答案 2 :(得分:1)
它仍然可以写成ILP实例,如下所示:
创建二进制变量x_{i,j}
,表示项j
是否进入bin i
,辅助变量y_i
表示是否使用了bin i
,辅助变量确定bin c_i
容量的i
,并且常量s_j
(项j
的大小)b_j
(项j
的范围} )和M
(足够大的常数),现在
minimize sum[j] y_j
subject to:
1: for all j:
(sum[i] x_{i,j}) = 1
2: for all i,j:
y_i ≥ x_{i,j}
3: for all i:
(sum[j] s_j * x_{i,j}) ≤ c_i
4: for all i,j:
c_i ≤ b_j + (M - M * x_{i,j})
5: x_{i,j} ϵ {0,1}
6: y_i ϵ {0,1}
约束意味着
但完整性差距可能很残酷。
答案 3 :(得分:0)
首先,我可能完全错了,可能存在一种比我更好的算法。
Bin打包 NP-hard ,使用经典算法(如 First Fit 等)有效解决。此处也有一些改进。Korf's algorithm
我的目标是通过按照边界对项目进行排序,将其减少到正常的装箱包装。步骤是
按绑定对项目进行排序:按绑定对项目进行排序将有助于我们安排垃圾箱,因为限制条件是最小限度。
将最小的项目(按装订)插入垃圾箱
我认为这几乎解决了这个问题。请告诉我,如果它没有。我正在尝试实施相同的。如果有任何建议或改进也告诉我。 :)谢谢