我收到了一个建立运输估计量的任务,该估计量建议在尽可能少的盒子上最好地容纳商品:
有一组已知的矩形框大小
盒子里有很多随意的矩形物品要包装
最好使用的盒子越少越好。因为运送两个盒子1x1x1比一个盒子1x2x1贵得多。这应该是这里的优先事项。
还应该对其进行优化,以尽可能使用较小的盒子作为第二优先级。(例如:如果在一个较大的框与两个较小的框之间进行选择,则应选择较大的框)
物品可以旋转以适合盒子,但是旋转必须至少限制为45°的增量(在我的研究中,似乎有些配置允许45度旋转才能更好地将矩形盒子容纳在更大的矩形盒子中) ,以90°旋转为标准。
盒子有重量限制,物品具有任意重量(例如:大小为1x1x1的物品可能比其他2x2x2物品重)
我进行了一些研究,找到了一些关于装箱和背包问题的抽象算法,并带有以下一些蛮力变化,类似于最佳拟合算法:
在“要包装的物品”列表上按递减的顺序对物品进行排序(从大到大)
对于此列表中的每个项目:
选择“二手箱”列表上的较小箱子,该箱子有足够的剩余体积和重量限制以适合该物品(我在这里使用“适合”表示适合尺寸和重量)
如果没有这样的盒子,请从已知的可能的盒子尺寸中创建一个新的盒子,该盒子是可以容纳物品尺寸和重量的最小尺寸,并将其添加到“二手盒子”列表中。
如果一个盒子适合该物品(使用下面的拟合功能),则将其添加到“此盒子的物品”列表中,并将其从“适合盒子的物品”列表中删除,在盒子内标记其相对3d位置。
从2.1开始重复,直到“要包装的物品”列表上没有适合的物品。
上面步骤2中使用的拟合检查功能:
检查包装箱的剩余容量是否适合项目的容量。如果不是,则返回false。
检查“盒子物品”重量加上当前物品重量的总和是否小于或等于盒子重量限制。如果不是,则返回false。
检查“框的项目”列表,以选择第一个具有最小Y分量并且具有足够空间用于该项目的宽度,深度和高度的框坐标,同时将其他项目视为不可用的空间。
如果该项目不适合其当前方向,请以6种可能的旋转方式之一进行旋转,为简单起见,不假设旋转45度。(旋转会导致尺寸已被测试的尺寸可以跳过。例如:将盒子旋转180°会得到与原始位置相同的尺寸,因为所有盒子和物品的相对面尺寸都相同,因此可以忽略。)
如果没有将商品以所有可能的方式旋转回其原始方向,请从步骤3重新尝试。
如果尝试了所有旋转但没有找到合适的旋转,则将当前坐标视为不可用的空间。
如果没有可用空间检查,则返回false。否则,请从步骤3再试一次。
我想知道在给定的限制条件下是否可以找到解决我问题的最佳方法。
这似乎在理论上可行,但我还没有在代码上尝试过。我想知道我是朝着正确的方向走,还是有更好,更高效的方法来做到这一点。
参考会很棒。
编辑:
我发现一些有趣的第三方API可以满足我的要求,但是必须断开连接,因此我将无法访问它们。
一些例子是:
编辑2:
一个实际的要解决的问题的示例是:
- 我有4个尺寸为WxHxD的盒子:10x12x18、12x16x24、16x20x30、24x32x40
- 我有4个项目的订单,分别是大小为6x8x10、2x 22x14x30和1x 22x4x20的1个项目
如何使用尽可能少的盒子,尽可能小的盒子和尽可能少的可用空间将这些物品装入一个或多个大小的盒子中?
packing
-related标签;algorithms
足够:)