查找料箱包装问题中的所有可能变化
Finding all possible variations in a Bin-Packing Problem
对于我的任务,我必须编写一个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 个箱,则每个对象都可以获取标记0
或1
(对于两个箱中的任何一个)。 这使得 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
}
相关文章:
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 有可能使shared_ptr协变吗
- 有可能在信号处理程序中设置promise吗
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- 是否有可能使用debug_info获取ELF文件的源代码?
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 有可能在C++中有类的查找表吗
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 向量的大小是否有可能为 1 但其中的元素数量为零?
- 是否有可能编写新的叮当声现代化规则?
- 是否有可能通过指向另一个未关联的子对象的指针来获取指向一个子对象的指针?
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 是否有可能具有放入容器的移动操作的类型?
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 声明是否有可能逃脱其封闭的名称空间
- 有可能在C++中的值发生变化时触发计算吗
- VS 2012 中可能有什么变化来破坏我的C++应用程序?