智能补货系统的设计思路

目录

零售业和制造业,离不开供应链。搞供应链,离不开库存计划。简单来说,就是要回答好两个问题:什么时候进货?进货量是多少?下一个进货订单,从生产到运输和入库,需要一定的时间,短则数天,长则数月。

所以,需要提前进货。其中提前期依赖生产的耗时,进货量依赖未来的需求量。可以尝试预测需求,但是测不准。货进多了,资金周转慢,库存成本高;货进少了,卖得少,赚得少。总之,库存量把握不好就容易亏本。

所以说,做库存计划很难。

本文分享一些大规模商品补货的实践经验,主要思路是用数学模型和软件系统,目标是解决效率和成本问题。

业务背景

先介绍一下业务背景。假设我们是一家零售公司,有自营品牌,也有代销商品;有线上业务,也有线下业务;有传统打法,也有互联网玩法。

销售品类

有丰富的销售品类,涵盖生活的方方面面,比如居家用品、服装配饰、美食酒水、个护清洁、数码家电、运动旅行等等。

这意味着不同的商品,有不同的销售规律(比如季节性)、不同的采购周期、不同的供应商、以及不同的限制条件。

销售渠道

有多样化的销售渠道,例如:

  • 官方线上渠道:APP、小程序、网页
  • 第三方线上渠道:京东、淘宝、拼多多等
  • 官方线下门店
  • 合作线下门店

不同的渠道,用户群不同,因而主卖的商品也不同,导致渠道的销售规律也不同。渠道之间的销售存在互补,也存在竞争。渠道之间可以共享库存,也可以隔离库存。

库存类型

商品分为自营品牌和代销品牌。库存类型主要有自营仓库和外部仓库。综合来看,主要有以下几种类型:

  • 自营品入自营仓
  • 自营品入外部仓库
  • 代销品入自营仓
  • 代销品入外部仓库
  • 线下店库存(可直接销售)

从仓促角度来看,商品类型还可以分为食品和百货,因为食品存储要求高,需要用单独的仓库。

自营仓库和外部仓库有多个,不同仓库大小不同,存放的商品也不完全相同。这意味着哪怕是同一款商品,它在不同仓库的仓储成本,是存在差异的。

此外,仓库的耗材也需要补充,比如纸箱、塑料袋、共挤膜袋、气垫等。

促销玩法

电商玩法虽然复杂,但万变不离“价格营销”。而营销活动会带来剧烈的销售波动,因此特别容易造成极端的库存状态,比如要么压仓,要么售罄。

下面这些促销,不过是冰山一角。

  • 电商大促:618、双11、双12等
  • 中国的节日:春节、元宵节、中秋节、国庆等
  • 国外的节日:父亲节、母亲节、圣诞节、情人节等
  • 营销事件:开学季、读书日、年货节、开门红等
  • 日常玩法:加价购、限时购、直播、买赠、满赠、满减等

真正让人头疼的是,很难提前知道参加活动的商品。这种不确定性给库存计划带来巨大的挑战。

成本结构

库存管理做得好不好,常用的衡量指标是库存周转天数和缺货率。前者代表成本,库存周转天数越小,意味着资金周转越快;后者代表收益,缺货率越低,销售损失越小。

这两个指标容易计算,但不见得适用于所有场景。例如,它不能回答如何在库存周转天数和缺货率之间做取舍。当我们需要做大规模的商品补货时,这样的指标就显得很粗糙。

事实上,库存管理的最终目标是最小化成本。建立适合的补货模型,可以得到(或者逼近)最优解。

应该根据业务情况,去梳理各项成本。我们可以把成本分成如下几类:

  • 固定成本:仓储、人力、设备等费用
  • 采购成本:采购管理、物流运输、入库等费用
  • 履约成本:订单捡货、打包、配送等费用
  • 资金成本:借贷利息、融资成本、机会成本等
  • 持有成本:持有商品的成本,例如遗失、损坏、变质、过期等
  • 销售损失:销售亏损、缺货损失等

