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

时间:2019-04-01 11:50:23

标签: c++ algorithm bin-packing

对于我的任务,我必须编写一个装箱算法,其中有N个具有不同体积的对象。它们都必须包装在第V卷的盒子中。使用递减排序,我成功地编写了该算法。但是另一项任务包括在我以前认为最有效的盒子中写出所有可能的装箱方式。例如:

有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

我无法针对此问题提出合适的算法,应该从哪里开始?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

解决此问题的通用算法如下:

通过将所有可能的拆分配置创建为 n 个组,尝试适应所有 n 个容器中的对象,并测试是否有任何此类配置适合这些容器。

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

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

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

000
001
010
...

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

有解决方案时,您只需要检查每个容器中此标签对象的体积总和不大于容器的大小即可。

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

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
}