库存调度问题


首页 » 资源 » 此处 作者:Joannès Vermorel,2016 年 11 月

库存调度属于一种供应链问题,涉及到在多个位置之间平衡初始库存数量。库存拆分需考虑每个位置最初具备的库存量,以及考虑调度本身涉及的运输成本。调度解算器是一种本质上类似于 MOQ 解算器的数值解算器,只是处理的是调度问题而已。

调度问题概述

库存调度是指一种定量供应链问题,即需要在各个位置之间平衡产品库存。每对产品+位置指向一个 SKU(库存量单位)。

是否确定为每个 SKU 保留特定数量的库存存在经济激励;这些激励可以作为经济效益建模。如果这个特定位置需要这些库存,那么在此位置添加较多的库存可能会产生积极效益。但如果额外的库存只是提高了持有成本,实质上并未改善服务的话,那么也可能产生不良的效益。

同样还需要考虑运输成本。这些成本通常表示将库存从一个地方运往另一个地方所进行的投入。这些成本可能存在线性关系,即运输成本随商品的运输数量线性增加,但也可能不存在线性关系,即无论何时进行运输,都按统一成本计算。

最后,由于运输限制,成对的位置之间可能不适合进行运输。当在一对相容的 SKU(换言之,这两个 SKU 拥有相同的库存产品)之间可以平衡库存时,我们就可以说这一对位置具有运输优势

总的目标是最大化与新库存位置通过运输产品到其他位置获得的相关经济效益,同时最小化相关的运输成本。

调度问题的形式定义

假设 $i$ 和 $j$ 为位置,$k$ 为产品。$T_{ijk}$ 为产品 $k$ 从 $i$ 运往 $j$ 的非负整数。令 $U_{ijk}$ 为单位运输成本。令 $G$ 为三点法 $(i,j,k)$ 的一部分,$V_g$ 和 $g \in G$ 为与子集 $g$ 相关的运输成本阈值。令 $R_{ik}: \mathbb{Z}\to\mathbb{R}$ 为与位置 $i$ 的产品 $k$ 库存变化相关的效益函数。令 $Q_{ik}$ 为可以从位置 $i$ 运输产品 $k$ 的最大库存数量。令 $H$ 为Heavyside 阶跃函数

我们想求的是能够最大化以下值的运输解 $T_{ijk}$: $$\sum_{i,k} R_{ik}\left(\sum_j (T_{ijk} - T_{jik}) \right) + \sum_{i,j,k} T_{ijk} U_{ijk} + \sum_{g \in G} V_g\ H\left(\sum_{(i,j,k) \in g} T_{ijk}\right) $$ 同时要考虑以下限制: $$ \forall i, \forall j, \forall k, T_{ijk} \geq 0 \\ \forall i, \forall k, \sum_j T_{ijk} \leq Q_{ik} $$ 这里的效益 $R$ 通常表示等式的正向部分,成本 $U$ 和 $V$ 表示负向部分。

一般而言,找出最佳运输水平是一道较难的数字问题,但使用专门的解算器可以求出近似解。

Envision 针对调度解算器的语法

Lokad 提供了一种专门针对调度问题进行数字求解的组件,这个组件就是调度解算器。在本节中,我们将阐述与该解算器相关的 Envision 语法。solve.dispatch() 函数使用命名参数:
T.Q = solve.dispatch(
sku: S.Product, S.Location
reward: S.Reward
stockAvailable: S.Available
stockEligible: S.Eligible // optional
edge: T.Product, T.Source, T.Destination
unitCost: T.UnitCost // optional
groupId: T.Group // optional
groupCost: T.GroupCost) // optional
S 用于表示所有 SKU,也即所有产品+位置对。表 T 用作运输图,用于表示可能进行运输时的所有优势。返回的数量 - T.Q - 表示实际优化的运输数量。

这些参数的说明如下:

  • sku(文本,文本):SKU 的产品和位置,与列出所有可能运输情况的 edge 参数存在隐式关联。
  • reward(分布):与给定位置的项目的最终库存位置相关的效益分布。
  • stockAvailable(数值):表示在进行任何存货运输前计算每个 SKU 效益的起点。
  • stockEligible(数值):表示可以从 SKU 中提取的最大库存量。如忽略此值,整个 stockAvailable 均视为符合条件。实际上,运输中的存货将被计入 stockAvailable 的一部分,但是此存货不能被视为可以直接(再次)运输。
  • edge(文本,文本,文本):所有可以接受的运输优势的列表。如果此表中不存在某项优势,那么针对这项优势就不能进行任何运输。
  • unitCost(数值):针对某项优势运输库存数量时的'单位''线性运输成本。忽略此成本时,则假定其为 0。
  • groupId(文本)和groupCost(数值):如果任何属于该组的优势均非零,那么非线性运输成本便会生效。否则,运输成本保持为 0。在忽略此成本时,假定其为 0。

调度解算器利用了 Envision 中的分布代数来表示经济效益。这些分布通常利用库存效益函数事先获取。

根据调度解算器计算得出的运输结果,可以很简单地计算出每个 SKU 的库存变化:
S.Added = sum(T.Q) by [T.Product, S.Destination] at [S.Product, S.Location]
S.Taken = sum(T.Q) by [T.Product, S.Source] at [S.Product, S.Location]
S.Variation = S.Added - S.Taken

参考文献

这里呈现的供应链调度问题可以视为传统运输问题(维基百科)与传统经济调度问题(维基百科)的结合。运输问题侧重于通过在位置与位置之间移动商品而产生的运输成本。经济调度问题重视的是与不同位置所收到的产品数量相关的效益。此外,调度问题也可以视为资源分配问题的一种特例。