《现代库存管理:模型、算法与Python实现》 课件 第10章-某零食企业W库存策略优化实战_第1页
《现代库存管理:模型、算法与Python实现》 课件 第10章-某零食企业W库存策略优化实战_第2页
《现代库存管理:模型、算法与Python实现》 课件 第10章-某零食企业W库存策略优化实战_第3页
《现代库存管理:模型、算法与Python实现》 课件 第10章-某零食企业W库存策略优化实战_第4页
《现代库存管理:模型、算法与Python实现》 课件 第10章-某零食企业W库存策略优化实战_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

现代库存管理:模型、算法与Python实现第10章某零食企业W库存策略优化实战10.1背景介绍企业W是一家以零食为主要产品的企业:来自线上需求激增,需求结构日趋复杂非必要库存高,热销商品缺货暴露了传统库存管理模式的低效滞后企业的发展趋势和转型需求:由人工预测、手工计划的模式的数字化转型将海量数据的价值充分利用起来建立一个智能化的补货系统10.1背景介绍试点规模:该系统的功能需求:提供多种基于历史销量数据拟合产品需求分布的拟合工具给定库存策略下,策略参数与安全库存量的自动化计算提供一套库存策略模拟仿真工具进行成本评估200+SKU1天/3天/7天的盘货周期2至7天不等的提前期10.2数据集概况数据规模:表一数据:‘sku_id’:产品id‘date’:销售日期‘sale’:销量2020年8月1日开始,到2021年1月31日为止6个月的销量数据前四个月的数据作为训练集(train_df)后两个月为测试集(test_df)datesku_idsale02020-08-01SKU0016.012020-08-01SKU002722.022020-08-01SKU00310.032020-08-01SKU0049.042020-08-01SKU0057.010.3需求预测参数化方法:调用Python的scipy.stats统计工具包进行分布拟合:正态分布拟合伽马分布拟合泊松分布拟合对数正态分布拟合defget_para_policy(sales_qty,rep_time,dist_type,target_csl,

sample_size=1000):

"""

Args:

sales_qty:销量数据

rep_time:补货周期

dist_type:指定拟合分布类型

target_csl:期望的周期服务水平

sample_size:样本量

Return:

dist_paras:拟合出的需求分布参数

oul:目标库存水平

ss:安全库存量

"""

ifdist_type==

'normal':

dist_paras=stats.norm.fit(sales_qty)

dist=stats.norm(*dist_paras)10.3需求预测代码续:elifdist_type==

'gamma':

dist_paras=stats.gamma.fit(sales_qty)

dist=stats.gamma(*dist_paras)

elifdist_type==

'poisson':

dist_paras=np.mean(sales_qty)

dist=stats.poisson(dist_paras)

elifdist_type==

'lognormal':

dist_paras=stats.lognorm.fit(sales_qty)

dist=stats.lognorm(*dist_paras)

else:

raise

Exception

#根据分布,构造补货周期内需求样本

rep_time_sample=[sum(dist.rvs(rep_time))for_inrange(sample_size)]

oul=np.quantile(rep_time_sample,target_csl)

ss=oul-np.mean(rep_time_sample)

returndist_paras,oul,ss10.3需求预测参数化方法:假设每天的需求独立,构造补货周期内需求样本#根据分布,构造补货周期内需求样本

rep_time_sample=[sum(dist.rvs(rep_time))for_inrange(sample_size)]

oul=np.quantile(rep_time_sample,target_csl)

ss=oul-np.mean(rep_time_sample)

returndist_paras,oul,ss对于’SKU001’,使用正态分布进行需求拟合:

sku=

'SKU001'

sku_sales_qty=train_df[train_df['sku_id']==sku]['sale'].values.tolist()

normal_dist_paras,normal_oul,normal_ss=get_para_policy(sku_sales_qty,rep_time_dict[sku],

'normal',0.9)print('使用正态方法进行拟合,估计得到的均值为:%.2f,标准差为:%.2f'

%(normal_dist_paras[0],normal_dist_paras[1]))

print('目标库存水平为:%.2f'

%normal_oul)

print('安全库存量为:%.2f'

%normal_ss)估计得到的均值为:26.16,标准差为:61.42

目标库存水平为:406.92

安全库存量为:210.4410.3需求预测经验分布估计:使用经验分布估计相应的需求分位数,计算对应库存指标:

defget_empirical_policy(sales_qty,rep_time,target_csl,sample_size=1000):

"""

Args:

sales_qty:销量数据

rep_time:补货周期

target_csl:期望的周期服务水平

sample_size:样本量

Return:

oul:目标库存水平

ss:安全库存量

"""

#使用重采样技术,构造提前期内需求样本

rep_time_sample=[sum(np.random.choice(sales_qty,rep_time,

replace=True))

for_inrange(sample_size)]

oul=np.quantile(rep_time_sample,target_csl)

ss=oul-np.mean(rep_time_sample)

returnoul,ss10.3需求预测经验分布估计:对‘SKU001’使用经验分布方法,使用重采样技术,构造提前期内需求样本,并计算样本分位数:

empirical_oul,empirical_ss=get_empirical_policy(sku_sales_qty,

rep_time_dict[sku],

0.9)

print('使用经验分布的方法计算得到的目标库存水平为:%.2f'

%empirical_oul)

