包材推荐中的算法应用|得物技术

news2024/11/24 0:24:09

目录
一、业务背景
二、算法架构

  1. 规则
  2. 算法

三、算法原理

  1. 装箱
  2. 装袋

四、衍生应用

  1. 切箱
  2. 合包
  3. 箱型设计
  4. 包装方案推荐

五、作者结语

一、业务背景

任何一家电商的商品出库场景中,都涉及到打包——即把订单中的商品用包材进行包裹,常见的打包方式有装袋和装箱。

仓库打包作业主要决策两点:

  1. 包材类型:一般根据商品种类判断,比如衣服使用塑料袋、日用品使用纸箱等,具体由人工录入规则维护在系统中,针对订单输出对应可用包材类型;
  2. 包材型号:具体取决于装箱还是装袋,要求使用的纸箱的体积最小或者袋子的面积最小,并且能装下订单中的所有商品。在实操中,系统通常通过拆箱逻辑应对订单中商品较多以至最大型号都装不下的情形。

针对第二点,人工决策不仅效率低而且容易造成浪费,主要是包材型号较多,而且是折叠状态。作业人员肉眼难以甄别能装下所有商品且体积最小的型号,最保险的做法是选择较大的纸箱。这样会造成浪费包材,增加履约成本。此外空间利用率不高将导致商品在运输中容易破损,引发客诉甚至退换货。

在这样背景下,需要一套包材推荐算法来解决上述包材浪费和空间利用率不高的问题。

二、算法架构

在详细进入算法细节之前,先大致了解下架构流程,具体如下图所示。
image.png

规则

如上图所示,包材推荐决策过程中首先需要经过两道业务规则,需要人工手动维护到系统中:

  1. 根据约束条件过滤筛选可用的包材类型及范围:商品入库上架时即需 要维护相关信息,至少要限定使用的包材类型(比如纸箱还是塑料袋);
  2. 查询商品是否指定使用包材:满足一些有特殊包装要求的商品,遵循 非必要不维护原则。

算法

算法同样分为两步:

  1. 查询是否存在统计规则:由于商品或者包材基础尺寸均存在不准确的 可能性,严格根据尺寸匹配算法推荐的包材规格亦存在偏差;若某种商品 其包材推荐准确率较低,可实操中使用某种规格占比较高且超过一定阈值 (比如 80%)的情况,可认为对于该商品此种规格是最优选择并形成规则 记录下来,下一次同样商品再来请求时可直接使用规则;
  2. 根据尺寸匹配算法推荐:可分为装箱和装袋算法,后者其实可通过变 形转化为前者(算法详情请见下一章节)。主要流程如下图所示——把纸 箱按体积从小到大排序,返回第一个能装下商品的箱型即可,这样一来就 简化成一个装箱判定问题。

image.png

三、算法原理

装箱

装箱问题在运筹学中是一个经典并且非常重要的组合优化问题。所谓组合优化,是指在离散的、有限的数学结构上,寻找一个满足给定条件,并使其目标函数值达到最大或最小的解。一般来说,组合优化问题通常带有大量的局部极值点,往往是不可微的、不连续的、多维的、有约束条件的、高度非线性的NP完全问题。

三维装箱问题亦是 NP-hard 问题,而包材推荐就是此问题的一个典型应用,其本质就是如何合理的放置商品以达到装下的目的。
image.png
包材推荐场景中装箱算法具体逻辑可根据商品种类和数量分为以下三种:
1.单品单件:将包材和商品尺寸均按照降序排序得到 (L,W,H) 和 (l,w,h) ,若满足则判定可以装下。

2.单品多件:遍历各种堆叠方式,对于每种堆叠方式找到最小凸包(即能把所有商品包住的立方体),再把这个凸包当成单品单件去做判定是否装下。

  • 假设有N件商品,其尺寸为(l,w,h),堆叠方式可表达为,即在三个维度上商品件数。
  • 算法逻辑描述如下:
    image.png
  1. 多品多件:此种场景较为复杂,求解方法可分为精确解和启发式。
    image.png

精确解
image.png
如图所示,将商品顶点坐标、长宽高放置方向、相互位置关系作为变量,运用整数规划建模调用求解器求解,只要以下约束方程组有可行解即判定可装下。
image.png
(1),(2),(3)和(4)一起用来确保放置商品时,不会存在不同商品位置重叠的情况。 (5),(6)和(7)确保商品不会被放置到包材外面。
(8),(9)和(10)用来定义商品放置方式下的长宽高(不同的放置方式对应不一样的长宽高)。
image.png
(11)确保每个商品只有一个放置方式。
(12)定义 0-1 变量表示商品间前后、左右、上下的空间关系。
(13)定义 0-1 变量表示商品放置方式。

