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

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

  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.xdnf.cn/news/1560226.html

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

相关文章

算法复杂度 (数据结构)

一. 数据结构前言 1.1 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用,所以我们要学各式各样的数据结构,如&#xff1…

[Qt] 信号与槽:深入浅出跨UI与跨线程的信号发送

文章目录 如何自定义信号并使用自定义信号的步骤1.使用 signals 声明信号2. 信号的返回值是 void3. 在需要发送信号的地方使用 emit4. 使用 connect 链接信号和槽5. 完整代码示例总结 如何跨UI发送信号Qt跨UI发送信号机制详解案例概述Qt 信号与槽机制简介代码逻辑详解主窗口 Wi…

进程通讯方式区别(从不同角度看)

*常用到的不同主机间进程通讯:Socket。比如:host和引擎间socket指令通讯、分派和复判之间指令通讯; *共享内存:在Windows系统中,共享内存的实现通常有以下几种方式: 1.内存映射文件(最常用):(…

计算机毕业设计 医院预约挂号系统的设计与实现 Python毕业设计 Python毕业设计选题【附源码+安装调试】

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

【01】手把手教你0基础部署SpringCloud微服务商城教学-Mybatis篇(上)

序言: 微服务是一种软件架构风格,它是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。 想学习SpringCloud搭建项目,首先我们需要学习的就是Mybatis和Docker。 大家在日常开发中应该能发现,单表的CRUD…

没人告诉你的职场人情世故

看到前同事在群里分享的新年开工遭遇,真是让人感同身受。 第一天就遇到挫折,因为工作做得太快、太早交付,结果反被领导批评,还得重做,头大如斗。这不就提醒我们得时时刻刻记着职场里的那些不成文的规矩吗?…

【C++】常用数据结构纲要(简易版)

非静无以成学。——诸葛亮 数据结构概括 1、什么是数据结构呢?2、讲述过的结构2、1、前言2、2、树->二叉树->两种平衡二叉树2、3、单链表->双链表->带有哨兵位的链表 3、B树3、1、概念及图示3、2、B树数据处理3、2、1、查找3、2、2、插入 4、哈希表4、1…

测试点总结 | 搜索功能如何测试?

这里仅针对通用搜索框的常见测试点进行总结分享,实际工作中需结合搜索功能的背景业务需求及其他依赖条件来综合设计测试点。 一、功能实现部分 (1)如果支持模糊查询,搜索名称中任意一个字符是否能搜索到 对于支持模糊查询的搜索…

猫头虎分享已解决Bug || AssertionError: Torch not compiled with CUDA enabled 解决方案

🐯 猫头虎分享已解决Bug || AssertionError: Torch not compiled with CUDA enabled 解决方案 摘要 今天猫头虎收到粉丝提问:“猫哥,我在使用 PyTorch 进行 AI大模型训练 时,出现了 AssertionError: Torch not compiled with CUD…

10.9 LeetCode 3289 0001 3295

思路: 1、用数组下标来表示是否出现过,初始为 0,出现则加 1,判断大于等于 2 的数字即为多次出现。 2、先将数组排序,依次遍历排序过的数组,若第 i 位与第 i1 位相等,则说明是重复数字。 class …

mybatis解析异常

1.问题现象 Caused by: org.springframework.dao.TransientDataAccessResourceException: Error attempting to get column sale_id from result set. Cause: java.sql.SQLException: Cannot convert value from column 19 to TIMESTAMP. 造成原因:需要给表中中增加字段以满…

审稿人喜欢什么样的Novelty?

在学术出版的世界里,“novelty”(创新性)是一个被频繁提及的词汇。它似乎是衡量一篇文章价值的黄金标准。然而,当我们深入挖掘这个概念时,会发现所谓的创新性并不是那么绝对。今天,我们就来聊聊审稿人眼中的…

No.15 笔记 | CSRF 跨站请求伪造

目录 一、基础知识 (一)cookie 和 session、同源策略 (二)CSRF 原理 二、CSRF 类型 (一)GET 类型 (二)POST 类型 三、CSRF 实例讲解 (一)真实案例 &am…

软件测试学习笔记丨数据库进阶及redis数据库

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32358 一、数据库进阶 1.1 MySQL中SQL执行原理 1. SQL语句执行过程 2. Server组件 连接器:连接管理,权限验证查询缓存:命中直接返回结果分析器&#xff…

秋天来临,猫咪又到换毛季,掉毛严重怎么办?宠物空气净化器有用吗?

秋天到了,新一轮的宠物换毛季又来了。谁能想到这只胖猫和之前刚接回来时的皮包骨小猫是同一只!除了养了一年长了些肉外,更多的都是换毛季掉毛”膨胀“的。每天下班回家都要搞卫生,家里衣服上、地板上,目光所及之处都有…

acwing:1576. 再次树遍历

打卡一道有意义的题。 题签: 通过使用栈可以以非递归方式实现二叉树的中序遍历。 例如,假设遍历一个如下图所示的 66 节点的二叉树(节点编号从 11 到 66)。 则堆栈操作为:push(1); push(2); push(3); pop(); pop(); pu…

智能配音软件哪款好?分享5个搞怪软件

想要让视频或社交媒体内容更加生动有趣?搞笑配音软件是个不错的选择。 无论是嘻哈风格的视频,还是搞怪的段子,合适的配音都能让内容增色不少。 今天,就让我们来探索六个文字配音软件,它们不仅能帮你实现搞笑配音&…

H5如何做性能测试?

说起H5性能测试,可能许多同学有所耳闻,但是不知道该如何去做性能测试,或者不知道H5应该关注哪些性能指标。今天我们就来看下。希望阅读本文后,能够有所了解。 常用指标 1、H5性能相关参数介绍 白屏时间:用户首次看到…

L16171819 【哈工大_操作系统】进程同步与信号量信号量临界区保护信号量的代码实现死锁处理

L2.9 进程同步与信号量 让进程走走停停,实现进程同步。 1.、信号量的定义 生产者Producer需要判断是否还有空闲缓冲区生产资源,所以定义一个标志empty,初始值为最大可用资源数,在开头维护;同时,在消费者…

3-GPIO八大输出模式 推挽输出 与 开漏输出

推挽输出 与 开漏输出 GPIO有八大输出模式 下图为每个GPIO口的基本结构: 通过这张图来学习 最右侧是I/O引脚,是从STM32引脚到GPIO口的导线,与其他芯片进行连接的线。 芯片内部电路所能承受的电压有限,当未知的静电进入GPIO口&a…