做了两年多的装箱问题,在这里做一个小结,说一说自己的一些理解
这里的三维装箱定义如下:
有n个待装的商品,m种数量不限的箱子,如何去选择箱子和装箱方案,使得最终使用的箱子总体积最小(有时也可以作成“少而小”的多目标的形式)
建模如下:
在问题规模较小时,推荐使用上述模型配合一般的求解器求解
在问题规模较大时,推荐使用一般的启发式方案,因为此时求解器一般很难得到最优解,即使得到的可行解gap一般也会很大
至于规模大小的划分,个人经验是n=20左右,这里使用的是个人的pc机,求解器为开源的scip,如果算力资源较好时,也可适当增大这个阈值(当然实际实现时,两种方案一般都会运行,选择好的结果作为最终结果)
至于启发式方法,其实就是对装载的一种策略:
- 有人学习砌墙工人砌墙,不断的去设置准线去装
- 有人先将所有的东西拼好,码垛成一条一条、一层一层的再装
- 有人将所有可能拼成的形状都罗列出来再去装
规则很多,但宗旨很多都是基于贪心的策略去做的,目前在通用的测试集下,大多数基于“拼”的策略结果都较好
其中:
- 序列装载是基调,排在前面的先装,所以整体看,序列大致呈降序排列时,结果较好(因为这样装的结果是大的先装,小的插空)
- 而对于具体的案例来说,严格的降序排列经常不一定的是最优解,所以一般会配合元启发式方法或者说一些局部搜索的方法(2-opt、模拟退火等)使用,使得该解起码是一个局部最优解
这里面很多思想都是贪心的,通用的,一个比较重要且特殊的思想就是要“先拼再装”,这些思想结合起来就不会太差