耗材推荐问题,旨在对待装货物推荐合适的包装耗材,由于该问题属于NP问题,故多采用启发式思路为算法的过程加速。
普通的装箱问题一般针对的是多类货物单类箱型,故问题的重点在于装箱的过程;而耗材推荐中,需要对每一种可能的耗材集类型作判断,每一种耗材类型与待装货物就构成了一组装箱问题,故其难度比装箱高一层次,需在耗材的选取中也添加启发式的规则,达到平衡计算时间、计算资源消耗和计算精度的目的。
一期的箱装首先将所有可能的耗材集类型列举出来,然后选取m(20)个可能的耗材集进线程并行处理,在规定时间(200s)内若有返回值,则返回结果,否则认为超时
袋装由于袋子的柔性特质,将其看成多种箱子,导致袋子集本身的大小过大,无法使用列举的形式,故其选定了袋子的数量(6个),逐一尝试进行装载(一种不行,换掉部分继续尝试)
由算法的流程可以看到,箱装中实际尝试装载的耗材集过小,导致了很多可行集都没有办法尝试,袋装由于数量的庞大会更多,因此需要在其中添加一些启发式的规则。
2018.4.3:
耗材数 | 频率 |
1 | 0.3593 |
2 | 0.345 |
3 | 0.1311 |
4 | 0.0684 |
5 | 0.0415 |
6 | 0.0198 |
7 | 0.007 |
8 | 0.0064 |
9 | 0.0018 |
10 | 0.012 |
11 | 0.0011 |
12 | 0.0012 |
13 | 0.0013 |
整理统计了10000个订单内的商品数如上图,可知订单数分布主要集中在5个及5个以下,故对此几种状况优先考虑,
对于商品货物为1个的情况下,对耗材按体积从小到大排序,依次试装,能装下则break,否则返回商品尺寸过大。
对于商品货物为2个的情况下,先将其拼成一个更大的矩体,再试装,若装不下则分两个包裹试装。
对于商品货物为3个及3个以上的情况下,先将商品按照最长边从大到小排列,以期尺寸大的货物先装载,利用启发式规则,先以高为约束,将货物都码成条状,再以宽为约束,将条码成层,
码成层之后,用每类耗材试装,看每类耗材需要几个才能全部装下,选取耗材需求量最小的耗材。
3个及3个以上的情况下,一般最后一个箱子填充率可能较低,在此将其中货物再次重装,选取最小的耗材装载。
至此,本次耗材推荐的算法过程叙述完成。
比较新算法与之前算法的速度如下:
计算平均时间 | |||
商品数 | 旧(100个随机测试用例) | 新(10000个随机测试用例) | 速度比 |
1 | 29.26 | 0.0446 | 656.0538 |
2 | 35.81 | 0.0653 | 548.392 |
3 | 37.81 | 0.1221 | 309.6642 |
4 | 58.34 | 0.108 | 540.1852 |
5 | 62.09 | 0.1185 | 523.9662 |
6 | 86.67 | 0.1197 | 724.0602 |
7 | 99.48 | 0.1651 | 602.5439 |
8 | 117.46 | 0.1658 | 708.4439 |
9 | 120.12 | 0.1507 | 797.0803 |
10 | 151.99 | 0.1557 | 976.1721 |
11 | 154.22 | 0.1677 | 919.6184 |
12 | 148.61 | 0.1635 | 908.9297 |
13 | 152.44 | 0.1403 | 1086.529 |
14 | 156.28 | 0.1307 | 1195.715 |
15 | 147.35 | 0.1577 | 934.3691 |
16 | 171 | 0.1564 | 1093.35 |
17 | 137.79 | 0.1578 | 873.1939 |
18 | 155.67 | 0.1759 | 884.9915 |
19 | 143.2 | 0.1698 | 843.3451 |
20 | 131.59 | 0.1904 | 691.1239 |
、
该曲线为计算时间关于计算商品数的关联曲线,旧算法采用100个测试用例,新算法由于速度较快,用了10000个测试用例,
从结果看,新算法的速度大致比旧算法快三个数量级
对两个算法采用相同的测试用例测试,结果如下:
旧算法的平均使用体积为4.45,新算法为1.43,提升效率约为3倍