ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

供应链优化实战:基于机器学习的动态定价与库存补货决策模型

供应链优化实战:基于机器学习的动态定价与库存补货决策模型 1. 赛题核心与破题方向从“蔬菜类商品”到“供应链优化”的思维跃迁拿到2023年国赛C题“蔬菜类商品的自动定价与补货决策”时很多队伍的第一反应是去找价格预测模型或者库存管理公式。这没错但容易陷入局部最优。这道题的精妙之处在于它表面上问的是“定价”和“补货”本质上考的是在不确定需求下如何构建一个动态、协同的供应链决策系统。它要求你不仅会算更要会“想”把零散的销售数据、损耗数据、品类关系整合成一个能指导未来行动的智能决策框架。题目给了我们几个核心约束和场景一家生鲜商超每天要决定各种蔬菜的售价和补货量。目标是让商超的整体收益最大化。这里面的难点层层递进首先蔬菜易腐当天卖不完就损耗直接成本吞噬利润其次不同品类蔬菜之间可能存在替代或互补关系一个菜涨价了顾客可能转头去买另一个最后销售数据里充满了“噪声”——周末效应、节假日、促销活动、甚至天气都会让需求曲线上下跳动。官方附件提供了过去三年多的销售流水、损耗记录和商品分类信息这就是我们全部的“矿藏”。所以我们的思路绝不能停留在简单的回归预测上。一个高分的模型必然是一个**“感知-预测-决策-评估”的闭环系统**。你需要用统计和机器学习方法从历史数据中“感知”规律如需求弹性、损耗率、品类关联基于这些规律“预测”未来一天各单品在给定价格下的销量和损耗然后建立一个优化模型来“决策”最优的价格和补货量组合最后还要设计一套方法来“评估”这个决策模型在未知数据上的表现是否稳健。这四步环环相扣缺一不可。接下来我就结合我们团队的实战经验拆解每一步的具体做法、可选模型、以及那些容易掉进去的“坑”。2. 数据感知与特征工程从原始流水到模型“燃料”附件中的数据是典型的零售业数据看似规整实则暗藏玄机。直接丢给模型效果肯定不好必须经过精心清洗和特征构建。2.1 数据清洗与整合解决“脏数据”问题销售流水表是核心但里面有很多陷阱。首先就是缺失值与异常值。某些天某些单品完全没有销售记录这可能是缺货也可能是当天未上架。我们的处理原则是对于连续多天无记录的单品在对应日期填充为0销量和0损耗对于偶尔一天无记录但前后都有销售的可以考虑用前后天的均值或插值法填充但要谨慎最好结合损耗记录表判断——如果当天有损耗记录却无销售那很可能是数据录入遗漏销量应为0。其次是数据一致性。销售表中的“销量”是实际售出而“损耗量”在另一个表里。必须通过“单品编码”和“日期”将两个表精确关联得到每个单品每日的“进货量”销量损耗量。这里有个关键校验计算出的“进货量”是否总是整数理论上是的因为蔬菜按份卖。如果出现小数可能是数据合并或单位问题需要排查。2.2 核心特征构建提炼影响决策的关键信息清洗后的数据是“原料”特征工程则是“烹饪”决定模型的最终味道。我们构建了以下几类特征时序特征这是基础中的基础。包括年、月、日、星期几、是否为周末、是否为月初/月末、是否为节假日需外部日历数据。特别注意国庆、春节等长假前后需求模式会剧变最好能标识出来。历史统计特征基于滚动窗口计算这是体现“惯性”和“趋势”的关键。需求水平过去7天、14天、30天的平均销量。需求波动过去7天、14天销量的标准差、变异系数标准差/均值用来衡量需求的不确定性。价格弹性初探可以计算过去一段时间内销量与价格之间的相关系数虽然简单但能提供初步信号。品类与关联特征这是本题拉开差距的地方。品类聚合特征同一个二级类如“叶菜类”下的所有单品其总销量、平均价格可以作为该品类整体行情的代理变量。替代/互补品特征这是难点。我们采用了两步法首先计算各单品间销量序列的相关系数找出高度正相关可能受共同因素驱动或高度负相关可能存在替代关系的品对。然后将关联性最强的3个单品的价格和销量作为特征引入目标单品的模型中。例如菠菜的价格可能会受到小白菜替代品价格和销量的显著影响。损耗相关特征损耗率损耗量/进货量是核心成本。可以计算单品的历史平均损耗率、损耗率的波动性。一个高损耗率且波动大的单品在定价和补货时必须更加保守。滞后特征将前1天、前7天同期比如都是周二的价格、销量、损耗率作为特征因为市场需求往往具有短期记忆和周期性。注意特征不是越多越好。高度相关的特征会导致模型过拟合或不稳定。一定要进行特征重要性分析如基于树模型或相关性分析剔除冗余特征。我们当时用XGBoost初步跑了一个重要性排序发现“前7天平均销量”、“星期几”、“历史损耗率”和“替代品价格”是最重要的几个特征。3. 需求与损耗预测模型不确定性下的“水晶球”有了高质量特征下一步就是预测如果我明天给某个单品定价为P预计能卖出多少需求D又会有多少损耗L这里有两个核心模型。3.1 需求预测模型价格与销量的博弈需求预测模型需要刻画价格-销量关系。简单线性回归销量 a * 价格 b太理想化不符合经济学常识价格越高需求通常越低且关系可能非线性。我们推荐以下几种方法经典需求函数拟合直接采用经济学中的需求函数形式进行拟合。线性需求函数D(p) a - b * p(a, b 0)。虽然简单但在局部价格区间内可能有效。指数需求函数D(p) a * exp(-b * p)。能刻画需求随价格上升而加速下降的现象。幂函数需求函数D(p) a * p^(-b)(即常价格弹性函数弹性为-b)。这是非常常用且具有良好经济学解释的模型价格弹性恒定。 拟合时将价格p作为自变量销量D作为因变量利用历史数据通过最小二乘法或最大似然估计求解参数a, b。但这里有个大坑历史数据中的价格和销量是已经发生的“均衡结果”可能存在内生性问题即价格本身可能根据预期销量已经调整过。更严谨的做法是使用面板数据模型或引入工具变量但对数理基础要求高。机器学习模型更灵活能自动捕捉非线性关系和特征交互。XGBoost/LightGBM非常适合表格数据能高效处理特征并提供特征重要性。我们可以构建一个模型输入特征包括计划定价p、历史特征、时序特征、品类特征等直接输出预测销量D_hat。关键技巧在训练时p价格是作为一个特征加入的。但在预测时p是我们要优化的决策变量。这意味着我们需要为每一个可能的p值在一个合理范围内都做一次预测来描绘出大致的需求曲线D(p)。神经网络如果有足够数据可以尝试简单的全连接网络。但相对于树模型它可解释性差且更容易过拟合在数模竞赛中需谨慎使用。我们的选择与理由我们采用了混合策略。首先用XGBoost训练一个基础需求预测模型特征中包含历史价格。然后对于每个单品我们固定其他特征让价格p在历史价格的最小最大值区间内以一定步长变化用模型预测出一系列(p, D_hat)点再用这些点去拟合一个幂函数需求曲线D(p) a * p^(-b)。这样做的好处是既利用了机器学习模型强大的特征学习能力又将最终的需求关系约束在一个符合经济学直觉、且易于后续优化求解的简洁数学形式上。拟合出的b值就是该单品在当前市场环境下的预估价格弹性。3.2 损耗预测模型成本控制的“预警机”损耗预测相对直接因为损耗主要与进货量即补货决策和商品本身特性有关对价格不敏感我们假设定价不影响损耗率。可以建立一个预测损耗率r的模型。因变量损耗率r 损耗量 / 进货量。注意处理进货量0的边界情况。自变量包括单品类别、历史平均损耗率、进货量预测值、季节夏季损耗可能更高、是否为易腐品类如叶菜类等。模型选择由于损耗率是介于[0,1]之间的连续值可以考虑使用Beta回归或分位数回归。更实用的是使用梯度提升树如LightGBM直接回归并在训练时对目标变量r做适当的压缩变换如logit变换效果也不错。预测时我们需要先有一个补货量Q的预估值初始可设为历史均值代入模型预测出损耗率r_hat则预测损耗量L_hat r_hat * Q。4. 定价与补货联合优化模型寻找收益最大化的“甜蜜点”这是整个赛题最核心的部分也是论文的亮点所在。预测模型告诉我们“如果这样可能会怎样”而优化模型则回答“到底应该怎样”。我们的目标是最大化商超每日的总收益。对于单品i设其定价为p_i补货量为Q_i预测需求为D_i(p_i)预测损耗率为r_i可能依赖于Q_i和其他因素则实际销量为min(D_i(p_i), Q_i * (1 - r_i))。这里假设损耗发生在销售之前或之中可供销售的量为Q_i * (1 - r_i)。收益 销售收入 - 成本 p_i * min(D_i(p_i), Q_i * (1 - r_i)) - c_i * Q_i。其中c_i是单品的进价成本价。那么总收益最大化问题可以形式化为一个约束优化问题目标函数Maximize:Σ [ p_i * min(D_i(p_i), Q_i * (1 - r_i)) - c_i * Q_i ](对所有单品i求和)约束条件p_i_min ≤ p_i ≤ p_i_max价格上下限通常基于历史数据或政策设定0 ≤ Q_i ≤ Q_i_max补货量上限可能由供应商或仓储能力决定D_i(p_i)是第3步中得到的需求函数如a_i * p_i^(-b_i)。r_i可能是常数也可能是Q_i的函数如进货越多管理越难损耗率微增。难点与解决方案min()函数导致非光滑目标函数中的min()使其不光滑难以直接用梯度类算法求解。处理方法有两种一是引入辅助变量和不等式约束将其转化为线性或非线性规划问题二是采用分情况讨论由于最优解通常倾向于让补货量略高于需求以避免缺货损失我们可以先假设Q_i * (1 - r_i) ≥ D_i(p_i)即货源充足。这样目标函数简化为Σ [ p_i * D_i(p_i) - c_i * Q_i ]。求解后再验证该假设是否对所有单品成立。若不成立对不满足的单品调整假设重新求解。品类关联性目标函数是各单品收益的简单求和忽略了替代效应。更高级的模型可以引入交叉价格弹性。假设单品i和j互为替代品那么i的需求不仅取决于p_i还取决于p_jD_i a_i * p_i^(-b_ii) * p_j^(b_ij)其中b_ij 0表示j的价格对i需求的影响。这样目标函数就变成了一个复杂的非线性方程组求解难度极大。在竞赛有限时间内一个可行的简化是分层次优化。先对每个品类内部替代性强的单品进行联合优化再在品类间进行协调。或者将关联性强的单品打包为这个“包”设定一个总补货量约束然后在包内分配。求解算法如果模型能简化为无约束或简单约束的凸优化问题可以使用梯度下降法、牛顿法等。对于带约束的非线性规划可以使用序列二次规划SQP或内点法调用MATLAB的fmincon函数或Python的SciPy.optimize.minimize工具包。智能优化算法当变量较多几十上百个单品问题非凸时遗传算法GA、粒子群算法PSO是很好的选择。它们能全局搜索虽然不能保证找到理论最优但通常能找到高质量的可行解。我们当时采用了差分进化算法DE因为它参数少、收敛性相对好非常适合这类连续变量的优化问题。我们将每个单品的(p_i, Q_i)编码为一个个体以总收益的负值作为适应度函数进行迭代进化。5. 模型评估与策略分析不只是数字游戏优化模型输出了一套(p_i, Q_i)但它的效果到底如何不能只靠目标函数值说话必须进行回溯测试和场景分析。5.1 回溯测试Backtesting从历史数据中划出一部分作为“测试期”例如最后一个月。用测试期之前的数据训练我们的预测模型和优化模型。然后模拟在测试期的每一天基于截至前一日的历史数据运行优化模型得到当天各单品的建议定价和补货量。将这些建议值“应用”到当天。但这里有个问题我们无法知道如果用了建议价格真实需求会是多少。所以我们需要一个“反事实估计”利用我们之前拟合的需求函数D_i(p)将建议定价p_i代入计算出预测需求D_hat_i。模拟过程实际销量 min(D_hat_i, Q_i * (1 - r_i))其中r_i用预测的损耗率。然后计算模拟的当日收益。将整个测试期的模拟收益加总与测试期实际发生的收益进行对比。同时对比模拟的销量、损耗量与实际情况的差异。注意这个对比不是看绝对数字是否一致因为价格变了需求也变了而是看趋势和优化效果。一个成功的模型应该能显示出在模拟中通过优化定价和补货总收益相比实际历史收益有显著提升同时平均损耗率有所下降。5.2 敏感性分析与策略解读模型不是黑箱我们需要理解它为什么做出这样的决策。价格弹性分析展示不同单品拟合出的价格弹性系数b。弹性高的单品如常见绿叶菜降价能显著提升销量适合做促销引流弹性低的单品如必需调味品或特色菜顾客对价格不敏感可以维持较高利润率。补货策略分析分析优化后的补货量Q_i与历史平均销量的比值。对于损耗率高、需求波动大的单品这个比值通常会比较保守即少进多补对于畅销且稳定的单品比值会更高。“如果-那么”场景分析这是论文的加分项。例如场景一成本上涨假设所有单品进价c_i统一上涨10%重新运行优化模型观察最优定价和补货策略如何调整总收益变化多少。场景二需求波动模拟节假日需求整体上浮20%或恶劣天气需求下浮15%但可能某些品类需求上升看模型的应对策略。场景三捆绑促销如果强制要求某两种关联单品如西红柿和鸡蛋进行捆绑定价总价打折对整体收益有何影响 通过这些分析你的模型就从一套数学公式升华为一个能为管理者提供深度洞察的决策支持系统。6. 论文写作与编程实现要点思路再好也需要通过论文和代码来呈现。6.1 论文行文逻辑问题重述与分析不要照抄题目要用自己的话精炼概括问题的本质、目标和约束并画出逻辑框图清晰展示“数据-预测-优化-评估”的流程。模型假设清晰列出关键假设如“假设单品间的替代效应主要通过品类聚合特征刻画”、“假设损耗率在短期内相对稳定”等。合理的假设能简化问题体现你的思考。符号说明制作一个三线表列出所有主要变量、符号及其含义方便评委查阅。模型建立这是核心章节。分小节详细介绍预测模型需求、损耗和优化模型。对每个模型要交代为什么选这个模型与其它模型对比的优劣模型的具体形式给出数学公式以及参数如何估计或学习。模型求解详细说明你采用的算法如差分进化算法包括编码方式、种群大小、迭代次数、变异交叉策略选择等参数设置并解释为什么这些参数是合理的。可以附上算法流程图。模型检验与结果分析展示回溯测试的结果对比图、表。进行深入的敏感性分析和场景分析。所有结论都要有图表或数据支撑避免空谈。模型评价与推广客观评价自己模型的优点如综合考虑了多种因素、实用性强和缺点如对数据质量依赖高、未考虑突发极端事件。提出可能的改进方向并将模型推广到更一般的零售商品定价补货问题。6.2 编程实现技巧语言选择Python是首选生态丰富。Pandas用于数据清洗Scikit-learn/XGBoost/LightGBM用于预测模型SciPy用于优化Matplotlib/Seaborn用于绘图。代码结构按模块组织代码data_preprocessing.py,feature_engineering.py,demand_forecast.py,loss_forecast.py,optimization.py,evaluation.py。这样清晰且易于调试。效率优化优化模型求解可能是计算瓶颈。对于智能算法设置合理的迭代次数和种群规模。可以考虑并行计算如评估种群中个体的适应度函数时可以并行。结果可视化不仅要画出销量-价格散点图及拟合的需求曲线还要画出优化前后各单品价格/补货量的对比雷达图或条形图以及总收益随时间变化的对比折线图。一图胜千言。最后想说的是国赛C题从来不是要一个完美的、能直接商用的系统而是考察你们将复杂实际问题抽象为数学模型的能力、对多种建模方法的理解和驾驭能力、以及通过编程和数据分析解决问题的能力。大胆假设小心求证在模型复杂性和可解释性之间找到平衡并用严谨的论文和可靠的代码将其呈现出来这就是通往高分的道路。我们当时在最后一天发现最初的优化模型在某个特殊品类上结果反常连夜回溯发现是给该品类设定的价格下限不合理导致模型搜索空间受限。所以永远要对模型结果保持怀疑用业务常识去校验它这个反复调试、思考、完善的过程或许比最终的答案更重要。
返回列表