生鲜零售定价与补货优化:从需求预测到库存决策的数学建模实战

📅 2026/8/27 11:34:08
生鲜零售定价与补货优化:从需求预测到库存决策的数学建模实战
1. 项目概述当数学建模遇上生鲜零售的“灵魂拷问”刚拿到2023年高教社杯国赛C题的时候我第一反应是这题目出得真“接地气”。它直接把一个困扰了无数商超、电商平台多年的现实难题——“蔬菜该怎么定价、怎么补货”——抛给了我们这些建模人。题目要求我们基于销售流水、商品损耗和批发价格这些冷冰冰的数据去构建一套能够自动决策的数学模型这本质上是在模拟一个生鲜品类运营经理每天都要面对的“灵魂拷问”明天该进多少货每样菜该卖多少钱这可不是拍脑袋能决定的事价格定高了卖不动损耗剧增定低了看似热闹毛利却可能为负。补货多了最后烂在库里补少了又白白错过销售机会顾客满意度下降。这道题的精妙之处在于它完美地融合了数据分析、运筹优化和市场洞察。它考察的绝不仅仅是套用一个现成的预测模型那么简单而是要求我们深入理解生鲜商品特别是蔬菜这一类目的独特属性极强的时效性生命周期短、显著的需求波动性受天气、节假日影响、高昂的损耗成本以及不同品类间的替代与关联关系。解题的过程就是一个将商业逻辑数学化、将管理经验模型化的过程。无论是对于参加数学建模竞赛的学生还是对于实际从事供应链、零售数据分析的从业者深入拆解这道题的思路都具有极高的实战参考价值。接下来我就结合自己多年在数据分析和零售建模方面的经验把这套复杂的决策体系拆解开来看看如何用数学模型来“算计”好每一棵蔬菜的命运。2. 问题核心拆解从商业问题到数学语言面对这样一个综合性问题首要任务不是急于寻找算法而是进行彻底的问题拆解将模糊的商业需求转化为清晰的、可量化的数学任务。这是整个项目成败的基石。2.1 三大核心决策目标解析题目要求本质上包含了三个层层递进、相互耦合的决策目标我们需要逐一明确它们的数学内涵。第一定价决策。这不是简单的成本加成。蔬菜定价的核心矛盾在于价格影响销量销量又直接影响损耗和总收入。我们需要建立一个需求函数来刻画价格与销量之间的关系。通常蔬菜的需求函数是非线性的价格弹性较高。同时定价还需考虑1成本基础包括进货批发成本和分摊的运营成本2损耗风险定价需能覆盖预期损耗带来的成本3竞争与市场水平虽然题目未直接给出但可通过历史数据中“促销”或“正常”销售状态间接反映需求价格弹性的变化4品类关联例如菠菜价格涨了顾客可能会多买小青菜这种替代效应也需要在模型中考量。因此定价模型是一个以最大化日均预期利润或综合收益为目标以需求函数为主要约束的优化问题。第二补货决策。补货决策与定价紧密相连因为定价策略决定了预期的销售量。补货量的核心是平衡缺货成本机会损失、顾客满意度下降和过剩成本损耗成本、资金占用。这本质上是一个报童模型的扩展。但与传统报童模型不同蔬菜的补货决策还需要考虑1多周期动态性今天的剩余库存会影响明天的决策是一个动态规划问题2损耗的动态过程损耗不是期末一次性发生的而是随时间推移累积的可能与库存时间正相关3供应商约束可能存在最小起订量、供货提前期或供应量波动。补货模型的目标是找到一个最优的补货量使得在整个规划周期内如一周总成本缺货成本损耗成本进货成本最小化或总利润最大化。第三品类关联分析。这是本题的升华点。蔬菜不是孤立销售的品类之间存在互补性如西红柿和鸡蛋或替代性如多种绿叶菜。题目要求我们识别这些关系。数学上这可以通过分析不同品类日销量之间的相关性、交叉价格弹性或构建如向量自回归模型来研究一个品类销量变化对另一个品类的影响。更深入的做法可以尝试利用关联规则挖掘发现经常被同时购买的商品组合。理解品类关联能让我们从单品类优化升级到品类群协同优化例如通过有意调低某引流蔬菜的价格来带动高毛利关联蔬菜的销售。2.2 数据基础与关键假设澄清题目提供了销售流水、损耗数据和批发价数据。在建模前必须对这些数据进行深刻的“审题”。销售流水数据这是需求函数的“土壤”。需要重点关注销量、单价、销售状态是否促销。要按单品、按天进行聚合分析。促销期的数据点其价格弹性与正常期不同在拟合需求函数时理想情况下应区分处理或引入一个“促销状态”哑变量。损耗数据这是利润的“黑洞”。需要计算每个单品的历史损耗率。一个关键假设是损耗是如何发生的是每日库存的固定比例损耗还是与库存时间正相关如库存每多一天损耗风险增加X%后者更符合蔬菜实际但建模更复杂。通常我们可以用历史日均损耗量除以日均进货量或日均期初库存来估算一个综合损耗率作为初步近似。批发价数据这是成本的“锚点”。需要注意批发价可能存在的波动性。在预测未来补货成本时是使用最新批发价、历史均价还是需要对批发价本身进行时间序列预测在竞赛有限时间内采用移动平均或最近一期价格是务实的选择。注意一个至关重要的假设是关于需求不确定性的建模。历史销量是已经实现了的需求但未来需求是随机的。我们不能简单地把历史日均销量当作明天的确定需求。必须为每个单品未来的日需求量设定一个概率分布如正态分布、泊松分布其参数均值、方差需从历史数据中估计。这是衔接定价模型和补货模型的关键桥梁——定价模型决定了需求分布的均值通过需求函数而补货模型则在随机需求分布下寻求最优解。3. 模型构建搭建自动决策的数学引擎在明确问题与数据后接下来就是构建核心数学模型。我将分步骤阐述一个较为完整且可操作的建模框架。3.1 第一步单品需求函数拟合这是所有决策的基础。对于每个蔬菜单品i我们假设其日需求量 ( D_i ) 与其零售价 ( p_i ) 存在函数关系 ( D_i f(p_i, \theta) \epsilon )其中 ( \epsilon ) 为随机误差项。常用函数形式选择线性需求函数( D a - b \cdot p )。形式简单但可能无法很好地拟合价格较高时需求锐减的非线性关系。指数型/对数线性需求函数( \ln(D) a - b \cdot p ) 或 ( D \alpha \cdot p^{-\beta} )。后者即幂函数形式其中 (\beta) 即为价格弹性。这种形式能更好地反映需求随价格增长而衰减的特性在经济学中更常用。考虑促销的影响可以在模型中引入一个哑变量 ( promo )促销时为1否则为0。例如( \ln(D) a - b \cdot p c \cdot promo )。这意味着促销本身会带来一个固定的需求增量。拟合方法使用历史数据中的价格销量点对采用最小二乘法进行回归拟合。对于幂函数形式可以先对等式两边取对数转化为线性回归问题( \ln(D) \ln(\alpha) - \beta \cdot \ln(p) )。拟合后就能得到对于给定价格 ( p ) 的预期需求量( \hat{D}(p) )这即是需求分布的均值。实操心得在拟合时务必注意数据清洗。剔除因缺货导致的销量为零或极低的数据点这些点反映的是供应不足而非需求不足。另外可以将周末/节假日的数据单独拟合因为需求模式可能与工作日不同。如果数据量允许为每个单品单独拟合如果某些单品数据稀疏可以考虑聚类如将易腐烂的叶菜类归为一组后拟合组内共性参数。3.2 第二步集成定价-补货联合优化模型这是本问题的核心模型。我们将定价和补货作为联合决策变量在一个统一的框架下优化。模型假设与符号定义( i )蔬菜单品索引。( p_i )单品i的决策零售价。( w_i )单品i的已知批发价成本价。( Q_i )单品i的决策补货量。( \hat{D}_i(p_i) )由需求函数得出的预期日均需求量均值。( \sigma_i )日均需求的标准差可从历史销量数据波动中估算。( \gamma_i )单品i的损耗率假设为期末未售出库存的比例。( s_i )单品i的单位缺货成本可表示为损失的毛利机会。( h_i )单品i的单位过剩损耗成本即商品成本 ( w_i )。目标函数最大化日均预期利润利润由销售收入、减去进货成本、再减去缺货和过剩损耗的期望成本构成。由于需求是随机的我们需要计算期望值。[ \max_{p_i, Q_i} \sum_i \left[ p_i \cdot E[\min(D_i, Q_i)] - w_i \cdot Q_i - s_i \cdot E[\max(D_i - Q_i, 0)] - h_i \cdot E[\max(Q_i - D_i, 0)] \right] ]其中( E[\min(D_i, Q_i)] ) 是期望销售量。它等于 ( \hat{D}_i ) 减去期望缺货量。( E[\max(D_i - Q_i, 0)] ) 是期望缺货量。( E[\max(Q_i - D_i, 0)] ) 是期望过剩量即预期损耗量。计算关键当假设需求 ( D_i ) 服从均值为 ( \hat{D}_i(p_i) )、标准差为 ( \sigma_i ) 的正态分布时上述期望值有解析表达式涉及标准正态分布的损失函数。这大大简化了计算。约束条件价格约束( p_i^{min} \leq p_i \leq p_i^{max} )。下限可以是成本价 ( w_i ) 乘以一个最小毛利率系数上限可以参考历史最高价或通过需求函数反推当需求趋近于0时的价格。补货量约束( Q_i \geq 0 )且可能受供应商最大供应量限制。需求函数耦合( \hat{D}_i f(p_i) )这是将定价决策与需求预测连接起来的关键等式。求解策略这是一个带约束的非线性规划问题。由于单品数量可能较多且目标函数复杂可以采用分两步迭代的实用方法固定价格优化补货量对于一组给定的价格 ( {p_i} \可以计算出每个单品的预期需求 ( \hat{D}_i ) 和标准差 ( \sigma_i )。此时问题分解为多个独立的报童问题。最优补货量 ( Q_i^* ) 有一个经典解使得需求分布函数 ( F_i(Q_i^*) \frac{s_i}{s_i h_i} )。其中 ( F_i(\cdot) ) 是需求 ( D_i ) 的累积分布函数。这个比率 ( \frac{s_i}{s_i h_i} ) 被称为关键比率它权衡了缺货与过剩的成本。固定补货量优化价格在补货量已知的情况下利用需求函数通过梯度下降等数值方法调整价格 ( p_i ) 以最大化目标函数。交替迭代步骤1和2直到价格和补货量的变化小于某个阈值即收敛到一个联合最优解。3.3 第三步引入品类关联的模型进阶前述模型假设各单品独立。要引入关联需要在需求函数 ( f(p_i) ) 中增加交叉价格项。将单品i的需求函数扩展为 [ \hat{D}i a_i - b_i \cdot p_i \sum{j \neq i} c_{ij} \cdot p_j ] 其中( c_{ij} ) 表示单品j的价格对单品i需求的影响系数。若 ( c_{ij} 0 )则j是i的替代品j涨价i需求增加若 ( c_{ij} 0 )则j是i的互补品j涨价i需求减少。估计交叉价格弹性系数 ( c_{ij} ) 这需要利用面板数据采用多元回归或岭回归等方法来估计。由于可能涉及很多品类为防过拟合可以先基于业务知识如都是绿叶菜或数据相关性分析筛选出最可能有关联的品类对进行建模。模型调整 当需求函数包含交叉价格项后所有单品的定价决策就耦合在一起了。目标函数变为一个大型的、多变量的非线性优化问题。此时直接求解析解非常困难必须依赖数值优化算法如序列二次规划或智能优化算法遗传算法、粒子群算法等来求解全局的 ( {p_i} ) 和 ( {Q_i} )。注意事项引入全品类关联会使模型复杂度呈指数级增长且对数据量和质量要求极高。在竞赛或实际初期应用中一个更稳健的策略是先按独立单品模型求解再根据品类关联分析的结果进行人工或规则化的后调整。例如独立模型算出菠菜应涨价、小青菜应降价但分析发现二者替代性很强则可以适当降低菠菜的涨价幅度或同步调整小青菜的降价幅度以实现品类整体利润最优。这种“模型为主人工调参为辅”的混合策略在实际业务中往往更可行。4. 模型求解、验证与结果分析构建模型只是第一步如何求解、验证并解释结果才是将数学模型转化为商业价值的关键。4.1 求解算法与工具选择对于上述优化模型根据复杂度不同可选用不同工具。独立单品模型无关联这是最简单的形式。如前所述可以采用交替迭代法编程实现。对于每个单品其最优补货量的“关键比率”公式可以直接计算。价格优化部分由于是单变量函数可以用一维搜索算法如黄金分割法快速求解。使用Python的SciPy.optimize库可以方便地实现。考虑品类关联的联合模型这变成了一个高维非线性约束优化问题。推荐使用专业的优化求解器。MATLAB的fmincon函数功能强大对于中小规模问题效果很好。Python的Pyomo建模语言配合Ipopt或Bonmin求解器适合处理更复杂的优化问题。如果问题规模很大或非凸性严重可以尝试元启发式算法如遗传算法DEAP库、粒子群算法等。这些算法不保证找到全局最优但通常能找到质量很高的满意解。一个简化的Python伪代码框架交替迭代法import numpy as np from scipy.stats import norm from scipy.optimize import minimize_scalar # 假设参数已定义 cost w_i price_bounds (p_min, p_max) mean_demand_func lambda p: a - b * p # 线性需求函数示例 std_demand sigma shortage_cost s_i holding_cost h_i def newsvendor_ratio(Q, mean, std): 计算给定补货量下的期望利润 z (Q - mean) / std exp_sales mean - std * norm.pdf(z) Q * norm.cdf(z) exp_shortage std * norm.pdf(z) - (mean - Q) * (1 - norm.cdf(z)) exp_leftover Q - exp_sales profit p * exp_sales - cost * Q - shortage_cost * exp_shortage - holding_cost * exp_leftover return -profit # 返回负值用于最小化 # 交替迭代 p_current (p_min p_max) / 2 # 初始价格 for iteration in range(max_iter): # 步骤1: 固定价格优化补货量 mean_d mean_demand_func(p_current) # 计算关键比率对应的分位数 critical_ratio shortage_cost / (shortage_cost holding_cost) Q_optimal norm.ppf(critical_ratio, locmean_d, scalestd_demand) # 步骤2: 固定补货量优化价格 def profit_for_opt(p): mean_d mean_demand_func(p) return newsvendor_ratio(Q_optimal, mean_d, std_demand) res minimize_scalar(profit_for_opt, boundsprice_bounds, methodbounded) p_new res.x # 检查收敛 if abs(p_new - p_current) tolerance: break p_current p_new print(f最优价格: {p_current:.2f}, 最优补货量: {Q_optimal:.2f})4.2 模型验证与敏感性分析模型建好后绝不能直接“黑箱”使用必须验证其合理性和稳健性。历史数据回测使用过去一段时间的数据将模型生成的每日建议定价和补货量与当时的实际决策进行对比。计算在模型建议下理论利润相较于实际利润的提升幅度。这是最直接的验证。关键参数敏感性分析模型结果严重依赖于几个关键参数价格弹性系数 ( b )、损耗率 ( \gamma )、缺货成本 ( s_i )。需要测试当这些参数在一定范围内波动时例如±10%最优价格和补货量的变化程度。操作可以绘制龙卷风图直观展示哪个参数对输出结果如总利润的影响最大。这能指导我们在数据收集和参数估计上应该更关注哪些方面。场景模拟What-if分析模拟一些极端或特殊场景检验模型的应对能力。场景一批发价突然上涨20%模型建议的价格和补货量如何调整调整幅度是否符合商业直觉场景二天气预报显示未来三天连续大雨可能导致叶菜类需求激增如何将此外生信息融入模型一个简单办法是临时调高需求函数的截距项 ( a_i )。场景三某个竞争门店对主要单品进行大幅降价促销模型能否通过模拟一个“虚拟”的低价竞争对手来给出应对策略如是否跟进降价4.3 结果输出与决策支持模型的最终输出不应只是一堆数字而应是可执行的决策建议和风险提示。核心输出表格单品编码单品名称建议零售价元建议补货量kg预期日均销量kg预期损耗率预期毛利润元/日风险提示C001西红柿5.8120.5115.24.4%320.5批发价波动大建议锁定货源C002黄瓜4.298.795.13.7%210.3需求预测标准差高建议备安全库存C003菠菜6.545.243.83.1%150.8与C004小青菜强替代可考虑组合促销决策仪表板可视化价格-销量-利润关系图对于重点单品绘制其需求曲线并在曲线上标出当前建议价格点对应的销量和利润直观显示提价/降价的潜在影响。品类关联网络图用节点表示品类边表示关联强度替代/互补和方向帮助管理者一目了然地掌握品类结构。库存-销售-损耗趋势看板展示模型实施后关键库存指标库存天数、周转率和损益指标的变化趋势。行动建议清单高利润敏感单品对于模型显示利润对价格非常敏感的单品如高档菌菇建议实施动态定价一天内可根据时段微调价格。高损耗风险单品对于模型建议补货量少但预期损耗仍高的单品如嫩豆腐建议运营端重点监控陈列量和销售速度必要时在闭店前进行主动促销清货。关联品类组合对于识别出的强互补组合如西红柿鸡蛋建议在陈列和促销上进行捆绑提升整体客单价。5. 实战中的挑战、技巧与扩展思考将这样一个模型真正用起来会遇到许多纸上谈兵时遇不到的问题。下面分享一些从实战中总结的要点。5.1 常见问题与排查技巧实录问题模型给出的建议价格过高或过低明显不符合市场认知。排查思路检查需求函数拟合是否使用了有偏的数据是否包含了缺货日的数据重新检查散点图看是否存在异常值扭曲了回归线。审查价格约束设置的 ( p^{min} ) 和 ( p^{max} ) 是否合理( p^{min} ) 至少应高于单位成本批发价分摊损耗。审视缺货成本 ( s_i )这个参数最难估计。如果设得过低模型会倾向于少进货、高定价因为不怕缺货。可以尝试用一个比例如商品毛利的某个倍数来估算并通过敏感性分析观察其影响。技巧引入“价格平滑性约束”限制相邻两天的建议价格变动幅度不超过一定比例如10%避免价格剧烈波动引起顾客不适。问题模型建议的补货量波动巨大今天100kg明天20kg供应链无法执行。排查思路检查需求波动性 ( \sigma_i )是否被高估了特别是对于销量较小的单品历史数据少估算的标准差可能不可靠。可以使用贝叶斯方法用一个先验分布如基于品类平均波动率来平滑估计结果。审视模型假设是否忽略了库存的动态结转更高级的模型应该是一个多周期动态规划允许库存结转这样补货量就不会剧烈跳跃。技巧在最终补货建议上增加一个运营调整层。例如设定最小订货批量MOQ规则或者将模型输出的日补货量按周进行加总再与供应商协商一个相对稳定的周供应计划在日内进行微调。问题品类关联模型系数 ( c_{ij} ) 估计不准甚至符号与常识相反。排查思路共线性问题不同蔬菜价格本身可能受共同因素如季节影响而同步变动导致回归分析中出现伪相关。使用岭回归或LASSO等带正则化的方法可以缓解共线性并自动进行变量筛选。样本量不足要估计N个品类的交叉效应需要足够多的数据点。如果数据不足不如先聚焦于业务上明确知道的几个核心关联对。技巧采用“先验信息数据驱动”的混合方式。首先根据业务经验如品类经理的知识确定一个初步的关联关系网络然后利用数据对这个网络中的边权系数大小进行校准和修正而不是从零开始挖掘所有关联。5.2 模型扩展与进阶方向如果时间和计算资源允许可以从以下几个方向深化模型使其更贴近现实多周期动态库存模型将单日模型扩展为覆盖一周的滚动优化。决策变量变为未来多天的价格和补货量序列目标函数是周期总利润最大化约束条件包括库存平衡方程今日期末库存昨日期末库存今日补货-今日销量。这需要用到随机动态规划或模型预测控制方法复杂度高但更能优化整体库存水平。需求预测模型升级前述模型使用静态的需求函数。可以引入更精细的时间序列预测模型如SARIMA、Prophet或机器学习模型如LightGBM将天气、节假日、促销活动、周末效应等外部特征纳入动态预测需求函数的截距项 ( a_i(t) )从而让定价和补货响应市场变化。基于画像的差异化定价在电商或拥有会员系统的商超可以尝试对不同用户群体实施差异化定价。这需要将总需求拆分为不同细分群体的需求并为每个群体设定不同的价格弹性在总供应量的约束下实现总收益最大化。这涉及到收益管理的经典理论。5.3 从模型到系统工程化落地思考竞赛可以只给出模型和结果但实际落地需要一个完整的系统。数据流水线需要自动化地从ERP、POS系统中抽取前一天的销售、库存、成本数据进行清洗和加工作为模型每日运行的输入。模型服务化将核心优化模型封装成API服务。每天定时触发读取最新数据运行模型将建议结果写入数据库。人机交互界面为采购和运营人员提供友好的Web界面。界面不仅展示模型建议更要允许他们输入人工Override的理由如“今日有大型团购订单”并记录在案。这些人工干预后的实际结果又可以作为反馈数据用于后续模型的迭代优化。效果监控与迭代建立A/B测试机制。可以选取部分门店或部分品类作为实验组完全采用模型建议另一些作为对照组沿用传统人工决策。长期对比两组的毛利率、损耗率、库存周转率等核心指标用数据证明模型的价值并持续反哺模型优化。构建蔬菜的自动定价与补货决策模型是一个典型的“数据驱动业务”的案例。它告诉我们再传统、再依赖经验的领域也存在着被数学和算法优化的巨大空间。这个过程绝非一蹴而就必然要经历“从简单到复杂、从单点到系统、从辅助到主导”的迭代。最关键的是第一步用数学语言清晰地定义问题并构建一个哪怕简单但逻辑完整的初始模型让它先跑起来。只有模型转起来了数据流起来了你才能发现真正的问题所在从而一步步将其打磨成赋能业务的利器。