生鲜商品动态定价与补货联合优化模型:从需求预测到库存管理
1. 从菜市场到数学模型为什么蔬菜定价与补货是个“硬骨头”问题如果你在菜市场买过菜或者经营过一家小超市你大概会有一个直观感受蔬菜这东西太“难伺候”了。今天进货的菠菜明天可能就蔫了昨天还卖得不错的黄瓜今天因为隔壁超市打折突然就滞销了。价格定高了没人买定低了亏本货进多了卖不掉烂在手里进少了又错失赚钱机会顾客还抱怨。这背后是蔬菜类商品几个核心的“魔鬼属性”在作祟极短的保质期高损耗、剧烈的价格波动、高度不确定的需求。把这个问题抽象出来就是2023年高教社杯国赛数学建模C题的核心。它不是一个纯理论的数学游戏而是零售行业尤其是生鲜零售每天都在面对的真实经营痛点。题目要求我们建立数学模型实现蔬菜类商品的自动定价与补货决策。听起来很“智能”很“高大上”但内核其实非常接地气如何用数学和算法的力量去对抗蔬菜经营中的不确定性实现利润最大化或损耗最小化。为什么说它是“硬骨头”因为它完美地融合了多个领域的知识需求预测明天会有多少人来买西红柿这受到天气、节假日、竞争对手促销、甚至社交媒体热点比如某个减肥食谱火了的影响。你需要时间序列分析、回归模型甚至机器学习。库存管理经典的报童问题Newsboy Problem在这里有了“生鲜版”。但比报童问题更复杂的是蔬菜的损耗不是简单的“未卖出即损失”而是一个随时间加速腐烂的过程其残值如打折处理也在动态变化。动态定价价格不是一成不变的。根据当前的库存水平、新鲜度、竞品价格、需求预测动态调整价格是清理库存、提升利润的关键。这涉及到收益管理Revenue Management和博弈论的思想。数据耦合定价决策影响需求需求影响库存库存状态又反过来影响定价策略。这三个环节是强耦合的不能孤立看待。你需要建立一个联合决策模型。所以这道题的价值在于它逼着我们从“凭经验、拍脑袋”的传统经营模式转向“数据驱动、模型优化”的科学决策模式。接下来我将以一个虚拟的“每日鲜”社区超市为背景带你一步步拆解这道题的解题思路、模型构建、算法实现以及那些容易踩进去的“坑”。2. 问题拆解与核心假设把现实世界“框”进数学模型面对一个复杂的现实问题第一步不是急着写公式而是定义边界和做出合理假设。这是建模成功的基础也是阅卷老师重点看的地方。假设不合理后面模型再精巧也是空中楼阁。2.1 明确决策目标与约束条件题目要求是“自动定价与补货决策”我们需要将其转化为明确的数学目标。核心决策目标在一定的规划周期内例如一周使得总利润最大化。总利润 总收入 - 总成本。总收入来源于所有售出商品的销售额。总成本主要包括采购成本、库存持有成本如冷电费、仓储费、以及最重要的——损耗成本商品腐败无法销售造成的损失。核心决策变量补货决策每天/每个补货周期每种蔬菜的进货量是多少记为 ( Q_i(t) )i代表商品t代表时间定价决策每天/每个销售时段每种蔬菜的销售价格是多少记为 ( P_i(t) )主要约束条件库存动态平衡这是最核心的约束。今天的期末库存 昨天的期末库存 今天的进货量 - 今天的销售量。销售量又由价格和需求决定。 [ I_i(t) I_i(t-1) Q_i(t) - S_i(P_i(t), t) ] 其中 ( S_i ) 是需求函数。库存容量限制超市的冷柜、货架空间有限总库存不能超过上限。采购限制供应商可能有最小起订量、最大供应量或者采购资金有限。非负约束进货量、库存量、价格均为非负。价格变动范围价格不能无限高或无限低需在合理市场区间内。2.2 建立关键子模型需求、损耗与定价响应这是模型的血肉部分。我们需要用数学公式来描述蔬菜销售中的几个关键行为。2.2.1 需求函数模型需求量不是固定的它主要受自身价格影响也可能受其他因素如时间、新鲜度影响。最常用的是线性需求函数和指数型需求函数。线性需求模型( D_i(t) a_i - b_i * P_i(t) \epsilon )。其中 ( a_i ) 是潜在最大需求( b_i ) 是价格弹性系数( \epsilon ) 是随机误差项代表不确定性。这个模型简单直观易于处理。指数需求模型( D_i(t) A_i * \exp(-\lambda_i * P_i(t)) )。这更能反映价格敏感度即价格小幅上涨可能导致需求大幅下降。实操建议在国赛有限时间内推荐使用线性模型。你可以通过附件中的历史销售数据利用线性回归拟合出每种蔬菜的大致 ( a_i ) 和 ( b_i )。记得在论文中说明你考虑了随机误差 ( \epsilon )并可以假设其服从正态分布 ( N(0, \sigma^2) )以体现不确定性。2.2.2 损耗腐败模型蔬菜的新鲜度随时间下降其可售性和价值也随之下降。这是一个时间与库存双重依赖的过程。思路一有效库存折损。定义一个新鲜度因子 ( \alpha(t) )它是库存天数的函数。例如进货当天 ( \alpha1 )第二天 ( \alpha0.8 )第三天 ( \alpha0.5 )之后为0。那么实际可售出的量是理论需求与有效库存的较小值。未售出的部分按残值如 ( \alpha * 成本价 )计算回收价值或直接计为损耗。思路二需求衰减。新鲜度影响需求本身。可以将新鲜度因子引入需求函数( D_i(t) \alpha(I_i, t) * (a_i - b_i*P_i(t)) )。库存越久、新鲜度越差即使价格低需求也会萎缩。关键点你必须明确区分“物理损耗”完全腐败和“经济损耗”因不新鲜被迫降价。在模型中通常用一个随时间增长而增加的损耗率( \beta(t) ) 来表示。例如第t天库存中会有 ( \beta(t) * I_i(t-1) ) 的商品腐败必须丢弃。2.2.3 定价与需求的互动——收益函数知道了需求函数我们就可以写出单日单品的收益函数 [ R_i(t) P_i(t) * \min(D_i(P_i(t)), \text{有效库存}_i(t)) - \text{成本与损耗} ] 我们的定价目标就是找到那个使这个收益或长期总收益最大的 ( P_i(t) )。这本质上是一个条件优化问题在给定库存和需求函数的情况下寻找最优价格。2.3 做出你的合理假设基于“每日鲜”社区超市的场景我们可以做出如下假设让模型可解需求独立性假设每种蔬菜的需求仅受自身价格影响暂不考虑蔬菜间的替代或互补效应如西红柿涨价导致黄瓜需求增加。这能极大简化模型。在灵敏度分析中可以讨论此假设的影响。即时补货假设每天营业前完成补货补货立即到货不影响当天销售。这符合多数日配蔬菜的实际情况。固定采购成本每次采购的单价是固定的不考虑量大批发折扣。运输等费用折算在单价内。信息完全假设我们拥有完整的历史销售数据并能基于此做出预测。实际上这是模型生效的前提。规划周期假设以一周7天为一个决策周期周末需求模式可能与工作日不同。注意所有假设必须在论文中清晰列出并说明其合理性。这是建模规范性的重要体现。3. 模型构建搭建一个动态决策的“数字大脑”有了清晰的子模型和假设我们现在可以把它们组装起来形成一个完整的联合优化模型。我推荐采用两阶段建模框架逻辑清晰且便于求解。3.1 第一阶段基于历史数据的参数估计与需求预测在真正做决策之前我们需要用历史数据“训练”我们的模型。3.1.1 数据预处理附件中的数据通常包含日期、商品编码、销售量、销售单价、进货量、库存结余等。你首先要做清洗数据处理缺失值、异常值如销售量大于库存进货量。数据聚合按天、按商品汇总数据。特征工程生成可能影响需求的特征如星期几Weekday、是否为节假日、前几天的销量滞后项、平均温度如果数据中有或可外部获取等。3.1.2 需求函数拟合对每一种重点蔬菜或分类后的品类使用线性回归。因变量 ( Y )日销售量。自变量 ( X )当日销售价格、星期几哑变量、节假日哑变量等。拟合方程( Y \beta_0 \beta_1 * Price \beta_2 * IsWeekend ... \epsilon )得到的 ( \beta_1 ) 即为价格弹性系数 ( b_i ) 的负值估计。( \beta_0 ) 等构成了基础需求 ( a_i ) 的估计。3.1.3 损耗率估计分析历史数据中“库存结余”非正常减少非销售所致的部分。可以计算 平均日损耗率 期初库存 进货量 - 销售量 - 期末库存 / 期初库存 观察损耗率是否随库存天数增加而上升尝试拟合一个简单的线性或指数增长函数 ( \beta(t) \gamma_0 \gamma_1 * t )。3.2 第二阶段建立动态规划优化模型这是模型的核心。我们将未来一周的决策看作一个多阶段决策过程适合用动态规划DP或模型预测控制MPC的思想来求解。3.2.1 状态变量、决策变量与状态转移方程状态变量 ( S_t )在每天开始时系统的状态就是各种蔬菜的库存量向量即 ( S_t [I_1(t), I_2(t), ..., I_n(t)] )。决策变量 ( u_t )每天要做的两个决策进货量向量 ( Q_t ) 和销售价格向量 ( P_t )。状态转移方程描述状态如何随决策和时间演变。这就是我们前面提到的库存平衡方程但需要融入损耗。 [ I_i(t1) [I_i(t) Q_i(t) - S_i(P_i(t), t)] * (1 - \beta_i(t)) ] 其中 ( S_i ) 是由需求函数和库存共同决定的实际销售量( \beta_i(t) ) 是损耗率函数。* (1 - \beta_i(t))表示剩下的库存经过一天后因腐败又损失了一部分。3.2.2 即时收益函数每天在状态 ( S_t ) 下采取决策 ( u_t (Q_t, P_t) ) 后获得的即时收益 ( r_t ) 为 [ r_t \sum_{i1}^{n} [P_i(t) * S_i(P_i(t), t) - C_i * Q_i(t) - h * I_i(t1)] ] 解释( P_i(t) * S_i(...) )销售收入。( C_i * Q_i(t) )采购成本。( h * I_i(t1) )库存持有成本h是单位库存持有成本系数这部分有时可省略或合并到损耗中。3.2.3 优化目标与贝尔曼方程我们的目标是最大化从第一天到规划期末第T天的总期望收益。这可以表述为 [ \max E[\sum_{t1}^{T} r_t(S_t, u_t)] ] 根据贝尔曼最优性原理我们可以从最后一天倒推回来定义最优价值函数 ( V_t(S_t) ) 表示从第t天状态 ( S_t ) 开始到期末能获得的最大期望收益。 [ V_t(S_t) \max_{u_t} { r_t(S_t, u_t) E[V_{t1}(S_{t1})] } ] 边界条件( V_{T1}(S_{T1}) 0 )规划期结束后库存残值可另行处理或假设为0。这个方程就是我们的核心模型。它说今天的最优决策不仅要看今天的即时收益还要考虑这个决策对明天状态的影响以及未来可能获得的最大收益。3.3 模型求解的挑战与实用化简化直接求解这个高维度的随机动态规划问题是“维数灾难”计算不可行。因此我们必须做实用化简化。3.3.1 解耦与启发式策略一个强大的简化思想是“解耦”。既然所有商品通过库存容量和资金耦合在一起我们可以尝试先忽略耦合为每种商品单独求解再通过迭代或协调来处理耦合约束。单商品报童模型扩展对每种蔬菜将其视为一个独立的、带价格决策的报童问题。每天根据当前库存和需求预测计算一个“最优基库存水平”和“最优价格”。补货量就是使库存达到这个基库存水平的量。这需要求解一个带价格决策的 ((s, S)) 或 ((R, Q)) 策略。迭代协调对所有商品单独求解后检查总库存或总采购金额是否超限。如果超限则通过拉格朗日乘子法或边际成本分析调整各商品的补货优先级例如优先满足毛利率高、周转快的商品进行迭代直到满足约束。3.3.2 模型预测控制MPC——推荐方法MPC是处理这类问题的工业界标准方法特别适合国赛。原理在每个决策点每天早晨我们并不求解整个T天的复杂问题。而是只对未来一个较短的“预测时域”例如未来3天进行详细优化只执行第一天的决策。到了第二天根据新的实际库存和销售数据重新预测未来3天再次优化并执行新第一天的决策。如此滚动进行。优势反馈校正能及时根据实际销售误差调整策略鲁棒性强。计算可行每次只优化未来几步问题规模小。易于处理约束在短时域内处理库存容量等约束更直接。在本题中的实现每天早晨获取当前库存 ( S_t )。基于历史数据预测未来N天如3天每种蔬菜的需求函数考虑星期效应。建立一个以未来N天为周期的确定性优化模型暂时忽略随机性决策变量是未来N天每天的进货量和价格。求解这个N期优化问题得到最优决策序列 ( {u_t, u_{t1}, ..., u_{tN-1}} )。只执行第一天的决策 ( u_t )即今天的补货量和定价。第二天重复步骤1-5。这个短时域的优化模型本身就是一个非线性规划或混合整数规划问题如果考虑固定订货成本可以用MATLAB的fmincon函数或LINGO等工具求解。4. 求解、验证与论文呈现从模型到高分答卷模型建立后求解和论文写作是临门一脚。这里有很多技巧和坑。4.1 求解算法与工具选择4.1.1 针对MPC短时域优化模型的求解工具MATLAB Optimization Toolbox 是国赛标配。fmincon函数可以处理有约束的非线性规划。关键步骤定义目标函数编写一个函数文件输入是决策变量向量包含了未来几天所有商品的Q和P输出是负的总利润因为fmincon默认求最小化。定义约束编写另一个函数文件或使用矩阵形式定义线性/非线性约束如库存非负、库存上限、价格范围等。设置初始值好的初始值能加速收敛。可以用前一天的价格作为价格初始值用需求预测值作为补货量的初始估计。调用求解器[x, fval] fmincon(objfun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)可能遇到的困难与调参不收敛检查目标函数和约束的梯度是否连续。尝试不同的初始点x0。调整求解器选项如增大最大迭代次数MaxIterations 减小函数容差FunctionTolerance。陷入局部最优使用多初始点搜索MultiStart或全局优化工具箱的GlobalSearch。决策变量过多如果商品种类很多可以按品类聚类叶菜类、茄果类等减少变量维度。4.1.2 仿真验证——构建“模拟超市”模型好不好必须拉出来溜溜。你需要编写一个仿真程序。输入你的决策模型MPC控制器、历史数据或生成的需求数据加入随机扰动、初始库存。流程用for循环模拟每一天。仿真器生成当天的“真实”随机需求比模型预测多一个随机噪声。将当前库存状态输入你的MPC决策模型模型输出今天的补货量和定价。仿真器根据定价和“真实”需求计算实际销量、更新库存、计算损耗和当日利润。进入下一天。输出整个模拟周期的总利润、平均库存周转率、平均损耗率等KPI。对比基准必须设置对比基准例如固定价格、固定补货量策略这是最原始的“经验”策略。仅优化补货价格固定策略。仅优化价格补货量固定策略。 通过对比才能凸显你“联合优化”模型的价值。图表要用起来比如画出利润对比柱状图、库存水平变化曲线图。4.2 论文写作的核心要点与避坑指南国赛论文是成果的最终载体其重要性不亚于模型本身。4.2.1 摘要——决定生死的400字摘要必须独立成篇讲一个完整的故事。结构建议问题重述1句针对C题研究蔬菜自动定价与补货决策。总体思路2-3句采用“数据驱动预测滚动优化决策”的框架。先利用历史数据拟合需求与损耗参数再建立以利润最大化为目标的动态优化模型并采用模型预测控制MPC进行滚动求解。具体模型与方法3-4句建立了融合库存动态、价格弹性需求和非线性损耗的状态转移方程针对高维求解难题提出了基于MPC的滚动优化求解策略并设计了单商品解耦协调算法处理资源约束。求解与仿真2句利用MATLAB的fmincon进行局部优化并构建了离散事件仿真系统对策略进行验证。主要结论2句仿真表明相较于基准策略本模型能将平均利润提升X%损耗率降低Y%。模型具有较强的鲁棒性和实用性。关键词数学建模收益管理动态规划模型预测控制生鲜供应链。4.2.2 模型建立部分——逻辑清晰公式规范小节安排按“问题分析 - 假设与符号说明 - 需求预测模型 - 损耗模型 - 联合优化模型 - 求解策略MPC与简化”的顺序展开。公式编辑务必使用MathType或LaTeX公式编辑器确保公式编号连续、引用准确。重要公式单独成行。图表辅助画一个模型框架图用Visio或PPT画一个流程图展示“数据输入 - 参数估计 - MPC滚动优化 - 决策输出 - 仿真反馈”的完整闭环这能让评委一眼看懂你的逻辑。4.2.3 模型求解与结果分析——用数据说话参数设定要合理采购成本、持有成本系数等要给出设定依据如参考行业报告或简单估算。价格弹性系数等核心参数必须展示从历史数据中拟合的结果附上回归结果截图或表格。仿真结果要丰富主效果图展示整个仿真周期内某代表性商品如西红柿的库存水平、价格、销量的动态变化曲线。三条曲线放在同一个时间轴下直观展示模型的联动决策。对比表格制作一个清晰的表格对比不同策略下的总利润、平均库存、损耗率、服务水平需求满足率等指标。灵敏度分析这是拿高分的关键分析模型对关键参数的敏感性。例如需求预测误差的影响人为增大仿真中“真实需求”的随机扰动观察利润下降的幅度说明模型的鲁棒性。价格弹性系数的影响改变b值看最优价格和总利润如何变化。损耗率的影响如果损耗加速模型是否会提前降价促销验证模型的逻辑是否符合直觉。分析要深入不要只说“利润提高了”要说“利润提高了主要是因为模型在库存较高时及时降低了价格加速了周转减少了后期腐败损失”将数字结果与模型机理联系起来。4.2.4 那些容易丢分的“坑”忽略不确定性只做确定性优化。必须在模型中或分析中提及随机性无论是通过随机仿真还是在MPC中采用鲁棒优化或随机规划的思想。模型与求解“两张皮”建立了一个复杂的随机动态规划模型但求解时完全用了另一套简单的启发式方法且没有说明二者之间的联系。你必须解释你的求解方法如MPC是如何近似解决你所建立的复杂模型的。缺乏对比和基准没有对比就无法证明你的模型好。固定策略就是最好的基准。灵敏度分析流于形式只做了参数变动没有深入分析变动背后的业务含义和模型响应的合理性。论文像实验报告通篇“我们做了A然后做了B”缺乏一条贯穿始终的逻辑主线。你的主线应该是“发现问题 - 分析核心矛盾 - 建立模型刻画矛盾 - 设计算法解决矛盾 - 验证效果并分析”。这道C题是一个经典的运筹学/管理科学问题它考察的不仅仅是你对某些特定算法的掌握更是你将模糊现实抽象为清晰数学模型的能力、对多种数学工具的综合运用能力、以及通过编程和仿真将理论落地的实践能力。从菜市场的烟火气到屏幕上的代码与公式这正是数学建模的魅力所在。