查找料箱包装问题中的所有可能变化

Finding all possible variations in a Bin-Packing Problem

本文关键字:有可能 变化 问题 包装 查找      更新时间:2023-10-16

对于我的任务,我必须编写一个bin打包算法,其中有N个不同体积的对象。它们都必须装进第五卷的盒子里。 使用递减排序 我成功地编写了算法。但另一项任务包括在我以前发现最有效的箱子中写出所有可能的垃圾箱包装变体。所以例如:

有 4 个具有体积的对象:4、6、3、2。 盒子的体积是 10。使用垃圾箱包装算法,我发现我需要 2 个盒子。

所有可能的变化都是:

4,6 and 3,2
4,3 and 6,2
4,2 and 6,3
6   and 4,3,2

我无法为这个问题想出合适的算法,我应该从哪里开始?任何帮助将不胜感激。

解决此问题的一般算法如下:

尝试将所有对象放入 n个箱中,方法是将所有可能的拆分配置创建为 n组,并测试是否有任何此类配置适合箱。

如果没有,请增加n并重试。

现在,您如何找到所有可能的拆分配置?

考虑在每个对象上放置一个标签,以决定它属于哪个箱。 如果您有 3 个对象和 2 个箱,则每个对象都可以获取标记01(对于两个箱中的任何一个)。 这使得 2^3 = 8 种组合:

000
001
010
...

现在也清楚了如何创建所有组合。 您可以使用计数器并将其转换为箱数的基数(在本例中为 2),并将数字用作标签。 还有其他选择,例如,您可以使用递归解决方案。 我更喜欢这样。

当您有解决方案时,您只需要检查每个箱的此标签对象的体积总和是否不大于箱大小。

下面是一些用于递归创建所有组合列表的伪代码

combinations(object_counter, bin_counter) {
if (object_counter == 0) {
return [[]]  // a list of one empty list
}
result = []  // empty list
for i in 0 .. bin_counter-1 {
sub_results = combinations(object_counter-1, bin_counter)
for sub_result in sub_results {
result.append([i] + sub_result)
}
}
return result
}