print('使用经验分布的方法计算得到的安全库存量为:%.2f'

%empirical_ss)使用经验分布的方法计算得到的目标库存水平为:493.10

使用经验分布的方法计算得到的安全库存量为:288.8810.3需求预测基于核密度函数的非参数估计:定义函数get_kde_policy对销量数据进行拟合,使用留一交叉验证方法,选择合适的带宽,并计算相应的库存策略

#调用kde计算包

fromsklearn.neighborsimportKernelDensity

#调用交叉估计验证计算包

fromsklearn.model_selectionimportGridSearchCV,LeaveOneOutdefget_kde_policy(sales_qty,rep_time,target_csl,sample_size=1000):

"""

Args:

sales_qty:销量数据

rep_time:补货周期

target_csl:期望的周期服务水平

sample_size:样本量

Return:

best_bandwidth:最优带宽

oul:目标库存水平

ss:安全库存量

"""10.3需求预测代码续:

sales_qty=np.array(sales_qty).reshape(-1,1)

bandwidth_choices={'bandwidth':np.linspace(1,100,20)}

grid=GridSearchCV(KernelDensity(kernel='gaussian'),bandwidth_choices,

cv=LeaveOneOut())

grid.fit(sales_qty)

best_bandwidth=grid.best_estimator_.bandwidth

kde=grid.best_estimator_

#根据分布,构造补货周期内需求样本

rep_time_sample=[sum(kde.sample(rep_time))for_inrange(sample_size)]

oul=np.quantile(rep_time_sample,target_csl)

ss=oul-np.mean(rep_time_sample)

returnbest_bandwidth,oul,ssbest_bandwidth,kde_oul,kde_ss=get_kde_policy(sku_sales_qty,

rep_time_dict[sku],

0.9)

print('使用留一验证法得到的最优带宽为:%.2f'

%best_bandwidth)

print('使用核函数估计法计算得到的目标库存水平为:%.2f'

%kde_oul)

print('使用核函数估计法计算得到的安全库存量为:%.2f'

%kde_ss)使用留一验证法得到的最优带宽为:16.63,使用核函数估计法计算得到的目标库存水平为:479.97使用核函数估计法计算得到的安全库存量为:263.7810.3需求预测需求估计方法的应用:对所有产品应用上述三种方法,计算对应库存策略指标:normal_parasnormal_oulnormal_ss\

SKU001(26.15573770491803,61.416345943453486)439.248432229.770615

SKU002(93.47540983606558,224.0771315211208)741.841441489.715204

SKU003(6.459016393442623,1.40926408526803)83.9131246.390042

SKU004(6.385245901639344,1.250879830106973)62.2764064.578243

SKU005(33.15573770491803,73.1685703030577)582.850969286.346227

……lognormal_ssempirical_oulempirical_sskde_best_bandwidthkde_oul\

SKU00187.922101497.1287.12416.631579473.860751

SKU002182.165317790.4515.25868.736842827.300485

SKU0036.10781284.06.7151.085.415584

SKU0044.82723963.05.3491.063.263129

SKU005163.700998619.7323.32811.421053600.33853

kde_ss

SKU001262.680957

SKU002545.529678

SKU0037.930236

SKU0045.912068

SKU005303.8689710.3需求预测观察不同策略下不同产品的安全库存量和目标库存水平这要求我们对不同产品采取基于产品自身特点的差异化策略

基于模拟库存水平变化,仿真计算相应库存成本参数与非参数方法与指标高低没有绝对的关系不同产品的最适合方法不固定这点将在库存仿真流程中体现基于库存策略量模拟库存水平变化基于对需求的拟合,计算相应目标库存水平下的库存策略量10.4仿真流程输入产品未来一段时间内的需求样本,目标库存水平,盘货周期和提前期令第一期的库存水平为目标库存水平,在途库存为0对之后每一期:计算库存成本期初更新现货库存在途库存到货更新库存水平(若缺货,则缺货候补量表示为负)根据是否在盘货周期,判断是否补货至目标库存水平库存成本=总持货成本+总缺货成本10.4仿真流程对于’SKU003’,设定目标库存水平为80,进行仿真:给定策略下产品每日现货库存水平和需求随时间变化曲线sku=

'SKU003'

sku_sales_qty=test_df[test_df['sku_id']==sku]['sale'].values.tolist()

sku_onhand_list=inv_simulation(sku_sales_qty,80,cycle_time_dict[sku],

lead_time_dict[sku])

plt.plot(sku_sales_qty,marker='.',label='需求')

plt.plot(sku_onhand_list,marker='.',label='库存水平')

plt.xlabel('时间')

plt.ylabel('数量')

plt.legend()

plt.show()10.4仿真流程依据现货库存水平计算该产品的总库存成本:SKU003在目标库存水平为80.00的情况下,库存总成本为:1615.26defcal_inv_cost(onhand_list,hc,pc):

"""

Args:

onhand_list:历史现货库存水平

hc:单箱持货成本

pc:单箱缺货成本

Return:

total_cost:库存成本

"""

holding_cost=hc*sum([max(0,onhand)foronhandinonhand_list])

backorder_cost=pc*(-1)*sum([min(0,onhand)foronhandinonhand_list])

total_cost=holding_cost+backorder_cost

returntotal_costsku_inv_cost=cal_inv_cost(s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论