【问题标题】:Finding all possible variations in a Bin-Packing Problem在装箱问题中找到所有可能的变化
【发布时间】:2019-04-01 11:50:22
【问题描述】:

对于我的任务,我必须编写一个装箱算法,其中有 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

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

【问题讨论】:

  • 这毫无意义,bin 打包是出了名的 np-awful 与 n!可能的解决方案。在实际程序中总是需要启发式。也许你的老师想让你自己发现这一点。或者,也许你打算练习 std::next_permutation()。我们没有上你的课,所以这只是一个猜谜游戏,请与其他学生讨论。
  • 您确定您的基于排序的解决方案是正确的吗?可能值得将其发布在CR 上以便快速检查。
  • 也许问题可以更好地描述为:您有 N 个不同体积的对象,您必须使用大小为 10 的盒子将它们放在架子上。输出使用最少数量的盒子的所有可能变化。

标签: c++ algorithm bin-packing


【解决方案1】:

解决这个问题的一般算法是这样的:

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

如果没有,增加n再试一次。

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

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

000
001
010
...

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

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

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

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 2017-03-19
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多