背景
电商企业在各区域的商品存储主要由多个仓库组成的仓群承担。其中存储的商品主要按照属性(品类、件型等)进行划分和打标,便于进行库存管理。图 1 是一个简化的示意图,商品品类各异,件数众多,必须将这些商品分散到各个仓库存储。品类分仓规划决定各商品存放在哪些仓库问题,合理的品类分仓规划对提升每个仓的管理效率、降低总体仓储成本至关重要。
准确的仓储货量预测是品类分仓规划的重要依据,对于准确的预测结果能够预见性地决定未来的仓储资源使用决策,以提前规划仓储资源,减少冗余场地的投入。一般来说,该场景需要预测两个目标,分别为库存量和销量。其中,库存量为该品类在全部仓库所需存放的总库存,分仓结果中受到仓库的仓容限制;销量为该品类在全部仓库所需打包出库的总量,分仓结果中受到产能限制。
目标和约束
在得到未来各品类的预测货量后,各个品类的分仓规划是供应链规划者的重要研究问题。若将品类集中存放在数量较少的仓库中,则将超过该仓的仓容及产能上限,造成履约问题;若同一品类分在多个仓库中,则会显著增加仓库数量,增大品类库存的管理难度及总成本。此场景需考虑的上限包括两个,分别为仓容上限和产能上限,其中仓容上限为某仓库可以存放的最高库存量,产能上限为某仓库一天可以出库的最高销量。另外,若将相似的品类(使用品类关联度衡量相似性)放在同一个仓库中,同一订单中的商品更可能集中出货,可以在实际履约中减少包裹数量,从而降低履约成本。
约束的详细说明
合理的品类分仓方案,应该同时考虑仓群的复杂度及单仓仓容及产能约束,给出最优的分仓结果需综合考虑以下指标:
- 仓容利用率:单仓总库存/仓容上限;
- 产能利用率:单仓总出库量/产能上限;
- 总仓租成本:使用仓库的仓租成本之和;
- 品类分仓数:单品类存放的仓库数量;
- 品类关联度:存放在同一仓库的所有品类之间的关联度之和。
需要明确考虑的指标,就一定要算这些
现有一个仓储网络,包含140个仓库以及350种品类,附件1及附件2分别为各品类的历史库存量及销量,附件3为不同仓库相关信息(仓租日成本、仓容上限、产能上限),附件4为不同品类之间的关联度(表中未出现的品类组合关联度设为0),附件5为不同品类的相关信息(品类编码、件型)。基于以上数据,请完成以下问题:
问题
问题 1
建立货量预测模型,对该仓储网络350个品类未来3个月(7-9月)每个月的库存量及销量进行预测,其中库存量根据历史每月数据预测月均库存量即可,填写表1的预测结果并放在正文中,并将完整结果填写在 result 表格文件中的"月库存预测结果"的表单中;销量需给出未来每天的预测结果,填写表2的预测结果并放在正文中,并将完整结果填写在 result 表格文件中的"日销量预测结果"的表单中。
表 1:月库存量预测结果
7 月库存量 | 8 月库存量 | 9 月库存量 | |
---|---|---|---|
category1 | |||
category31 | |||
category61 | |||
category91 | |||
category121 | |||
category151 | |||
category181 | |||
category211 | |||
category241 | |||
category271 | |||
category301 | |||
category331 |
表 2:日销量预测结果
7.1 | 7.11 | 7.21 | 7.31 | 8.1 | 8.11 | 8.21 | 8.31 | 9.1 | 9.11 | 9.21 | |
---|---|---|---|---|---|---|---|---|---|---|---|
category1 | |||||||||||
category31 | |||||||||||
category61 | |||||||||||
category91 | |||||||||||
category121 | |||||||||||
category151 | |||||||||||
category181 | |||||||||||
category211 | |||||||||||
category241 | |||||||||||
category271 | |||||||||||
category301 | |||||||||||
category331 |
问题 2
假设当前限定每个品类只能放在一个仓库中,即一品一仓,各品类之间请基于问题1的预测结果建立规划模型,综合考虑多个业务目标,求得品类的分仓方案,包括:应使用哪些仓库,使用的仓库需存放哪些品类的库存。填写表3的分仓结果并放在正文中,并将完整品类分仓结果填写在 result 表格中的"一品一仓分仓方案"表单中。
表 3:"一品一仓"分仓方案
warehouse | |
---|---|
category1 | |
category31 | |
category61 | |
category91 | |
category121 | |
category151 | |
category181 | |
category211 | |
category241 | |
category271 | |
category301 | |
category331 |
问题 3
现在为每个品类按照件型及高级品类进行打标(如附件5),并放开一品一仓假设,即允许一个品类存放于多个仓库,但同一品类存放的仓库数量不能超过3个,并希望同件型、同高级品类尽量放在一个仓库中。假设同一品类在不同仓库之间分布的库存量比例及出库量比例相同,当前业务的首要目标是最大品类关联度,同时兼顾其他指标。请基于问题1的预测结果建立规划模型,求得新的品类分仓方案,并分析不同方案中各业务指标的表现。填写表4的分仓结果并放在正文中,并将完整品类分仓结果填写在 result 表格中的"一品多仓分仓方案"表单中。
warehouse | warehouse | warehouse | |
---|---|---|---|
category1 | |||
category31 | |||
category61 | |||
category91 | |||
category121 | |||
category151 | |||
category181 | |||
category211 | |||
category241 | |||
category271 | |||
category301 | |||
category331 |
数据
附件1.csv如下:
品类 | 月份 | 库存量 |
---|---|---|
category225 | 2023/6/1 | 4676058 |
category84 | 2023/1/1 | 4421974 |
category21 | 2023/1/1 | 4411095 |
category84 | 2022/7/1 | 3689222 |
category84 | 2023/2/1 | 3431261 |
category225 | 2023/3/1 | 3133157 |
category225 | 2022/7/1 | 3095300 |
category225 | 2023/1/1 | 2966388 |
category84 | 2023/6/1 | 2913526 |
category225 | 2023/2/1 | 2890619 |
... | ... | ... |
category214 | 2022/9/1 | 14491 |
category300 | 2022/9/1 | 14484 |
category228 | 2023/2/1 | 14446 |
category127 | 2023/3/1 | 14432 |
category214 | 2023/6/1 | 14405 |
category214 | 2023/3/1 | 14339 |
category238 | 2022/9/1 | 14333 |
category127 | 2022/8/1 | 14331 |
category91 | 2022/9/1 | 14304 |
category271 | 2022/8/1 | 14279 |
... | ... | ... |
category210 | 2022/7/1 | 1 |
category210 | 2022/8/1 | 1 |
category210 | 2023/1/1 | 1 |
category326 | 2023/3/1 | 1 |
category326 | 2023/4/1 | 1 |
category326 | 2023/5/1 | 1 |
category329 | 2022/7/1 | 1 |
category336 | 2022/7/1 | 1 |
category336 | 2022/9/1 | 1 |
category336 | 2022/8/1 | 1 |
附件2.csv如下:
品类 | 日期 | 销量 |
---|---|---|
category84 | 2023/6/18 | 141914 |
category21 | 2022/8/31 | 130556 |
category84 | 2023/6/1 | 115928 |
category225 | 2023/6/1 | 110234 |
category21 | 2022/8/29 | 110020 |
category21 | 2022/9/30 | 104616 |
category254 | 2023/6/18 | 100254 |
category84 | 2023/6/19 | 98706 |
category21 | 2023/6/18 | 96650 |
category21 | 2023/6/16 | 94176 |
... | ... | ... |
category257 | 2022/7/14 | 164 |
category78 | 2022/9/17 | 164 |
category78 | 2023/5/24 | 164 |
category78 | 2023/4/7 | 164 |
category296 | 2022/7/30 | 164 |
category13 | 2022/7/22 | 164 |
category52 | 2023/6/1 | 164 |
category261 | 2023/4/19 | 164 |
category74 | 2023/4/25 | 164 |
category80 | 2023/6/23 | 164 |
... | ... | ... |
category210 | 2022/9/11 | 0 |
category210 | 2022/8/19 | 0 |
category210 | 2023/6/27 | 0 |
category210 | 2023/6/7 | 0 |
category210 | 2023/4/29 | 0 |
category210 | 2022/9/30 | 0 |
category210 | 2022/8/18 | 0 |
category210 | 2023/5/2 | 0 |
category210 | 2022/8/5 | 0 |
category210 | 2022/8/22 | 0 |
附件3.csv如下:
仓库 | 库存上限 | 产能上限 | 库存周转成本 |
---|---|---|---|
warehouse1 | 618887 | 20310 | 1826.33 |
warehouse2 | 1200847 | 41117 | 7073.34 |
warehouse3 | 781957 | 33857 | 6018.78 |
warehouse4 | 1112506 | 35571 | 11591.8 |
warehouse5 | 42989 | 61 | 172.46 |
warehouse6 | 1200 | 58 | 6.94946 |
warehouse7 | 162246 | 11196 | 660.839 |
warehouse8 | 225918 | 9674 | 1350.82 |
warehouse9 | 860000 | 20366 | 7866.29 |
warehouse10 | 1800000 | 19120 | 19424.5 |
... | ... | ... | |
warehouse66 | 555049 | 18889 | 909.825 |
warehouse67 | 2825685 | 9722 | 12177.7 |
warehouse68 | 1354130 | 21518 | 3821.84 |
warehouse69 | 1020000 | 35933 | 3766.58 |
warehouse70 | 7572 | 302 | 64.9634 |
warehouse71 | 245098 | 6809 | 1418.85 |
warehouse72 | 560000 | 10701 | 3942.35 |
warehouse73 | 499613 | 4045 | 5407.63 |
warehouse74 | 241274 | 2241 | 1530.96 |
warehouse75 | 436724 | 10686 | 4694.82 |
... | ... | ... | |
warehouse131 | 200475 | 13285 | 1416.02 |
warehouse132 | 950012 | 47356 | 151.808 |
warehouse133 | 2078326 | 80907 | 7303.47 |
warehouse134 | 13300000 | 27501 | 64136.7 |
warehouse135 | 271627 | 14900 | 578.705 |
warehouse136 | 302874 | 28175 | 2125.37 |
warehouse137 | 277876 | 17593 | 2967.97 |
warehouse138 | 8708 | 26 | 59.061 |
warehouse139 | 13500000 | 92020 | 43302 |
warehouse140 | 4482310 | 39201 | 43424.8 |
附件4.csv如下:
品类1 | 品类2 | 关联度 |
---|---|---|
category157 | category195 | 103 |
category157 | category226 | 7448 |
category157 | category60 | 45 |
category157 | category279 | 119 |
category195 | category226 | 3139 |
category195 | category86 | 370 |
category195 | category307 | 515 |
category195 | category60 | 3012 |
category195 | category191 | 2813 |
category195 | category173 | 78 |
... | ... | ... |
category254 | category34 | 609 |
category254 | category325 | 1235 |
category254 | category160 | 249 |
category254 | category201 | 17 |
category254 | category227 | 62 |
category254 | category301 | 12 |
category254 | category155 | 30 |
category254 | category236 | 175 |
category254 | category273 | 711 |
category254 | category56 | 208 |
... | ... | ... |
category71 | category153 | 13 |
category229 | category59 | 145 |
category229 | category343 | 23 |
category202 | category291 | 11 |
category202 | category139 | 49 |
category291 | category139 | 12 |
category139 | category255 | 47 |
category139 | category234 | 17 |
category139 | category204 | 14 |
category204 | category273 | 273 |
附件5.csv如下:
品类 | 高级品类 | 级别 |
---|---|---|
category165 | high_category1 | B |
category204 | high_category2 | A |
category134 | high_category3 | A |
category110 | high_category4 | A |
category199 | high_category5 | B |
category26 | high_category6 | C |
category304 | high_category7 | A |
category287 | high_category6 | B |
category227 | high_category8 | C |
category57 | high_category5 | B |
... | ... | ... |
category226 | high_category24 | B |
category68 | high_category5 | B |
category27 | high_category3 | B |
category322 | high_category3 | B |
category205 | high_category3 | C |
category145 | high_category2 | C |
category138 | high_category3 | C |
category197 | high_category21 | C |
category190 | high_category28 | C |
category253 | high_category1 | B |
... | ... | ... |
category333 | high_category24 | A |
category332 | high_category3 | A |
category338 | high_category5 | C |
category336 | high_category31 | A |
category345 | high_category31 | C |
category347 | high_category23 | A |
category346 | high_category43 | A |
category348 | high_category3 | A |
category349 | high_category44 | A |
category350 | high_category45 | A |
思路
问题 1:货量预测模型建立
1.1 库存量预测
目标:预测未来3个月(7-9月)每个品类的月均库存量。
步骤概述:
-
数据加载与预处理:
- 读取数据 :
- 加载
附件1.csv
,获取350个品类的历史月库存量数据。 - 加载
附件5.csv
,获取每个品类的高级品类和级别信息。
- 加载
- 日期处理 :
- 将"月份"列转换为日期格式(如
datetime
类型)。 - 将"月份"设为时间序列索引。
- 将"月份"列转换为日期格式(如
- 缺失值处理 :
- 检查并填补缺失月份的数据,常用方法包括前向填充(
ffill
)或插值。
- 检查并填补缺失月份的数据,常用方法包括前向填充(
- 数据合并 :
- 将
附件5.csv
中的高级品类和级别信息与库存数据合并,形成完整的数据集。
- 将
- 读取数据 :
-
特征工程:
- 时间特征 :
- 提取月份、季度等时间相关特征,以捕捉季节性和趋势性。
- 品类特征 :
- 对高级品类和级别进行独热编码(One-Hot Encoding),将类别信息转化为数值特征。
- 滞后特征 :
- 创建滞后库存量特征,如前1月、前2月、前3月的库存量,以捕捉时间依赖性。
- 移动平均 :
- 计算库存量的移动平均(如3个月移动平均),以平滑数据波动。
- 其他特征 :
- 根据需要,考虑添加其他相关特征,如促销活动、节假日影响等,以提高模型的预测能力。
- 时间特征 :
-
模型训练与预测:
- 模型选择 :
- 时间序列模型:SARIMA、SARIMAX,适用于具有季节性和趋势性的品类。
- 机器学习模型:随机森林、梯度提升树(如XGBoost、LightGBM),适用于多特征的预测。
- 深度学习模型:LSTM(长短期记忆网络),适用于捕捉复杂的时间依赖关系。
- 模型训练 :
- 针对每个品类,使用历史库存数据训练不同的模型。
- 采用交叉验证(如时间序列交叉验证)评估模型性能,选择表现最优的模型。
- 模型评估 :
- 使用评估指标如MAE(平均绝对误差)、RMSE(均方根误差)等,确保预测的准确性。
- 预测 :
- 使用训练好的模型预测7月、8月和9月的库存量。
- 对每个品类选择最佳模型的预测结果作为最终预测值。
- 结果保存 :
- 将预测结果汇总并保存到
result.xlsx
的"月库存预测结果"表单中,确保数据格式与表1一致。
- 将预测结果汇总并保存到
- 模型选择 :
调整与优化建议:
- 模型多样性:不同品类可能具有不同的库存模式,建议对每个品类尝试多种模型,并选择表现最优的模型进行预测。
- 并行处理:由于品类数量较多(350个),建议使用并行计算方法(如多线程或多进程)以提高计算效率。
- 特征丰富性:根据实际情况,添加更多相关特征(如促销活动、市场趋势等),以提升模型的预测能力。
1.2 销量预测
目标:预测未来3个月(7-9月)每天的销量。
步骤概述:
-
数据加载与预处理:
- 读取数据 :
- 加载
附件2.csv
,获取350个品类的历史日销量数据。 - 加载
附件5.csv
,获取每个品类的高级品类和级别信息。
- 加载
- 日期处理 :
- 将"日期"列转换为日期格式(如
datetime
类型)。 - 将"日期"设为时间序列索引。
- 将"日期"列转换为日期格式(如
- 缺失值处理 :
- 检查并填补缺失日期的数据,常用方法包括填零或前向填充。
- 数据合并 :
- 将
附件5.csv
中的高级品类和级别信息与销量数据合并,形成完整的数据集。
- 将
- 读取数据 :
-
特征工程:
- 时间特征 :
- 提取星期几、是否周末、是否节假日等时间相关特征,以捕捉日销量的周期性和异常性。
- 品类特征 :
- 对高级品类和级别进行独热编码(One-Hot Encoding)。
- 滞后特征 :
- 创建滞后销量特征,如前1天、前7天的销量,以捕捉短期和长期依赖性。
- 移动平均 :
- 计算销量的移动平均(如7天移动平均),以平滑数据波动。
- 其他特征 :
- 根据需要,考虑添加其他相关特征,如促销活动、天气数据等,以提高模型的预测能力。
- 时间特征 :
-
模型训练与预测:
- 模型选择 :
- 时间序列模型:Prophet,适用于具有明显趋势和季节性的时间序列数据。
- 机器学习模型:XGBoost、LightGBM,适用于多特征的日销量预测。
- 深度学习模型:LSTM,适用于捕捉复杂的时间依赖关系。
- 模型训练 :
- 针对每个品类,使用历史日销量数据训练不同的模型。
- 采用交叉验证(如时间序列交叉验证)评估模型性能,选择表现最优的模型。
- 模型评估 :
- 使用评估指标如MAE、RMSE等,确保预测的准确性。
- 预测 :
- 使用训练好的模型预测未来90天(7-9月)的每日销量。
- 对每个品类选择最佳模型的预测结果作为最终预测值。
- 结果保存 :
- 将预测结果汇总并保存到
result.xlsx
的"日销量预测结果"表单中,确保数据格式与表2一致。
- 将预测结果汇总并保存到
- 模型选择 :
调整与优化建议:
- 模型多样性:不同品类可能具有不同的销量模式,建议对每个品类尝试多种模型,并选择表现最优的模型进行预测。
- 节假日处理:确保在模型中正确处理节假日对销量的影响,Prophet提供了内置的节假日处理功能,可以利用。
- 数据分布:对销量数据进行分析,确定是否需要对数据进行平滑处理或转换(如对数转换)以提高模型效果。
- 并行处理:由于品类数量较多,建议使用并行计算方法以提高计算效率。
问题 2:一品一仓分仓方案
目标:每个品类只能放在一个仓库中,综合考虑仓容、产能、仓租成本及品类关联度,求得最优分仓方案。
步骤概述:
-
数据加载与预处理:
- 读取预测结果 :
- 从
result.xlsx
的"月库存预测结果"表单中读取每个品类的7-9月库存量预测。 - 从
result.xlsx
的"日销量预测结果"表单中读取每个品类的7-9月日销量预测,并计算总销量(如7-9月每日销量之和)。
- 从
- 读取仓库信息 :
- 加载
附件3.csv
,提取每个仓库的仓容上限、产能上限和仓租日成本。 - 计算每个仓库在3个月内的总仓租成本(仓租日成本 × 90天)。
- 加载
- 读取关联度数据 :
- 加载
附件4.csv
,构建品类之间的关联度矩阵。未出现的品类组合关联度设为0。
- 加载
- 读取预测结果 :
-
计算总库存量和总销量:
- 对于每个品类,计算7-9月的总库存量(3个月库存量之和)。
- 对于每个品类,计算7-9月的总销量(90天日销量之和)。
-
构建优化模型:
- 决策变量 :
- x i , j x_{i,j} xi,j:二元变量,表示品类 i i i是否分配到仓库 j j j(1为是,0为否)。
- z j z_j zj:二元变量,表示仓库 j j j 是否被使用(1为是,0为否)。
- 目标函数 :
- 主要目标:最大化总品类关联度。
- 次要目标:最小化总仓租成本。
- 综合目标 :采用加权和的方法,将两者结合起来,如:
Maximize ∑ j ( ∑ i ∑ k 关联度 ( i , k ) ⋅ x i , j ⋅ x k , j ) − λ ⋅ ∑ j 仓租成本 j ⋅ z j \text{Maximize } \sum_{j} \left( \sum_{i} \sum_{k} \text{关联度}(i,k) \cdot x_{i,j} \cdot x_{k,j} \right) - \lambda \cdot \sum_{j} \text{仓租成本}_j \cdot z_j Maximize j∑(i∑k∑关联度(i,k)⋅xi,j⋅xk,j)−λ⋅j∑仓租成本j⋅zj
其中,( \lambda ) 是权重系数,用于平衡关联度和仓租成本。
- 约束条件 :
- 一品一仓 :
∀ i , ∑ j x i , j = 1 \forall i, \sum_{j} x_{i,j} = 1 ∀i,j∑xi,j=1 - 仓容约束 :
∀ j , ∑ i 总库存量 i ⋅ x i , j ≤ 仓容上限 j \forall j, \sum_{i} \text{总库存量}i \cdot x{i,j} \leq \text{仓容上限}_j ∀j,i∑总库存量i⋅xi,j≤仓容上限j - 产能约束 :
∀ j , ∑ i 总销量 i ⋅ x i , j ≤ 产能上限 j \forall j, \sum_{i} \text{总销量}i \cdot x{i,j} \leq \text{产能上限}_j ∀j,i∑总销量i⋅xi,j≤产能上限j - 仓库使用定义 :
∀ j , ∑ i x i , j ≤ M ⋅ z j \forall j, \sum_{i} x_{i,j} \leq M \cdot z_j ∀j,i∑xi,j≤M⋅zj
其中, M M M是一个足够大的常数,确保只要有任何品类分配到仓库 j j j,$z_j $ 就为1。 - 关联度计算 :
- 由于直接在目标函数中计算 x i , j × x k , j x_{i,j} \times x_{k,j} xi,j×xk,j 会导致非线性,建议采用线性化方法或近似策略:
- 预计算关联度:将每对品类的关联度分配到同一仓库的贡献预先计算为一个常数,利用线性化方法表示。
- 使用辅助变量:引入辅助变量表示某对品类是否共同分配到同一仓库,并将其与关联度结合。
- 简化目标:考虑仅最大化每个仓库内品类的总关联度,而非逐对品类计算。
- 由于直接在目标函数中计算 x i , j × x k , j x_{i,j} \times x_{k,j} xi,j×xk,j 会导致非线性,建议采用线性化方法或近似策略:
- 一品一仓 :
- 决策变量 :
-
求解优化模型:
- 优化工具 :
- 推荐使用高级优化求解器如Gurobi、CPLEX,因为模型规模较大(350品类 × 140仓库 = 49,000个决策变量)且涉及混合整数规划(MIP)。
- 如果使用
PuLP
,建议结合其与Gurobi或CPLEX接口,以提升求解效率。
- 模型优化 :
- 变量剪枝:提前排除不可能的仓库分配,如某些仓库的仓容或产能不足以容纳某品类的库存量或销量。
- 分步优化:优先分配高库存量和高销量的品类,减少模型复杂度。
- 迭代优化:根据初步结果调整模型参数和约束条件,以进一步优化分仓方案。
- 优化工具 :
-
保存结果:
- 将分仓结果(每个品类对应的仓库)保存到
result.xlsx
的"一品一仓分仓方案"表单中,确保数据格式与表3一致。
- 将分仓结果(每个品类对应的仓库)保存到
调整与优化建议:
-
目标函数线性化:由于目标函数中涉及 ( x_{i,j} \times x_{k,j} ) 的非线性项,建议采用以下方法保持模型的线性性:
- 预计算关联度贡献 :对每对品类 ( i , k ) (i,k) (i,k),计算其在同一仓库中的关联度贡献,将其转化为线性表达。
- 辅助变量引入 :引入新的变量 y i , k , j y_{i,k,j} yi,k,j 表示品类 i i i和 k k k 是否同时分配到仓库 j j j,并添加约束 y i , k , j ≤ x i , j y_{i,k,j} \leq x_{i,j} yi,k,j≤xi,j和 y i , k , j ≤ x k , j y_{i,k,j} \leq x_{k,j} yi,k,j≤xk,j,以及 y i , k , j ≥ x i , j + x k , j − 1 y_{i,k,j} \geq x_{i,j} + x_{k,j} - 1 yi,k,j≥xi,j+xk,j−1。
- 简化目标:如关联度计算复杂度过高,可考虑仅最大化每个仓库内品类的总关联度,而非逐对品类计算。
-
仓库使用变量 :通过引入辅助变量 z j z_j zj,确保只计算被使用仓库的仓租成本。
-
模型规模优化:通过预筛选仓库(例如,基于地理位置、服务区域等)来减少决策变量数量,提高求解效率。
问题 3:一品多仓分仓方案
目标:允许每个品类分配到最多3个仓库,同时尽量将同件型和同高级品类的品类集中在同一仓库中,最大化品类关联度,兼顾仓容、产能和其他指标。
步骤概述:
-
数据加载与预处理:
- 读取预测结果 :
- 从
result.xlsx
的"月库存预测结果"表单中读取每个品类的7-9月库存量预测。 - 从
result.xlsx
的"日销量预测结果"表单中读取每个品类的7-9月日销量预测,并计算总销量(如7-9月每日销量之和)。
- 从
- 读取仓库信息 :
- 加载
附件3.csv
,提取每个仓库的仓容上限、产能上限和仓租日成本。 - 计算每个仓库在3个月内的总仓租成本(仓租日成本 × 90天)。
- 加载
- 读取关联度数据 :
- 加载
附件4.csv
,构建品类之间的关联度矩阵。未出现的品类组合关联度设为0。
- 加载
- 读取品类高级信息 :
- 加载
附件5.csv
,获取每个品类的高级品类和级别信息,用于特征工程和聚类分析。
- 加载
- 读取预测结果 :
-
计算总库存量和总销量:
- 对于每个品类,计算7-9月的总库存量(3个月库存量之和)。
- 对于每个品类,计算7-9月的总销量(90天日销量之和)。
-
构建优化模型:
- 决策变量 :
- x i , j x_{i,j} xi,j:二元变量,表示品类 ( i ) 是否分配到仓库 ( j )(1为是,0为否)。
- y i , j y_{i,j} yi,j:连续变量,表示品类 ( i ) 在仓库 ( j ) 的库存量比例(0到1)。
- z j z_j zj:二元变量,表示仓库 ( j ) 是否被使用(1为是,0为否)。
- 目标函数 :
- 主要目标:最大化总品类关联度。
- 次要目标:最小化总仓租成本和总库存周转成本。
- 综合目标 :采用加权和的方法,将多目标结合起来,如:
Maximize ∑ j ( ∑ i ∑ k 关联度 ( i , k ) ⋅ x i , j ⋅ x k , j ) − λ 1 ⋅ ∑ j 仓租成本 j ⋅ z j − λ 2 ⋅ ∑ j 库存周转成本 j ⋅ ∑ i y i , j \text{Maximize } \sum_{j} \left( \sum_{i} \sum_{k} \text{关联度}(i,k) \cdot x_{i,j} \cdot x_{k,j} \right) - \lambda_1 \cdot \sum_{j} \text{仓租成本}j \cdot z_j - \lambda_2 \cdot \sum{j} \text{库存周转成本}j \cdot \sum{i} y_{i,j} Maximize j∑(i∑k∑关联度(i,k)⋅xi,j⋅xk,j)−λ1⋅j∑仓租成本j⋅zj−λ2⋅j∑库存周转成本j⋅i∑yi,j
其中, λ 1 \lambda_1 λ1 和 λ 2 \lambda_2 λ2是权重系数,用于平衡不同目标。
- 约束条件 :
- 分仓数量 :
∀ i , ∑ j x i , j ≤ 3 \forall i, \sum_{j} x_{i,j} \leq 3 ∀i,j∑xi,j≤3 - 仓容约束 :
∀ j , ∑ i ( 总库存量 i ⋅ y i , j ) ≤ 仓容上限 j \forall j, \sum_{i} (\text{总库存量}i \cdot y{i,j}) \leq \text{仓容上限}_j ∀j,i∑(总库存量i⋅yi,j)≤仓容上限j - 产能约束 :
∀ j , ∑ i ( 总销量 i ⋅ y i , j ) ≤ 产能上限 j \forall j, \sum_{i} (\text{总销量}i \cdot y{i,j}) \leq \text{产能上限}_j ∀j,i∑(总销量i⋅yi,j)≤产能上限j - 库存比例约束 :
∀ i , j , y i , j ≤ x i , j ⋅ 总库存量 i \forall i,j, y_{i,j} \leq x_{i,j} \cdot \text{总库存量}_i ∀i,j,yi,j≤xi,j⋅总库存量i - 仓库使用定义 :
∀ j , ∑ i x i , j ≥ z j \forall j, \sum_{i} x_{i,j} \geq z_j ∀j,i∑xi,j≥zj - 品类聚集约束 :
- 同件型和同高级品类聚集 :通过引入额外的约束或目标项,鼓励将同件型和同高级品类的品类分配到同一仓库。例如:
- 奖励项:在目标函数中增加同组品类共同分配到同一仓库的奖励项。
- 限制项:限制同组品类分配到不同仓库的数量。
- 同件型和同高级品类聚集 :通过引入额外的约束或目标项,鼓励将同件型和同高级品类的品类分配到同一仓库。例如:
- 分仓数量 :
- 决策变量 :
-
求解优化模型:
- 优化工具 :
- 推荐使用高级优化求解器如Gurobi、CPLEX,因为模型规模较大且涉及混合整数规划(MIP)。
- 可以结合使用
PuLP
与高级求解器接口,以提升求解效率。
- 模型优化 :
- 变量剪枝:提前排除不可能的仓库分配,如某些仓库的仓容或产能不足以容纳某品类的库存量或销量。
- 分步优化:优先分配高库存量和高销量的品类,减少模型复杂度。
- 聚类分析:在优化模型前,对品类进行聚类分析,根据高级品类和件型进行分组,然后在优化模型中优先将同一组内的品类分配到同一仓库。
- 目标函数奖励:在目标函数中增加同组品类共同分配到同一仓库的奖励项,以鼓励聚集。
- 库存比例约束:确保分配到多个仓库的库存比例合理,避免某些仓库库存过多或过少。可以引入额外的约束条件,如限制每个仓库分配给某品类的库存比例范围(例如,至少10%,至多70%)。
- 优化工具 :
-
保存结果:
- 将分仓结果(每个品类对应的一个或多个仓库及其库存量比例)保存到
result.xlsx
的"一品多仓分仓方案"表单中,确保数据格式与表4一致。
- 将分仓结果(每个品类对应的一个或多个仓库及其库存量比例)保存到
调整与优化建议:
-
目标函数线性化 :由于目标函数中涉及 x i , j × x k , j x_{i,j} \times x_{k,j} xi,j×xk,j 的非线性项,建议采用以下方法保持模型的线性性:
- 预计算关联度贡献 :对每对品类 ( i , k ) (i,k) (i,k),计算其在同一仓库中的关联度贡献,将其转化为线性表达。
- 辅助变量引入 :引入新的变量 y i , k , j y_{i,k,j} yi,k,j 表示品类 i i i和 k k k 是否同时分配到仓库 j j j,并添加约束 y i , k , j y_{i,k,j} yi,k,j l e q x i , j leq x_{i,j} leqxi,j、 y i , k , j ≤ x k , j y_{i,k,j} \leq x_{k,j} yi,k,j≤xk,j、 y i , k , j ≥ x i , j + x k , j − 1 y_{i,k,j} \geq x_{i,j} + x_{k,j} - 1 yi,k,j≥xi,j+xk,j−1。
- 简化目标:如关联度计算复杂度过高,可考虑仅最大化每个仓库内品类的总关联度,而非逐对品类计算。
-
品类聚集实现:
- 聚类分析:对品类进行聚类分析,根据高级品类和件型进行分组,确保同一组内的品类优先分配到同一仓库。
- 目标函数奖励:在目标函数中增加同组品类共同分配到同一仓库的奖励项,以鼓励聚集。
-
库存比例约束:确保分配到多个仓库的库存比例合理,避免某些仓库库存过多或过少。可以引入额外的约束条件,如限制每个仓库分配给某品类的库存比例范围(例如,至少10%,至多70%)。
-
模型规模优化:通过预筛选仓库(例如,基于地理位置、服务区域等)来减少决策变量数量,提高求解效率。
业务指标分析
在完成分仓方案后,需要对不同方案的业务指标进行评估,以确保满足业务需求。以下是关键指标及其评估方法:
1. 仓容利用率
仓容利用率 = 单仓总库存量 仓容上限 \text{仓容利用率} = \frac{\text{单仓总库存量}}{\text{仓容上限}} 仓容利用率=仓容上限单仓总库存量
评估方法:
- 对每个仓库,计算其分配到的所有品类的总库存量。
- 将总库存量除以该仓库的仓容上限,得到仓容利用率。
- 汇总所有仓库的仓容利用率,计算平均值或其他统计指标。
- 目标:保持仓容利用率在合理范围内(如70%-90%),避免仓库过度或不足利用。
2. 产能利用率
产能利用率 = 单仓总出库量 产能上限 \text{产能利用率} = \frac{\text{单仓总出库量}}{\text{产能上限}} 产能利用率=产能上限单仓总出库量
评估方法:
- 对每个仓库,计算其分配到的所有品类的总销量。
- 将总销量除以该仓库的产能上限,得到产能利用率。
- 汇总所有仓库的产能利用率,计算平均值或其他统计指标。
- 目标:保持产能利用率在合理范围内,确保仓库的出库能力得到充分利用,避免产能过剩或不足。
3. 总仓租成本
总仓租成本 = ∑ j 仓租成本 j ⋅ z j \text{总仓租成本} = \sum_{j} \text{仓租成本}_j \cdot z_j 总仓租成本=j∑仓租成本j⋅zj
评估方法:
- 汇总所有被使用仓库的仓租成本,即所有被分配至少一个品类的仓库的仓租成本之和。
- 目标:最小化总仓租成本,同时满足库存和销量需求。
4. 品类分仓数
评估方法:
- 一品一仓方案 :
- 确保每个品类仅分配到一个仓库。
- 一品多仓方案 :
- 确保每个品类最多分配到三个仓库。
- 统计每个品类被分配到的仓库数量,验证是否符合约束。
- 目标:确保分仓数满足"一品一仓"或"一品多仓"的约束,避免超出分配限制。
5. 品类关联度
品类关联度总和 = ∑ j ∑ i ∑ k 关联度 ( i , k ) ⋅ x i , j ⋅ x k , j \text{品类关联度总和} = \sum_{j} \sum_{i} \sum_{k} \text{关联度}(i,k) \cdot x_{i,j} \cdot x_{k,j} 品类关联度总和=j∑i∑k∑关联度(i,k)⋅xi,j⋅xk,j
评估方法:
- 基于
附件4.csv
,计算同一仓库内所有品类对的关联度之和。 - 汇总所有仓库的品类关联度,得到总品类关联度。
- 目标:最大化总品类关联度,以提高履约效率和降低成本。
6. 库存周转成本
评估方法:
- 对每个仓库,计算其分配到的品类的库存量与仓库的库存周转成本的乘积。
- 汇总所有仓库的库存周转成本,得到总库存周转成本。
- 目标:控制库存周转成本,确保分仓方案在成本控制方面表现良好。
7. 仓库使用率
评估方法:
- 评估各仓库的使用情况,计算被使用仓库的比例。
- 确保仓库使用均衡,避免部分仓库过度使用而其他仓库闲置。
- 目标:均衡仓库使用,优化资源分配。
业务指标分析方法
1. 指标计算
仓容利用率:
- 对每个仓库,计算其总库存量(分配到该仓库的所有品类的库存量之和)。
- 将总库存量除以该仓库的仓容上限,得到仓容利用率。
产能利用率:
- 对每个仓库,计算其总销量(分配到该仓库的所有品类的销量之和)。
- 将总销量除以该仓库的产能上限,得到产能利用率。
总仓租成本:
- 汇总所有被使用仓库的总仓租成本,即所有被分配至少一个品类的仓库的仓租成本之和。
品类关联度总和:
- 基于
附件4.csv
,计算同一仓库内所有品类对的关联度之和。 - 汇总所有仓库的品类关联度,得到总品类关联度。
库存周转成本:
- 对每个仓库,计算其分配到的品类的库存量与仓库的库存周转成本的乘积。
- 汇总所有仓库的库存周转成本,得到总库存周转成本。
仓库使用率:
- 评估各仓库的使用情况,计算被使用仓库的比例。
- 确保仓库使用均衡,避免部分仓库过度使用而其他仓库闲置。
2. 可视化
利用数据可视化工具(如Matplotlib、Seaborn、Tableau)进行数据可视化,展示各仓库的利用率、成本分布和关联度分布等,便于直观分析。
示例可视化:
- 仓容利用率分布:展示各仓库的仓容利用率分布情况。
- 产能利用率分布:展示各仓库的产能利用率分布情况。
- 总仓租成本柱状图:展示各仓库的总仓租成本。
- 品类关联度热力图:展示不同仓库内品类关联度的热力分布。
3. 优化调整
根据指标评估结果,调整优化模型的权重和约束条件,反复迭代优化分仓方案,直至满足业务需求。例如:
- 仓容利用率过低:调整模型中的权重系数,增加对仓库使用的激励,或通过调整品类分配策略来优化。
- 产能利用率不均衡:重新调整产能约束,确保各仓库的产能得到合理利用。
- 总仓租成本过高:优化模型中的成本权重,寻找更具成本效益的分仓方案。
- 品类关联度不足:增强目标函数中对关联度的权重,或通过增加品类聚集的奖励项,提高关联度优化效果。
拓展建议
-
问题1:
- 模型多样性:不仅限于SARIMA和Prophet,建议尝试多种模型(如随机森林、XGBoost、LightGBM、LSTM)并选择最佳模型。
- 并行处理:利用多线程或多进程提高预测效率,尤其在处理350个品类时。
- 特征丰富性:根据实际情况,添加更多相关特征(如促销活动、市场趋势等),以提升模型准确性。
- 模型评估与选择:采用多个评估指标(如MAE、RMSE)进行模型评估,选择表现最优的模型。
-
问题2:
- 关联度计算优化:采用线性化方法或辅助变量来处理目标函数中的非线性关联度计算,确保模型的线性性和可求解性。
- 仓库使用变量:通过辅助变量 ( z_j ) 正确反映仓库是否被使用,并在目标函数中合理引入仓租成本。
- 模型规模优化:通过预筛选仓库(如基于地理位置、服务区域等)来减少决策变量数量,提高求解效率。
- 使用高效求解器:推荐使用高级求解器(如Gurobi、CPLEX),以处理大规模优化问题。
-
问题3:
- 品类聚集实现:通过引入聚类分析或在优化模型中增加聚集约束,确保同件型和同高级品类的品类尽量集中分配。
- 库存比例约束:引入库存比例约束,确保每个品类在多个仓库之间的库存分配合理,避免某些仓库库存过多或过少。
- 目标函数细化:进一步细化目标函数,明确各项指标的权重和优先级,确保模型能够平衡多种业务目标。
- 变量剪枝与模型优化:提前排除不可能的仓库分配,使用高效的优化求解器(如Gurobi、CPLEX),并优化模型结构以减少计算时间。
-
业务指标分析:
- 全面评估:确保全面计算和分析所有关键业务指标,如仓容利用率、产能利用率、总仓租成本、品类关联度等。
- 可视化呈现:通过数据可视化工具,直观展示分仓方案的各项指标,便于决策和优化。
- 迭代优化:根据指标评估结果,调整优化模型的权重和约束条件,反复迭代优化分仓方案,直至满足业务需求。
-
技术实现:
- 优化求解器选择 :对于大规模优化问题,建议使用高效的求解器(如Gurobi、CPLEX),而不仅依赖于
PuLP
的默认CBC求解器。 - 代码优化与调试:确保代码高效、可读,并通过小规模测试验证模型和代码的正确性。
- 自动化流程:建议将预测和分仓过程自动化,定期更新预测数据和分仓方案,适应市场变化。
- 优化求解器选择 :对于大规模优化问题,建议使用高效的求解器(如Gurobi、CPLEX),而不仅依赖于
本篇文章完整思路和整理由GPT提供,仅供参考。使用地址::https://vlink.cc/mosha