不同商品的成本不同、销售利润不同,因此最优的库存水位也不同。当成本或利润发生变化时,补货模型计算出新的最优解,从而适应变化。

以上是关于业务的介绍。用一句话总结,业务很复杂。在这样的背景下,我们应该如何制定补货计划?

问题描述

为了设计满足业务要求的补货系统,接下来需要把问题进一步明确。主要从目标、功能、约束三个维度来看。

目标

业务目标是最小化成本(含销售损失)。成本项可以是所有与库存相关的成本,也可以是几项最关键的成本,还可以用库存周转天数和缺货率等间接指标来近似地表示。

成本梳理是一项复杂而且长期的工作。应该做到什么程度,取决于业务现状以及数据基建能力。从这个角度来看,补货系统要能适应业务目标的变化。

功能

补货系统应该具备如下能力:

  • 多渠道补货:可根据销售渠道、仓库、供应商等多个维度进行补货
  • 批量化:自动生成十万(甚至百万)商品的补货计划
  • 效果可见:事前可评估补货计划,事后可复盘业务结果
  • 可干预:人工可以对补货计划进行调整
  • 风险可控:计算结果稳定可靠

总结一下,就是做到三点:可扩展、可解释和可控制。换句话说,系统功能要灵活,人要搞得明白结果,还要好用又可靠。

约束

在下补货单时,还要考虑业务上的约束。下面是一些常见的因素:

  • 最小起订量:一个订单的采购量不得低于最小采购量。

  • 提前期:从下订单到入库所耗费的总时长,其中包括可能涉及生产、运输等一系列中间环节。

  • 最小采购频次:因为某些业务原因,使得采购行为不能太频繁,例如要求最多一周采购一次。

  • 箱规:采购量一般是以件为单位,但运输时一般是以箱为单位。

值得注意的是,不同商品(不同供应商或不同的入库仓),对应的约束条件可能是不同的,所以补货系统需要能处理差异化的约束。

以上就是要解决的补货问题,其中还有很多细节待补充,但不影响我们去思考解决方案。因为实际业务会不断变化,细节变多,越变越复杂。

算法架构

我们看到,这个补货问题很复杂,梳理清楚都不容易。那么如何解决它?

下面分享一下我的思路。

用一句话描述,就是化繁为简。细节太多不好设计;太简单又解决不了问题。难点在于如何把握这个度。

第一,抓重点。

先搭框架,后处理细节,重点是把补货计划做好。要做补货计划,重点是做好需求预测,另外就是把预测结果转化成补货量。

于是我们得到两个核心模块:预测和决策。如果能把这两个问题解决好,库存成本就不是问题,剩下的就只有工程和体验问题。

此外,要做好预测,特征工程很重要,可以再单独拆出一个“特征”模块。

第二,完善框架。

前面说,补货系统的计算结果要可靠,还要能评估效果。我们引入仿真、监控和分析模块:

  • 仿真:用来验证预测模型和补货模型的效果,离线验证效果和可靠性。
  • 监控:自动检测各模块的数据异常,发现异常报警或者中止流程,防止造成资金损失。
  • 分析:事前解释补货原因,事后分析补货效果。

第三,补充细节。

根据前面的分析,我们得到下图所示的算法架构。

架构图只是对技术模块的一个高度抽象,它不足以指导开发实施。接下来还要细化每个模块,具体来说,就是要定义各模块的接口。下文以预测模型和决策模型为例,来说明如何细化各模块。

第四,落地实施。

这一步不多说,大多是标准流程,比如验证思路、工程化、交互设计、评审、开发、测试等。

预测模型

设计模块与设计系统,其思路是类似的。先明确预测问题,例如,输出一个商品、一段时间(历史或未来)的总销量(或者销量的分位数)。

考虑如下因素:

  • 支持概率分布,即输出分位数 $\alpha$ 对应的销量值 $x$,满足 $P(X\leq x) = \alpha$,其中 $X$ 代表销量的随机变量。

  • 支持俺渠道预测,其中渠道可以是销售渠道,也可以是仓库或者线下店。

  • 支持不同版本的预测。

我们得到下面的接口定义。