由于该类问题的复杂性,整数规划瓶颈在于当商品件数超过一定数量(比如 8)时求解难度和时间将大幅增加,无法在规定时间内获得精确解。

  • 启发式
    相对精确解,启发式牺牲精度换取速度,可快速求解。常见的三维装箱启发式算法有:

    • 切割空间
      我们将商品放在箱子的一个角上,这样我们就可以得到[a,b,c]三个最大剩余空间,组成一个最大 剩余空间组,如下图:
      image.png
      上图是只放入一个商品的情况,如果放入一个新的商品,则最大剩余空间组就需要更新。

      在该算法中,对于一个即将放入某一个最大剩余空间的商品来说,就会有 若干种放置方式。为了找到最优的放置方式,可以使用树搜索。

      将一开始的空箱状态S定义为根节点,每一个节点表示一种放置状态。在 每个节点上使用某种放置方式rank评价函数,选择最优的前m个放置方 式,作为下一层的子节点。如此迭代直到迭代到第d层(d是预先设定的 深度)。例如在d=2,m=3时,得到的树如下图所示:
      image.png
      当迭代到d层时,对于每一个叶节点继续向下迭代,采用最优的放置方式直到将箱子装满。再选取其中装载率最优的完全解所对应的叶节点,作为下一次迭代的根节点。

      Largest Area Fit First
      首先放置覆盖箱子水平面积最大的商品,以它的高度成为水平高度。接着能够填满剩余高度的商品优先放置。随后的商品堆放在同一层的剩余空间中,体积最大的商品优先。如果商品高度低于水平高度,算法也会尝试在那里放置一些。

      暴力搜索
      该算法没有选择最佳排列顺序或放置方向的逻辑,而是遍历所有排列、方向的可能性。由于其复杂性是指数级的,因此在合理的时间内可以包装的商品可行数量有限。

      其他常用启发式:遗传、模拟退火等,不再赘述。

装袋

袋子是软的,可变形,没有固定尺寸。近似的做法是把袋子看成两层薄膜,长宽为(L,W)(厚度为0)。然后把它捏成长方体,尺寸记作 (l,w,h) ,如下图所示:
image.png
image.png
图片源于网络

其中阴影部分代表上层,白色部分代表下层。只要长宽高满足如下条件:

image.png

再适当地枚举 (l,w,h) ,即把装袋问题近似地转化成固定尺寸的装箱问题。

四、衍生应用

切箱

对于商品数量多的大订单/包裹,即使是最大的包材也有可能装不下,于是就有切箱算法需求——即基于包材推荐将原订单/包裹分割成若干个订单/包裹并且分别匹配最优包材。
image.png

合包

对于同用户同地址的不同订单/包裹,在某些合适场景下(比如跨境集运、同库操作)可能进行合包,以减少包裹数从而降低物流成本。此时通常需要通过包材推荐算法判断是否能够合包。

箱型设计

今年的订单结构改变了,箱型怎么做调整才能适应新的订单结构?新来了一个大商家,原来的箱子还能用吗,是否需要新增箱子来匹配新商家的需求?大促要来了,现有的箱子能否匹配大促的需求?每个地区买的物品不同,是否需要针对不同的区域来设计更优的箱型?每年的SKU种类数不断变多,是否需要多增箱型来适应不断变多的SKU组合?

包材推荐是基于现有包材基础上推荐合适箱型, 而针对上述问题的解法是直接设计优化箱型尺寸,从源头直接减少浪费、节省成本。箱型设计需要基于数以亿计订单的尺寸,运用运筹优化算法重新设计一系列合适的箱型尺寸,最大化空间利用率或最小化包材表面积,其求解难度远高于包材推荐。目前得物供应链平台已初步成功打造一款箱型设计算法工具,在多个类目数据测试中已验证其效果。

包装方案推荐

推荐出库打包时除了要使用合适包材,有时还需要根据商品特点决定使用何种包装方案。比如易碎品、易燃品、高价品等可能都对应使用不同的填充物、包装方式。通常包装方案都需要人工进行手动输入维护,耗时费力。可以通过多模态算法基于商品文字描述、图片等信息自动识别归类是哪一种商品,并对应推荐使用预先设置好的哪一种包装方案。

五、作者结语

