是否有按物品尺寸包装箱子的背包算法?
Posted
技术标签:
【中文标题】是否有按物品尺寸包装箱子的背包算法?【英文标题】:Is there a knapsack algorithm for packing boxes by item dimension? 【发布时间】:2020-01-02 19:22:35 【问题描述】:尝试自学 Python 并遇到问题。有人可以确认这是一个背包问题吗?
示例:我有两个项目,一个 3" x 3" x 3",另一个 1" x 3" x 9"。我列出了 12 种不同尺寸的盒子,按成本从最低到最高排序。
我可以使用背包来确定这两个物品可以放在 12 个盒子中的哪一个,然后返回最便宜的选项吗?或者像遗传算法这样的其他东西会更好地计算最小的 9" x 4" x 3" 大小并拉回相应的框?
到目前为止,我所看到的一切都是基于单一的重量(体积),在这种情况下,第 1 项和第 2 项不能被视为相同。
示例框尺寸:
A - 2 x 6 x 6,$.52
B - 12 x 10 x 4,$.54
C - 14 x 12 x 5,$.71
输出需要是盒子 B,因为 B 和 C 中的物品都适合,但 B 是最便宜的。
任何帮助将不胜感激。
编辑澄清
我已经制作了一个基本的 excel 文件来使用 SORT 和 COUNTIFS 等来处理这个问题,但它无法处理任何复杂的东西,比如 8 个 3 x 3 x 3 的物品装在一个 6 x 6 x 6 的盒子里。
【问题讨论】:
您可以在github.com/mohitesh07/3d-bin-packing/blob/master/… 上查看此问题的确定性 Java 实现,它考虑了正交旋转和权重,但它最大限度地减少了盒子的数量,而不是盒子计数价格的总和。跨度> 你可能也想看看 cs.stackexchange,here is a related question 【参考方案1】:是的,这可以被视为多重约束的多重背包问题,或者更普遍地视为装箱问题。确切的方法将取决于语言以及您希望如何权衡 CPU 效率、开发时间、多功能性等。(便宜、快速、好:选择两个)
以下是我对问题描述的表述:将所需的整数数量的背包的组合成本最小化,并具有足够的 X、Y 和 Z 容量来容纳所需物品。 考虑到它显然是 NP 难的,对我来说,用“数学方式”来表达它比实现它更难。
最佳算法取决于目标/权衡。我会抨击一个可行的解决方案和一些综合测试用例,用于对其他方法进行基准测试。我会想到这些方法:
-
(预)按成本升序对框进行排序
按体积降序对项目进行排序
first-fit 将项目打包到盒子中(当任何项目尺寸总和超过盒子尺寸时,实例化第一个长度足够大的盒子)
或者
-
按(成本/体积)增加对盒子进行排序
按体积递减排序项目
遍历项目,首先将项目放入当前部分填充的盒子中的空闲空间,或分配第一个足够大的盒子
重复遍历,直到所有项目打包
更多想法:
我们可以随机排列列表或随机选择框吗? 我们如何知道目标是最小值?是局部最小值还是全局最小值? 我们如何知道零件填充的盒子是否有足够的空间容纳特定物品? 1 是否应该随机打包,直到 CPUtime 或内存耗尽,然后使用最便宜的解决方案? 我们可以聪明一点并使用图论吗? 这真的是一个时间表问题吗? 存在满足问题的框的有限组合,并且只能使用整数数量的框,因此可能会生成(所有?)可能的组合,然后使用单纯形算法求解?您可能还希望要求一定量的松弛填充。您可能希望(稍后)限制每箱的重量。会有一些边缘情况,例如箱子的成本会高于托盘或 ISO 容器等,所以问题可能是有限的。
1 所有物品和盒子都有 L, W, D > 0 和 L >= W >= D. (X, Y, Z) 的占用空间是每个放置物品的凸包彼此相邻,这取决于方向(旋转)和位置!那你先解决这个问题吗?你忽略旋转吗?与旋转无关的最坏情况,项目是边长为 L 的立方体或直径为 L 的球体,相关的堆积密度为 0.64 到 0.74。 2
2 你知道,我想得越多,在手机上敲出这个答案的时间越长,我就越觉得杰夫·贝佐斯一定在这上面花了一大笔钱!
编辑:
pip install py3dbp
provides an implementation of a 3d bin packing algorithm 这可能有助于引导您的解决方案以最小化成本。它引用的论文可能对您有用。
【讨论】:
刚刚意识到你指定了,但没有标记 [python],所以我不知道如何最好地解决不在 C/Matlab 中的优化问题。scipy
中可能有很多有用的东西。
过去可能对 Jeff 有用……现在他们对一日送货如此着迷,他们不理会这种优化。感谢您抢先一步……我的周末现在可能已经完成了。以上是关于是否有按物品尺寸包装箱子的背包算法?的主要内容,如果未能解决你的问题,请参考以下文章