输入

参数类型说明必填
skuIdinteger商品ID
startDatedate开始日期
endDatedate截至日期
channelList<string>渠道列表否,默认输出所有渠道的预测值
alphadouble分位数否,默认采用点预测
modelstring预测模型的名称否,不指定则采用默认的预测模型
versionstring版本号否,默认使用最新的版本

输出

参数类型说明
skuIdinteger商品ID
channelstring渠道名称
valuedouble预测值

这样一来,我们要实现一个预测模型,只需要满足上述输入和输出即可。在实际中,不同商品(不同渠道)销售规律不同,建议实现多种预测模型,比如规则模型、时间序列模型、统计模型、神经网络模型等。

决策模型

决策模型的功能是计算补货量,它是预测模型的下游,因为预测结果是它的输入之一。此外,它还要考虑业务约束。不同商品可能由不同的决策模型来处理。

例如,要实现如下补货功能:

  • 支持多种最小起订量的度量,例如按SKU件数、按SPU件数、按重量等。
  • 支持多供应商,例如同一商品有多个供应商。
  • 支持分批次到货。
  • 支持俺仓库补货。

决策模型的接口定义如下。

输入

参数类型说明必填
skuIdinteger商品ID
ltinteger提前期
moqinteger最小起订量
moqTypeinteger0 - 件数;1 - 重量否,默认0
ConstraintsList<string>约束条件,例如 moq_by_spu:spu维度共享moq
moq_by_vendor: 供应商共享moq
否,默认按SKU/供应商维度定义moq

值得注意的是,不同决策模型的输入参数可能有差异。因此,在定义输入参数时,我们把差异化的参数一律放在 Constraints 中,从而保证决策模型的灵活性。

输出

参数类型说明
skuIdIntegersku id
validDatedate生效日期
vendorstring供应商
valuedouble采购量
inboundDatedate期望入库日期
warehouseIdstring仓库id
inboundQuantityInteger入库量

要实现决策模型,主要工作是定义符合业务情况的优化目标和约束条件,然后用数学语言进行表达。前文提到要最小化各项成本以及销售损失,就是通过求解这样的数学模型来实现。

已经介绍完预测和决策模块的设计思路,其余模块的设计思路是相似的,我们不赘述。剩下的就是去工程化,以及迭代各个模型,我们不展开讨论。

总结

本文介绍了智能补货系统的设计思路:先了解业务背景,然后提炼问题,进而抽象出功能模块,再把各模块具象化,最后是实现这个系统。希望这些经验能帮大家去解决业务中遇到的类似问题。

这个智能补货计划系统,相比传统的人工计划,有如下优势:

1、效率非常高。系统可以自动分析和处理数据,自动决策,可应用于大规模的商品(原材料)补货。

2、结果稳定可靠。预测模型和算法模型可以演进,从而让业务经验沉淀下来。

3、目标导向。业务目标、成本结构以及销售利润变化时,系统计算出的补货量会随之变化。从这个角度来看,模型正确的前提下,补货策略能保证最优。

4、试错成本低。系统的仿真能力可以让业务模拟不同的补货策略和销售策略,并得出分析结论,甚至可以为上游业务提供决策依据。

相关文章

报童问题

本文介绍了一个经典的商品采购模型,称之为报童问题,以及它的解法。该模型通过考虑需求的不确定性来最大化销售利润。本文的主要内容参考 Gallego1。

更多

大规模库存调度的算法实践

大型的零售公司一般会自建(或租用)多个仓库来储存商品,以便满足不同区域的销售。理想情况是每个仓库的库存量都能匹配当地客户的需求。但在实际中,有些仓库可能会出现商品缺货或滞销的情况。

更多

包材推荐系统的设计与实践

业务背景 在电商或者物流行业中,每天有数以万计的订单需要拣货、打包和出库。打包的过程就是把订单中的商品用包材进行包裹,常见的打包方式有缠膜、装袋和装箱。袋子和箱子有不同的种类和型号,比如袋子有共挤膜袋、镀铝膜袋、塑料袋等。

更多