背景
在电商业务中, 一个核心的生产环节是打包: 把用户购买的商品打包装入纸箱.
纸箱成本一般与纸板面积成正比. 为了节约打包成本, 我们希望从候选纸箱中选择最小的纸箱来装用户购买的商品. 在实际操作中, 工人一般倾向于选择较大的纸箱, 不仅能减少选择纸箱的时间, 而且能降低装箱难度, 从而加快生产效率. 但这样做会显著增加生产成本.
能不能利用算法来告诉工人如何选择纸箱, 从而节约纸箱成本?
装箱问题
从算法角度解决上述问题有如下难点:
- 商品的形状不规则. 有些商品没有外包装, 例如啤酒瓶是圆柱状, 而垃圾桶是中空的.
- 商品的材质软硬不同. 毛巾, 衣服等商品可以折叠, 那么如何测量其几何形状? 装箱时是否可以折叠?
- 商品的摆放方式自由. 在业务允许的前提下, 商品可以旋转, 倾斜, 折叠等方式进行摆放.
- 判定纸箱是否能装下商品. 给定商品信息和纸箱三维长度, 如何判定商品能否装下?
因此, 需要把问题适当简化. 我们做如下假设:
- 把每个商品看成长方体, 并测量其长宽高.
- 不考虑可以折叠和中空的商品.
- 所有商品能够以90°旋转.
剩下的问题是如何用算法来判定给定的商品是否能装入给定的纸箱. (如果这个问题得到解决, 我们就可以对每个纸箱求解一次该问题, 从而选择能装下所有商品的最小箱子.)
装箱问题
- 输入: 给定个商品和一个纸箱, 商品的长宽高为, , 纸箱的长宽高为. 假设商品是长方体, 长度不可变(没有弹性). 装箱时可以对商品进行90度旋转, 但不能倾斜.
- 输出: 判断所有商品是否能装入纸箱.
从计算复杂性的角度来, 该问题属于NP-complete[1]. 在NP P的假设下[2], 该问题不能在多项式时间内求解. 换句话说, 我们找不到"又快又好"的算法求解该问题. 在实际中, 我们经常采用效率换质量的策略来求解这一类问题. 即, 允许算法不是最优解, 但要求在可以接受的时间内返回可行解(feasible solution).
这样一来可能出现算法推荐不正确的问题:
- 推大用小. 算法推荐的纸箱比工人实际使用的纸箱大. 在这种情况下, 工人的操作会比算法推荐更节约成本.
- 推小用大. 算法推荐的纸箱比工人实际使用的纸箱小. 在这种情况下, 工人的操作会失败, 不仅会误导工人, 而且降低生产效率.
因此, 算法要避免产生推小用大的错误. 换句话说, 算法推荐的纸箱一定要能装下所有商品.
启发式算法
比较容易想到的是设计一些装箱的规则, 例如最大体积优先, 最大面积优先等, 其缺点是我们无法保证得到最优解. 我们以二维装箱为例, 下图的例子考虑5个商品, 方块中的数字代表长宽, 箱子的大小为. 最大面积优先和最长边优先的装箱策略均无法得到最优解.
整数线性规划
下面介绍一种求最优解的方法. 基本思想是把该问题用数学语言来描述, 从而建立优化目标和不等式组. 利用数学规划求解器来解对应的数学问题, 从而得到最优解. 难点在于如何建立该问题的数学模型[3].
1. 下标
为方便描述, 我们用下标代表商品, 代表商品摆放方式.
- -- 商品
- -- 商品的摆放方式(对应)
2. 输入参数
算法的输入称为参数. 该问题的参数如下.
- -- 商品数量
- -- 箱子的长宽高
- -- 商品的长宽高
3. 决策变量
我们把算法需要求解的变量称为决策变量. 下面我来定义该问题的决策变量. 给定长方体(代表商品或纸箱), 我们用如图所示的左手坐标系, 把长方体置于原点(使得长方体中所有点的坐标非负). 因此, 任意一个长方体可以用图中的两点来确定位置. 我们把点称为长方体的位置.
定义商品的点和点坐标:
- -- 商品的位置坐标(即点坐标)
- -- 商品的点坐标
如图所示, 上述长方体的位置为, 点坐标为. 允许90°旋转的条件下, 它一共有6种摆放方式, 即的所有置换(Permutation):
表示按上述第种摆放方式. 我们用来表示商品是否按照第种方式摆放.
- -- 商品按第种方式摆放.
考虑任意两个商品. 它们一共有6种相对位置:
- -- 在的左侧
- -- 在的右侧
- -- 在的后面
- -- 在的前面
- -- 在的下面
- -- 在的上面
- -- 商品和的6种位置关系
4. 约束
下面我们建立与之间的对应关系. 回顾代表商品的第种摆放方式, 我们有
注意到商品不能同时存在两种摆放方式, 因此
考虑任意两个商品, 它们之间有6种位置关系: 在的左侧, 右侧, 后面, 前面, 下面, 上面. 分别用表示. 回顾商品的位置坐标为. 以在的左侧为例, 即, 当时, 我们有. 如图所示.
类似地, 我们有
把上述关系写成不等式, 我们得到
在上述6种相对位置中, (左, 右), (前, 后), (上, 下)每一对关系不能同时存在, 因此
但是, 这6种相对位置至少有一种必须存在. 我们有
已知商品的位置是, 它的点坐标为
由于装入纸箱的商品不能超过纸箱的长宽高, 因此
5. 数学模型
综上所述, 我们得到如下的数学规划问题.
利用开源工具OR-Tools或商用求解器(例如Gurobi)求解上述问题, 如果有可行解则表示纸箱能装入所有商品.
Remark 该精确算法的计算时间随商品数量成指数增长. 因此仅限于求解小规模问题, 例如商品数量限定在10个以内. 在实际应用中, 小规模问题我们可以使用精确算法, 而大规模问题可以考虑启发式算法.
参考文献
-
Chen C S, Lee S M, Shen Q S. An analytical model for the container loading problem[J]. European Journal of Operational Research, 1995, 80(1): 68-76. ↩