本文侧重介绍包材推荐中运筹优化算法实现的具体方法以及可以发挥的作用,旨在让大家了解其数学原理和业务价值。当然,算法在包材推荐中其实只是其中一个方面,非常依赖基础数据准确性,需要结合规则维护、报表建设、归因分析等各种手段一起提高推荐一致率,最终达到降本增效的目标。
包材推荐算法在电商、物流领域已普遍应用,无论是在得物还是一些友商业务中均获得落地价值。由于得物目前商品结构大多数为单品单件,合单/合包比例也很低,因此算法应用还处于相对起步阶段,覆盖范围还不高,发挥作用还不明显。然而我们相信随着得物平台的全面发展,包材推荐对算法的需求会越来越强烈,供应链平台算法团队也期待能与业产研各方一起共同打造具有得物特色的包材推荐算法应用落地体系。

引用:

  • 《仓储知识库 | 包材推荐装箱算法:贪婪前向树算法》https://www.163.com/dy/article/ICC2J41L0530UFIR.html
  • 《苏宁智能包装解决方案:小包裹背后的大智慧》
    https://www.infoq.cn/article/suning-packaging-solutions
  • 《包材推荐系统的设计与实践》https://blog.csdn.net/qx3501332/article/details/117283804

*文 / Lagrange

本文属得物技术原创,更多精彩文章请看:得物技术

未经得物技术许可严禁转载,否则依法追究法律责任!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lazada该怎么直播?开播需要有哪些条件?

随着电商平台的快速发展,直播电商已成为一种重要的销售和营销手段。作为东南亚领先的电商平台之一,Lazada也提供了直播功能——LazLive,使商家和品牌能够通过直播与消费者进行实时互动,推广产品并提升销量。要在Lazada上顺利进行直…

bmp格式如何转换成jpg?5个软件帮助你快速转换文件格式

bmp格式如何转换成jpg?5个软件帮助你快速转换文件格式 将BMP格式转换为JPG格式是许多人在处理图片文件时常遇到的需求。BMP是一种无压缩的图像格式,占用空间较大,而JPG是一种有压缩的图片格式,能大幅减少文件大小,更适…

链表的回顾与总结(一)正序、逆序、有序、插入、修改、删除

逆序链表 #include<iostream> using namespace std; struct node {int data;node* next; };//最好不要全局定义指针&#xff0c;很麻烦 void show(node* head) {while (head){cout << head->data << ;head head->next;} } int main() {int i, j, k…

链表的回顾与总结(二)有序链表合并、约瑟夫问题

两个有序链表的合并 #include<iostream> using namespace std; struct node {int num;node* next; }; void show(node* head) {while (head){cout << head->num << ;head head->next;} } void add(node* head1, node* head2,node*&head3) {hea…

东营市自闭症寄宿学校,专注提供个性化教育

自闭症&#xff0c;这个听起来遥远而陌生的词汇&#xff0c;实际上正在影响着越来越多的家庭。自闭症儿童&#xff0c;被亲切地称为“星星的孩子”&#xff0c;他们活在自己的世界里&#xff0c;对周围的一切往往视而不见、听而不闻。然而&#xff0c;在广州的星贝育园自闭症儿…

万恶之源:端口不通

解决方案 本地端口开放&#xff0c;第三方使用者无法访问&#xff0c;原因无非有三&#xff1a; 1、基础网络不通 网不通&#xff0c;别说端口了&#xff0c;连ping都没办法&#xff1a;因此&#xff0c;请首先检查双方网络基础环境是否互通 2、防火墙拦截 新开的服务器&#x…

P4可编程技术详解:从理论到硬件实现

P4的诞生 为打破传统的固定封装模式&#xff0c;充分解放数据平面的编程能力&#xff0c;Nick McKeown领导的斯坦福大学研究团队于2014年提出可编程处理语言P4。借助P4的数据平面编程能力&#xff0c;用户可在网卡、交换机、路由器等网络设备上实现包括VXLAN、MPLS等在内的各种…

Docker容器不断重启问题

1. compose配置文件 docker-compose.yml services:node_app:image: dockerproxy.cn/node:lts-bullseye-slimcontainer_name: node_appnetworks:macvlan_net:ipv4_address: 192.168.2.3# 挂载的卷标volumes:- app:/app# 工作目录working_dir: /app# 自动重启restart: always# …

系统移植三

一、设备树 设备树&#xff08;Device Tree&#xff09;是 Linux 系统中用于描述硬件信息的一种机制&#xff0c;尤其在 ARM 平台上广泛使用。在早期版本的 Linux&#xff08;如 2.6 及之前&#xff09;&#xff0c;设备的硬件信息通常是通过硬编码方式写在平台相关的文件中。…

