分布转化为网格

分布转化为网格


首页 » 资源 » 此处

Envision 中的分布很实用,因为它们受到整个分布代数的支持。但是,要想生成库存决策,通常需要将这些分布重新转化为网格,也即枚举分布值(通常为概率)的表。利用此类网格可以创建包含建议的采购订单量或建议的存货动态的最终表。我们将在这里详细介绍能够用于此用途的函数 extend.distrib()


网格与分布的对比

网格是一种无格式表,其中包含直方图桶的列表,每个初始分布一个直方图,直方图中的每个桶各一行。网格一般表示为一个包含以下四个字段的表:

  • Id 用于标识项目
  • Min 是直方图桶的下边界(包含在内)
  • Max 是直方图桶的上边界(包含在内)
  • Value 是与直方图桶关联的值

对于给定的项目,网格可以包含一系列用于表示整个分布直方图的桶。如果分布为随机变量,桶的值可以解读为此桶覆盖的段中的分布概率

网格不如分布灵活。从性能上说,常常无法保持宽度为 1 的桶,而是会使用更大的桶,才能符合网格在 Lokad 管理范围内的存储要求。非单元的桶使得网格计算复杂化。另外,根据设计,网格具备紧凑支持(从数学意义上说):仅针对有限数量的点定义网格的非零值。

另一方面,网格是无格式,可以通过常用的 Envision 运算符处理到其他表中。根据经验,Envision 强调利用分布完成所有经济和概率建模的方法,将转化为网格作为最后的步骤之一,仅排在生成建议的最终供应链决策前面。

extend.distrib() 的语法

Envision 分布提供了一种强大的代数,利用它可以避免对列表进行费解的概率计算。但是,有时保留原始概率列表是可以的,甚至可以说是合乎需要的。分布扩展 extend.distrib() 将分布向量转化为表,下面的语法说明了这一点:
table T = extend.distrib(D)
show table "Distribution details" with 
  Id
  T.Min
  T.Max
  T.Probability
参数 D 应为分布向量,通常由 Lokad 的概率预测引擎生成。表 T 为初始表,即上面脚本中的隐式表 Items 的扩展。表 T 填充了三个字段:

  • T.Min:此段的积分下边界(包含在内)
  • T.Max:此段的积分上边界(包含在内)
  • T.Probability:包含性范围内的分布之和。

Probability 字段不论其名称如何,实际上是指返回的桶范围内的分布之和。

对于相对紧凑的分布,段长为 1,因此 T.Min == T.Max。但是,如果是在较高值范围内分布,段长为 1 可能导致生成数百万行,因而变得难以处理。因此,在面对此类数值较大的分布时,Envision 会围绕较大的段自动聚合分布。故此算法会进行细调,以保持生成的表大小可以管理。

按照设计,extend.distrib() 总是会挑选出 0 段。因此,[0;0] 段总是会在生成的表中产生自己的行。这种行为在许多零需求的边缘案例(例如无限存货保证期,需要某些专门的逻辑)的情形中其实很有用。

此外还为 extend.distrib() 提供了另外三个过载,用于对所生成表的特定粒度实施进一步控制。

差距选项

第一个过载的作用,是在考虑当前库存水平的情况下帮助构建采购优先级列表。语法如下:
table T = extend.distrib(D, S)
上面定义了第一个参数 D。第二个参数 S 应为整数。存在第二个参数时,所生成的表总是包含两行,来专门用于 [0;0] 和 [1;S] 这两个段。其他段从 S+1 起自动生成,上文进行了详述。未指定此参数时的默认值为 0。

参数 S 常常定义为可用存货加上订购存货之和。实际上,在进行再订货时,只有超出当前库存水平的需求概率才应当予以考虑。

倍数选项

第二个过载针对涉及批次倍数的情形。在这些情形中,应当在特定大小的段内对表进行迭代。相关语法如下:
table T = extend.distrib(D, S, M)
上面定义了参数 DS。第三个参数 M 应为整数。它表示所需的段长。因此,表包含段 [0;0], [1;S], [S+1;S+M] [S+M+1;S+2M] …的列表。如果 M 为 0,那么此函数将恢复为自动确定段长。

实际上,强制段长为 1 可能导致性能问题,因为表的大小可能为任意大。因此,Envision 诉诸于 M倍数。使用倍数可以确保批次倍数逻辑正常工作;同时对所生成的行数保持合理的限制。

根据经验,我们建议不要使用此过载,除非是涉及批次倍数;在涉及批次倍数时,建议为任何没有具体批次倍数的项目保留 M 为 0。

达到选项

第三个过载针对涉及 MOQ 的情形。在这些情形中,表应当迭代足够长度以达到所需的特定值。相关语法如下:
table T = extend.distrib(D, S, M, R)
上面定义了参数 DSM。第四个参数 R 应为非负整数。它表示网格应达到的最大预期值,也即有一行的 T.Max 大于或等于 R。未指定此参数时的默认值为 0。

实际上,此参数用于处理较大的最小订单量 (MOQ) 限制,而这只有对所生成的表迭代足够长度来覆盖 MOQ 值时才能满足这一点。

根据经验,我们建议不要使用此过载,除非是要达到 MOQ;在涉及 MOQ 时,建议 R 尽量小。较小的 R 值不会防止表 T 达到更高的值,只会确保达到较大的值。