
1. 项目概述从“拍脑袋”到“数据驱动”的零售革命在生鲜零售行业尤其是大型连锁超市蔬菜类商品的日常运营一直是个“老大难”问题。每天早上店长和采购员都要面对一堆灵魂拷问今天黄瓜该定多少钱西红柿该进多少货定高了卖不掉晚上只能含泪打折甚至报废定低了货架一早就被抢空白白损失了销售机会和顾客满意度。这背后是巨大的损耗与潜在利润的流失。我参与过多次数学建模国赛的指导其中C题“蔬菜类商品的自动定价与补货决策”之所以经典就是因为它精准地戳中了这个行业痛点——用数学模型和算法替代传统依赖经验的“拍脑袋”决策实现精细化运营。简单来说这个项目要解决两个核心问题定价与补货。定价决定了单品的利润率和周转速度补货决定了库存成本和缺货风险。两者相互耦合共同影响着最终的销售总额和毛利率。过去这依赖于资深员工的“手感”但人的经验有局限且无法快速处理海量的历史销售数据、天气数据、节假日信息以及竞争对手的动态。而数学建模就是要将这些模糊的“感觉”转化为清晰的、可量化的、可自动执行的决策规则。这个项目适合所有对数据分析、运筹学、零售科学感兴趣的朋友无论是正在备战数模竞赛的学生还是希望了解智能零售落地方案的从业者。它不仅仅是一道赛题更是一套完整的、从问题抽象、数据清洗、模型构建到策略评估的商业分析框架。接下来我将以一个“虚拟超市”的蔬菜部门为背景拆解如何一步步构建这个自动决策系统。2. 核心问题拆解与建模总览面对“定价”与“补货”这两个目标我们首先要理解它们的关联与矛盾并确立建模的总体思路。2.1 问题本质在不确定需求下寻求动态平衡蔬菜的需求充满不确定性受季节、天气、价格、节假日、甚至社会事件影响。同时蔬菜具有显著的易腐性和短生命周期通常只有1-3天。这就决定了我们的模型必须在多个约束条件下寻找动态最优解利润最大化目标总收入 - 采购成本 - 损耗成本 - 库存持有成本。市场需求约束价格越高需求量通常越低需求价格弹性。库存约束补货量受仓储容量、到货周期限制。损耗约束当日未售出的商品其价值会随时间急剧衰减最终可能归零。竞争约束周边商超的定价会影响本店的需求。因此这不是两个独立问题而是一个联合优化问题。定价策略会影响销量进而影响库存状态和补货需求补货策略决定了可售库存又反过来制约了定价的灵活性例如库存积压时必须降价促销。2.2 建模框架分阶段、分层次的策略设计在实际操作和竞赛中一个行之有效的框架是采用分层决策和滚动优化。分层决策上层战略层/日级基于未来数日的需求预测制定每日的总补货计划采购订单和基础价格区间。这个层面考虑的是周级别的销售趋势和批量采购成本。下层战术层/日内在每日运营中根据实时库存和销售速率进行动态定价调整如午后的折扣促销和紧急补货微调。这个层面响应的是小时级别的市场变化。滚动优化我们不可能预测未来所有日子。更实际的做法是每天结束时根据最新的销售数据和库存状态重新预测未来几天的需求并优化制定第二天的价格和补货量。如此循环往复使决策始终基于最新信息。一个常见的建模流程如下数据准备与探索性分析清洗历史销售数据分析销量与价格、时间、天气等因素的相关性。需求预测模型构建预测未来一段时间内每种蔬菜在给定价格下的需求量。定价模型构建在需求预测的基础上以最大化利润为目标求解最优价格。补货模型构建结合最优价格下的预测需求、当前库存、在途库存、损耗率确定最优补货量。模型集成与仿真将定价与补货模型耦合在一个模拟的销售环境中测试策略效果并与基准策略如固定价格、经验补货对比。注意竞赛题目通常会提供一部分历史数据但变量可能不全。我们需要根据业务理解判断是否需要在模型中引入“虚拟变量”例如用“星期几”来表征周末效应用“是否节假日”来表征消费高峰。3. 数据基石需求预测模型的构建一切智能决策的起点是相对准确的预测。对于蔬菜这类商品我推荐采用“基线预测 影响因素调整”的组合模型思路。3.1 核心预测模型选择与实战单纯用时间序列如ARIMA可能无法很好地捕捉价格等外部因素的影响。因此多元线性回归或机器学习模型如梯度提升树GBDT、随机森林往往是更佳选择。假设我们有以下变量Sales销量目标变量Price当日价格Day_of_Week星期几0-6Is_Holiday是否节假日0/1Temperature平均气温Competitor_Price主要竞争对手价格一个简单的线性回归模型形式如下Sales β0 β1*Price β2*Day_of_Week β3*Is_Holiday β4*Temperature β5*Competitor_Price ε实操要点数据标准化/归一化特别是对于线性模型将数值型变量如Price, Temperature标准化到相近的尺度有助于模型稳定和系数解释。处理分类变量Day_of_Week这类变量需要使用独热编码One-Hot Encoding。检验共线性如果Price和Competitor_Price高度相关需要考虑剔除一个或使用主成分分析。评估预测效果不要只看整体的R²更重要的是看模型在价格变动时的预测能力。可以将数据按价格区间划分分别检查预测误差。更进阶的做法使用XGBoost或LightGBM这类树模型。它们能自动捕捉变量间的非线性关系比如价格对销量的影响可能不是线性的而是在某个阈值后需求锐减和交互效应比如节假日和天气的交叉影响。树模型对异常值也更鲁棒。# 以Python的LightGBM为例一个简化的需求预测建模片段 import lightgbm as lgb import pandas as pd from sklearn.model_selection import train_test_split # 假设df是包含上述变量的DataFrame features [Price, Day_of_Week_Mon, ..., Temperature, Competitor_Price] target Sales X_train, X_val, y_train, y_val train_test_split(df[features], df[target], test_size0.2, random_state42) # 定义模型参数 params { objective: regression, metric: rmse, boosting_type: gbdt, num_leaves: 31, learning_rate: 0.05, feature_fraction: 0.9 } # 创建数据集和训练 train_data lgb.Dataset(X_train, labely_train) val_data lgb.Dataset(X_val, labely_val, referencetrain_data) model lgb.train(params, train_data, valid_sets[val_data], num_boost_round1000, early_stopping_rounds50) # 预测 y_pred model.predict(X_val, num_iterationmodel.best_iteration)3.2 预测中的特殊问题处理新品蔬菜没有历史数据。可以采用“类比法”找品类、属性如叶菜、根茎、菌菇、单价相近的已有商品用其初期销售曲线作为参考并设置较大的预测误差范围。促销期数据大幅降价带来的销量暴增数据会扭曲正常价格下的需求关系。建议将促销期数据单独标记在训练预测模型时要么剔除要么引入一个“是否促销”的强特征。预测不确定性量化预测不可能100%准确。对于后续的优化模型提供预测区间如90%置信区间比提供一个点估计更有价值。这可以通过分位数回归或贝叶斯方法实现。4. 定价模型从经济学原理到优化算法有了需求预测函数Q f(P, other_factors)其中Q是预测需求量P是我们设定的价格我们就可以构建定价优化模型了。4.1 基础模型单周期报童模型扩展经典的报童模型是处理易腐品库存的基石。其扩展形式可以用于定价在知道需求分布的情况下寻找使期望利润最大化的价格。Max_Profit(P) P * E[min(D(P), I)] - C * I - h * E[I - D(P)]⁺ - s * E[D(P) - I]⁺其中P: 售价C: 单位进货成本I: 库存量由补货模型决定此处可先视为与价格无关的初始库存或耦合优化h: 单位库存持有/损耗成本s: 单位缺货损失机会成本D(P): 随机需求是价格P的函数E[]: 期望值我们的目标是求解最优价格P*。当需求函数D(P)形式简单时如线性需求D a - bP可以直接求导得到解析解。但现实中的需求函数更复杂通常需要数值优化方法。4.2 实操中的定价优化流程确定优化目标最常见的是单日期望利润最大化。也可以考虑多日累计利润或引入市场份额、顾客满意度用缺货率衡量等作为约束或次要目标。集成需求预测将前面训练好的机器学习模型f(P, X)作为优化问题中的需求函数。X代表其他已知因素如星期几、天气。定义约束价格上下限P_min P P_max由成本、市场接受度决定。价格变动幅度|P_today - P_yesterday| ΔP_max避免价格剧烈波动引起顾客反感。选择优化算法如果决策变量只有价格P单商品且需求函数是连续可导的可以使用梯度下降法或牛顿法。如果需求模型是复杂的黑箱如训练好的GBDT模型可以使用网格搜索当价格可选值不多时或贝叶斯优化等黑箱优化方法。如果是多商品联合定价考虑替代和互补效应问题会变成高维非线性优化可能需要使用遗传算法、模拟退火等启发式算法。# 一个简化的单商品定价优化示例假设需求函数为线性 import numpy as np from scipy.optimize import minimize_scalar # 参数 cost 2.0 # 进货成本 C initial_inventory 100 # 当前库存 I holding_cost 0.5 # 单位损耗成本 h shortage_cost 1.0 # 单位缺货成本 s (机会成本) # 假设的需求函数: D(P) 200 - 10*P ε, ε~N(0, 5) def expected_demand(price): mean_demand 200 - 10 * price # 为简化此处忽略随机性直接用均值。更严谨的做法需模拟随机需求。 return max(0, mean_demand) # 定义期望利润函数 def expected_profit(price): demand expected_demand(price) sales min(demand, initial_inventory) leftover max(0, initial_inventory - demand) shortage max(0, demand - initial_inventory) profit price * sales - cost * initial_inventory - holding_cost * leftover - shortage_cost * shortage return -profit # 因为我们要最小化负利润 # 约束价格在3元到15元之间 bounds (3.0, 15.0) # 使用有界优化求解 result minimize_scalar(expected_profit, boundsbounds, methodbounded) optimal_price result.x max_profit -result.fun print(f最优价格: {optimal_price:.2f} 元) print(f预期最大利润: {max_profit:.2f} 元)4.3 动态定价与价格歧视上述是每日一次的静态定价。更精细化的动态定价可以在一天内调整多次日间降价针对保质期极短的商品如切配好的净菜在傍晚设置阶梯折扣加速清库。高峰溢价在周末或晚餐前需求高峰时段小幅上调价格。 实现动态定价需要更高频的数据如每小时销量和更复杂的、考虑时间因素的强化学习模型但在国赛C题的尺度上日级定价已足够深入。5. 补货模型库存与需求的精准匹配定价决定了“卖多少钱”补货则决定了“有多少可卖”。补货模型的核心是在采购成本、库存持有成本、损耗风险和缺货风险之间取得平衡。5.1 经典库存模型的应用与调整s, S策略这是周期性盘点下的经典策略。设定一个补货点s和一个目标库存水平S。每日盘点时若库存水平低于s则发起补货将库存补充至S。对于蔬菜S最大库存水平取决于提前期内的预测需求 安全库存。s再订货点取决于提前期内的预测需求 安全库存但通常小于S。关键计算安全库存 z * σ * √L。其中z是服务水平系数如95%对应1.65σ是日需求量的标准差L是补货提前期从下单到收货的天数。报童模型Newsboy Model适用于生命周期极短一日、无法跨期库存的商品。它直接给出了使期望成本最小化的最优订货量。最优订货量 Q* F⁻¹( (Cu) / (Cu Co) )其中Cu是单位缺货成本利润损失。Co是单位过量成本进货成本减去残值。F⁻¹是需求累积分布函数的逆函数。 这个模型非常契合部分日清蔬菜的决策逻辑。5.2 与定价模型耦合的联合补货决策在实际系统中定价和补货是联动的。一个更完整的建模思路是构建一个两阶段随机规划模型第一阶段补货决策在每日开始前基于对未来需求分布的预测决定补货量Q。第二阶段定价决策在补货到货、库存已知后根据当天的实时情况如实际到货量、最新天气等执行定价策略P。目标最大化两阶段的总体期望利润。求解这类问题通常需要样本平均近似方法生成大量可能的需求情景Scenario然后优化使得在所有情景下的平均利润最大。实操心得在竞赛有限时间内一个有效的简化方法是迭代求解先假设一个初始价格用需求预测模型估计销量分布。根据销量分布用报童模型或s,S策略计算补货量。基于计算出的补货量和更新后的库存状态重新运行定价模型得到新的最优价格。重复步骤2-3数次直到价格和补货量基本稳定。这个过程通常收敛很快。5.3 多品类联合补货的考量超市不会只卖一种蔬菜。补货时还需考虑仓储容量约束所有蔬菜的总体积/重量不能超过冷库容量。采购成本分摊一次采购多种蔬菜可能享受更低的整车运输费率。关联销售西红柿和鸡蛋是互补品一种缺货会影响另一种的销售。这需要更复杂的组合需求预测。在模型中这体现为在优化目标中加入总容量约束并使用拉格朗日乘子法或直接使用带约束的优化求解器如PuLP, CVXPY来求解多商品报童问题。6. 模型评估、仿真与系统搭建模型建得好不好不能只看公式漂亮必须经过严苛的“历史数据回测”和“仿真模拟”考验。6.1 构建仿真环境你需要搭建一个模拟超市每日运营的仿真器核心模块包括库存管理模块记录每种蔬菜的当日初始库存、补货到货、销售出库、最终损耗。需求生成模块基于真实历史数据中的价格和外部因素使用一个预设的“真实”需求模型最好与你的预测模型不同以避免过拟合来生成模拟顾客的购买量。可以加入随机噪声。决策执行模块嵌入你的定价与补货模型。每天仿真开始前模型根据当前库存和外部信息做出决策。财务计算模块每日结束后计算销售收入、成本、损耗、利润等关键指标。6.2 评估指标与对比基准运行一段时间的仿真例如3个月对比你的模型策略与以下基准策略基准策略1固定价格经验补货价格始终为成本加成一定比例补货量为前一周同日的平均销量。基准策略2简单动态定价根据库存深浅进行简单打折如库存80%打8折库存20%不打折。对比的评估指标必须全面核心财务指标总利润、毛利率、收入。运营效率指标平均库存周转天数、损耗率损耗金额/总成本、缺货率缺货次数/总销售天数。顾客体验指标价格波动率标准差、平均价格水平。一个成功的模型应该在总利润和毛利率上显著优于基准同时将损耗率和缺货率控制在一个可接受的平衡点。6.3 系统鲁棒性测试压力测试模型不能只在风平浪静时有效。必须进行压力测试需求突增测试模拟节假日或恶劣天气前的抢购看模型是否会因预测不足导致严重缺货。供应链中断测试模拟补货延迟到达看库存是否能支撑定价是否会激进上调。数据噪声测试在输入给模型的数据中加入更大噪声看决策是否会产生剧烈波动。踩坑实录我曾指导一个队伍他们的模型在正常数据上表现优异但一旦将需求预测的随机误差调高20%补货量就开始大幅震荡导致某些日子严重过剩某些日子严重缺货。问题根源在于他们的补货模型对预测误差过于敏感安全库存系数设置得太低。后来他们引入了稳健优化的思想在优化时考虑最坏情况下的需求虽然保守了一些但系统稳定性大大提升。7. 从模型到落地实操挑战与调优心得数学建模比赛可以做出漂亮的假设和简化的模型但真实世界的复杂性超乎想象。这部分分享一些让模型更具“实操性”的思考。7.1 数据质量是生命线模型精度天花板由数据质量决定。在实际项目中你会遇到数据缺失天气数据可能某几天没有竞争对手价格很难持续获取。数据异常促销记录缺失导致某天“原价”销量极高扭曲模型。数据不一致商品编码变更同一个西红柿前后用了两个编码。处理建议建立数据监控看板每日监控销量、价格的异常波动如超过3个标准差。使用移动平均或插值处理少量缺失对于大量缺失的特征考虑是否用其他相关特征替代或直接舍弃。业务校验任何从模型得出的离谱决策如黄瓜定价50元/斤都必须有业务逻辑拦截和人工复核机制。7.2 模型可解释性与业务接受度一个黑箱模型即使效果再好如果店长不理解“为什么今天菠菜要涨价”他也不会信任和使用它。提升可解释性特征重要性分析向业务方展示是“节假日”还是“气温”对销量影响最大。局部敏感性分析展示“如果明天降温5度模型预测销量会增加多少因此建议补货量增加多少”。决策规则简化对于某些规律性极强的商品可以尝试从复杂模型中提炼出几条简单的“如果-那么”规则作为辅助解释。7.3 系统部署与迭代一个完整的自动决策系统其架构可能包括数据管道每日自动抽取前一天的销售、库存数据获取天气预报、节假日信息。模型服务将训练好的预测和优化模型封装成API或定时任务。决策输出每天凌晨自动生成当日的“建议定价表”和“补货建议单”通过系统界面或邮件推送给采购和运营人员。反馈闭环记录人工是否采纳了建议以及采纳后的实际结果这些数据用于下一轮的模型迭代训练。迭代是关键。市场在变消费者的偏好在变模型必须定期如每季度用最新的数据重新训练和评估。可以设置A/B测试在部分门店试点新模型策略与老策略对比效果验证无误后再全量推广。最后我想说数学建模国赛C题的价值远不止于完成一篇论文。它训练的是你将一个模糊的商业问题层层拆解、量化、建模、求解并评估的完整思维能力。无论你未来是走向科研还是进入互联网、零售、物流等行业从事数据分析与算法工作这套从“定义问题”到“交付解决方案”的框架都是你最具价值的核心武器。真正的挑战始于比赛结束之后——如何让你的模型经得起真实世界复杂、混沌、充满不确定性的检验。这需要的不只是数学还有对业务的深刻理解、对数据的敬畏以及对系统稳健性的不懈追求。