当前位置: 首页 > 科技观察

得物极光蓝外盒尺寸设计实践

时间:2023-03-19 11:03:38 科技观察

1.背景极光蓝包装盒已经成为潮流标志,得物App成为年轻潮人的精神归属。特殊的包装材料在消费者中形成了强烈的心理。极光蓝等于增益。但由于早期的箱体尺寸数据是靠人工经验设计的,存在箱体尺寸与产品尺寸匹配度不高的问题,一般造成以下影响:纸箱尺寸不合理导致使用较大部分产品采用纸箱包装,造成纸箱采购成本的浪费。较大的纸箱会导致运输成本增加。产品与纸箱之间的间隙过大,可能会导致产品在运输过程中损坏。2、确定方案考虑到纸箱招标的节奏和仓库打样、试装、试发货的时间,需要以较快的速度完成建模和计算。在这件事上,业务方也无法给出一些特别明确的指引。例如,具体要计算的综合指标包括运输成本,其中包括承运人的分配算法规则及其运费模板。基本上不可能直接将因素纳入盒子建模。例如,箱子数量影响采购招标谈判的成本和仓库人员的工作效率。这里很难量化,不可能直接定义箱子的数量。判断标准。所以,首先要分析业务方产品的现状,明确目标,把所有的问题量化,同时把问题简单化。2.1问题分析sku数据:过去一年出货的sku主数据及其对应的销量,排除规则(只考虑纸箱出货的产品,排除异性盒装产品)和异常值(如sku尺寸异常)。纸箱尺寸参数约束:考虑到提单的尺寸(纸箱尺寸下限的定义)和仓库人员打包的方便性(纸箱尺寸上限的定义),我们有确定了纸盒的上限和下限,形成了数百万种组合的空间。箱型数量限制:排除异形箱,需要综合考虑装箱率、采购成本和仓储效率。一般来说,单个仓库的箱型数量不应超过15个。覆盖范??围限制:在纸箱外包装包装的SKU已经被筛选出来的前提下,接受一些不规则形状和大尺寸的物品箱型组无法覆盖,要求配送单覆盖率>=99%。根据上面对问题的分析可以看出,如果有一组K种箱子来计算装箱率,这个问题的复杂度还不错。但是如果正面进行计算,需要对符合条件的sku遍历box组合,基本无法在有效时间内计算出结果。2.2问题简化2.2.1盒型数量约束不包括异形盒。根据得物目前仓库的实际情况,预计本次新设计的箱子数量为8到15个。需要综合考虑装箱率、采购成本和仓库效率,当箱子数量增加时,装箱率会增加,采购成本也会增加,仓库效率会降低。由于这里没有量化,比如给出了具体的综合指标,所以决定在这里给出多个版本供业务方选择,不作为建模的约束或目标,相当于直接简化M组盒子的M*固定盒子类型的复杂性。在实际开发中,只需要使用M个容器同时进行一次计算即可。2.2.2覆盖约束覆盖约束是一个不等式约束,而目前的问题,不可覆盖的sku部分分布非常明显,一个或多个值集中在长、宽、高中超过仓库方便的上限,所以,这里箱型的上限和不在验收范围内的部分是在建模前确定的。2.2.3目标函数的定义对于采购成本,不用说一定与纸箱所用的纸张有关。纸箱使用的纸张越小(纸箱展开面积越小),成本越低;对于运输成本,基本上3pl都是按MAX(投重,实重)计算的,所以这对纸箱展开面积的优化方向也是积极的;如果每一个3pl运费模板都加入到建模中,还需要考虑承运人的分布算法设计,那么问题就太复杂了,计算量会非常大。现在很明显,我们只需要优化一个订单的平均纸张面积即可。如果订单优化后的纸箱包装没有触及运费模板的变化范围,运费将保持不变。如果是这样,运费将不可避免地降低。综上所述,最后考虑以打包率这个间接指标为目标。装箱率指的是测试(数据集sku总体积/数据集出货箱总体积),也是产品方和业务方比较熟悉,一直关注的指标。2.2.4问题建模经过上述简化,这里将目标函数定义为装箱率,将交货单覆盖率和箱型约束置于建模问题之外。其中,S_i表示Sku_i的销量,R_i表示Sku_i的推荐盒型。因此,推荐箱型的装箱率应满足内部间隙大于最小要求,并选择箱型组中最小的箱型,即箱子的尺寸至少应满足可以粘贴。运单不要过多影响仓库人员的打包效率。同时,我们对sku按长>宽>高进行分类清理,定义纸箱长>宽>高。最后,我们要求盒子的长宽高数据都是整数,即三个3.优化算法3.1一般求解方法概述对于这个优化问题,通常主要包括精确求解算法和启发式算法:方法主要是采用单纯形法(线性规划)或者一些迭代法(非线性规划)结合分支定界的方法找到我们想要的整数解。如果精确法是线性规划问题,可以通过单纯形法在可行域的顶点找到全局最优解,而非线性规划也可以通过微分法或a找到接近最优解的解迭代次数有限,因为不是多项式时间求解法,所以在大规模实例上往往不可行。遗传算法、蚁群算法、进化算法、智能算法等启发式算法都是针对一般问题的。将其视为几乎所有问题的黑匣子。启发式算法,说白了,就是一种定向穷举法。在计算资源有限的情况下,需要根据问题场景和模型特点,在全局搜索能力和局部搜索能力之间选择合理的邻域结构或运行机制。做出权衡。启发式算法通常需要一个给定的初始解;此外,该算法不能保证在多项式时间内收敛,但算法的迭代次数往往是可以控制的。3.2线性规划精确解对于线性规划问题,其可行解的集合是一个凸集或一个无界域。基本可行解对应于凸集的顶点。通过凸集的性质得到的最优解会在凸集的顶点,然后通过遍历和排序就可以得到最优解,但是当顶点过多时,就需要用单纯形法求线性规划的最优解。非线性规划如果目标函数或约束包含非线性函数,例如当前问题中的目标函数装箱率就存在非线性因素,则此类规划问题就是非线性规划问题。一般来说,求解非线性规划问题要比求解规划问题困难得多。它不像单纯形法那样是求解线性规划的一般方法。目前,还没有适用于非线性规划中各种问题的通用算法。每种方法都有其特定的适用范围。整数规划要求输出结果为整数,因此需要使用分支定界法求解。分支定界法的核心思想是分支和剪枝。当不考虑解必须是整数的条件时,可以用单纯形法得到最优解,但解往往不全是整数,所以用剪枝的方法一点一点缩小范围,直到解是整数解。从图中可以看出,在初始化阶段,需要给出输出的全局上下界。如果有一些启发式的方法可以得到稍微好一点的上界和下界作为初始解,那是最好的。如果不是,您可以先将其设置为正负无穷大。然后进入主循环,通过求解整数规划(线性规划)的连续松弛问题得到子问题的上界;分解问题可以帮助拆分整数规划问题,也可以帮助我们得到下界。3.3元启发式方法遗传算法是这类算法的代表,适用于以下场景:神经网络超参数优化一些具有固定结构和特征的组合优化问题部分难以建立机制模型的黑盒优化问题多目标优化问题3.3.1遗传学算法基本概念基因:可行解的元素染色体:一条染色体是一个可行解交叉:将多条染色体切割拼接成新的染色体变异:对染色体的部分基因进行修改andcopied:完整的前一个染色体的遗传复制执行过程1)在算法的初始阶段,会随机产生一组可行解,这就是第一代染色体。2)然后用适应度函数计算每条染色体的适应度,根据适应度计算每条染色体在下一次进化中被选中的概率。3)通过“交叉”生成N-M条染色体。4)对交叉后产生的N-M条染色体进行“变异”操作。5)然后用“复制”的方法生成M条染色体;6)重复2~5。4.具体建模4.1数据分析首先粗略看一下得物近一年出货SKU的长宽高主数据及其销量分布。这是我们箱型设计的基础。同时,考虑到仓库实际作业效率和采购成本,箱子数量不宜过多,否则会增加仓库打包人员取箱的难度,并且采购成本将相应增加。在这一步中,考虑到必须首先考虑当前盒子类型A/B的精度,并且在建模参数中加入8到15种这种数量也会增加计算复杂度,所以决定固定取值箱子类型的数量,首先假设固定有N种箱子,每个箱子有长宽高三个数字,即输出3*N个参数。接下来定义商品sku和箱型的长>宽>高。首先对近一年数据的长宽高进行排序,清理异常值。比如固定12个box类型,我们将sku和boxtype在长宽高维度上,使用k-means聚类成12组。做这个聚类分析,一方面要根据实际情况,比如结合曲面的单一尺寸定义box类型的下限,然后再结合boxcoverage的下限来定义箱型的上限尺寸;另一方面,每个cluster的最大值可以作为box类型的初始化值(实际需要加上5mm作为间隙)。4.2约束和目标业务约束,只需要将货物装箱并留空隙即可,既然箱子的种类数量确定了,那么还需要确定每组箱子的长>宽>高,即is,constraint_ueq=(#单框长>宽>高lambdax:x[1]-x[0],lambdax:x[2]-x[1],lambdax:x[4]-x[3],lambdax:x[5]-x[4],...)目标是最大打包率,即defcal_avg_r_cached(p):'''目标函数。输入例程,返回总距离。cal_total_distance(np.arange(num_points))'''total_r=0forrowinnpd:r=[-1]*box_numforiinrange(box_num):if(row[0]<=p[3*i])和(row[1]<=p[3*i+1])和(row[2]<=p[3*i+2]):r[i]=row[4]/(p[3*i]*p[3*i+1]*p[3*i+2])total_r+=max(r)*row[3]print(total_r)return-total_r/sum_cnt4.3结论最后几个版本并行运行,装箱率均有不同程度的提升,单张平均用纸面积明显降低;最终选定的1203方案作为工程方??输出,装箱率提升5.49%,单票平均纸张面积节省7.6%,单票平均运费降低0.06元。5.彩蛋——用遗传算法画NONO。我在这篇文章中发现了一些有趣的内容,并查看了相关资料。我使用了几个彩色三角形来组合图像。这里我试着用60个三角形画了NONO。效果大致如下:在优化算法中,引入了遗传算法的一般流程,那么画这个NONO和盒子设计有什么区别呢?在箱体设计中,需要根据装箱率指标来计算箱体尺寸。因此,在定义适应度函数时,只需取Maximizepackingrate指标即可。那么这里,只要将目标函数定义为不同的透明三角形拼装结果与目标图像的颜色和大小的相似度就足够了。5.1适应度函数首先要找到一种方法可以量化透明三角形组成的图与目标NONO图之间的差异或相似性,那么相似性如何定义呢?图像的相似度是值向量在某个颜色空间(如RGB、HSV)中的相似度。各点差值之和的最小值越接近期望的目标模式。常用的评价函数有MSE、RMSE、PSNR、ERGAS、SAM等。下图是一些图像噪声方法对应的各种相似度评价方法的相似度结果。“原始”列显示原始图像与自身相比的分数。这里我们选择ERGAS作为我们适应度函数的基础。5.2选择这里,轮盘赌的方法不一定要用来进行选择。95%的概率是选择适应度函数最高的解,5%的概率是从其他解中随机选择。ifrandom.random()<0.95:'''选择基因的源亲本,95%的几率是从最好的祖先随机而来'''poly_a=random.choice(polygons[:1])poly_b=random.choice(polygons[1:5])else:'''选择基因的来源亲本,从所有祖先中随机抽取5%'''poly_a=random.choice(polygons)poly_b=random.choice(polygons)5.3交叉和变异这里同样使用了随机数,大概率从父类随机继承赋值基因,小概率修改基因值。坐标交叉变化大致如下,颜色交叉变化同理。temp=random.random()iftemp<1/polygon_num:'''设置坐标变化的一定概率'''rnd_temp_coord=poly_a.coord_list[i][:]rnd_temp_coord[random.randint(0,vertices-1)]=random.randint(0,img_width),random.randint(0,img_height)temp_coords.append(rnd_temp_coord)eliftemp<0.5:'''从父母那里随机继承一个基因'''temp_coords.append(poly_b.coord_list[i])否则:temp_coords。追加(poly_a.coord_list[i])临时=随机。随机的()