python爬虫--tx动漫完整信息抓取

python爬虫--tx动漫完整信息抓取 一、采集主页信息二、采集详情页信息三、完整代码一、采集主页信息 先看一下采集到的信息,结果保存为csv文件: 打开开发者工具,找到数据接口。 使用xpath提取详情页url。 二、采集详情页信息 如上图所示,使用xpath提取详情页的标题、作…

CPU超线程技术是什么,怎么启用超线程技术

超线程技术是一种允许单个物理CPU核心模拟成两个逻辑核心的技术&#xff0c;从而提升处理器的并行性能和效率。以下是对超线程技术的详细介绍&#xff1a; 基本概念&#xff1a;超线程&#xff08;Hyper-Threading&#xff0c;HT&#xff09;是Intel公司研发的一种技术&#x…

mbist之sharebus知识小结

本文摘录至微信公众号 搞搞芯意思 为何用sharebus? CPU/NPU/GPU等关键模块对性能要求很高,对功耗、时序、面积敏感,是整个芯片设计瓶颈。常规mbist设计插入的额外电路会对function时序收敛带来负面影响,而且会造成布线拥堵,给芯片性能和pd设计带来挑战。sharebus方…

【环境搭建】远程服务器搭建ElasticSearch

参考&#xff1a; 非常详细的阿里云服务器安装ElasticSearch过程..._阿里云服务器使用elasticsearch-CSDN博客 服务器平台&#xff1a;AutoDL 注意&#xff1a; 1、切换为非root用户&#xff0c;su 新用户名&#xff0c;否则ES无法启动 2、安装过程中没有出现设置账号密码…

python发送邮件带附件:配置全指南与步骤?

python发送邮件带附件教程&#xff1f;python如何发邮件带附件&#xff1f; 无论是工作报告、项目文档还是个人通知&#xff0c;邮件都能快速传递信息。而当这些信息需要附带文件时&#xff0c;Python发送邮件带附件的功能就显得尤为重要。AokSend将详细介绍如何使用Python发送…

线程属性详解

目录 catch语句 catch语句简介 catch语句中的内容 线程的属性 Thread提供的属性和方法 线程的属性方法 前台线程 后台线程 是否存活 catch语句 catch语句简介 我们首先认识一下catch语句&#xff0c;catch语句是用来捕获异常&#xff0c;在catch代码块中可以在捕获异…

Spark第一天

MapReduce过程复习 Spark由五部分组成 RDD五大特征 1、 Spark -- 代替MapReduce <<<<< scala是单机的&#xff0c;spark是分布式的。>>>>> 开源的分布式计算引擎 可以快速做计算 -- 因为可以利用内存来做一些计算 (1) 分为5个库(模块) : 1、…

C# 创建Windows服务,bat脚本服务注册启动删除

1、创建Windows服务&#xff0c;如下图。.NET Framework 4。Visual Studio 2019 。 2、在项目文件夹下创建文件夹LogConfig用于配置log4net&#xff0c;在LogConfig文件夹下新建log4net.config文件&#xff0c;如下图。 log4net.config文件内容如下。 <?xml version"…

能自动铲屎的自动猫砂盆是智商税吗?双十一热门自动猫砂盆推荐

大家平时一天要给猫咪铲几次屎呢&#xff1f;大多数应该都是早中晚各一次吧&#xff0c;在家的时候尚且能办到&#xff0c;但是一到了上班、出差、旅游的日子&#xff0c;我们又要如何保证猫咪的猫砂盆得到及时的清洁呢&#xff1f;要知道小猫咪的屎也很臭&#xff0c;猫砂盆长…

Linux云计算 |【第四阶段】RDBMS2-DAY4

主要内容&#xff1a; MHA概述、部署MHA集群 一、MHA概述 1、MHA简介 MHA&#xff08;Master High Availability&#xff09;是一款开源的MySQL的高可用程序&#xff0c;由日本DeNA公司youshimaton开发&#xff0c;是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的…

Vue组件继承与扩展

Vue组件继承与扩展 前言 与Class继承类似&#xff0c;在Vue中可以通过组件继承来达到复用和扩展基础组件的目的&#xff0c;虽然它可能会带来一些额外的性能损耗和维护成本&#xff0c;但其在解决一些非常规问题时有奇效。本文将通过一些非常规的功能需求来讨论其实现过程。 …