资讯动态

数学建模实战:从需求预测到优化求解的自动定价与补货决策

发布时间:2026/8/22 7:43:01 来源:尧图企业网站定制
1. 从“初步想法”到“可行方案”一次数学建模竞赛的实战复盘又到了一年一度的高教社杯数学建模竞赛季看着新一届的参赛者们开始为选题和思路发愁我不禁想起了自己带队参加2023年国赛的经历。那一年我们团队最终选择了C题一个关于“蔬菜类商品的自动定价与补货决策”的问题。现在回头看从拿到题目时脑子里那些零散的“初步想法”到最终形成一份逻辑严密、可执行的论文方案中间走过的弯路、踩过的坑远比最后那个漂亮的模型本身更有价值。今天我就以那次参赛的C题为例抛开那些高大上的理论框架纯粹从一个“过来人”的视角复盘一下我们是如何把一个抽象的“初步想法”一步步打磨成具体、可落地的“建模方案”的。这个过程对于任何正在备战数学建模尤其是面对优化类、数据分析类题目的同学来说或许能提供一些不一样的思路。数学建模竞赛尤其是国赛这种级别的比赛从来不是比谁的模型最高深、算法最前沿。它的核心是用数学语言清晰定义现实问题并给出一个在给定约束下“足够好”的解决方案。很多新手队伍容易陷入两个极端要么被海量数据和复杂背景吓住迟迟不敢下笔要么头脑风暴出一堆天马行空的想法却无法落地。我们团队最初也在这两者之间摇摆。C题描述了一个生鲜商超的运营场景给出了过去四年的销售流水、批发价格、损耗率等数据要求我们设计自动定价和补货模型。乍一看关键词很明确自动定价、补货决策、销售预测、优化。但具体怎么做从哪儿入手这就是“初步想法”需要回答的问题。2. 破题第一步剥离表象定义核心决策变量与目标面对一个案例背景丰富的题目第一步绝不是急着去翻书找“高级算法”而是要做“翻译”工作——把一段段充满业务细节的文字描述翻译成数学建模中最基本的元素决策变量、目标函数和约束条件。这是我们团队在多次讨论后达成的第一个共识也是我认为最重要的一步。2.1 决策变量是什么从业务动作到数学符号题目要求“自动定价”和“补货决策”。这听起来是两个动作但在数学上它们对应着什么定价决策变量最直接的想法是为每一种商品、在每一个销售日甚至每一天中的不同时段设定一个价格。但这立刻带来维度灾难商品种类多时间跨度长变量数量爆炸。我们的“初步想法”在这里进行了第一次收敛价格不是完全自由的。它受到进货成本批发价、市场常规售价、以及“打折”幅度的影响。因此我们决定将决策变量定义为每种商品每日的折扣率或加价率。例如以成本价为基准定义一个浮动系数。这样变量含义清晰且天然包含了“售价不能低于成本”这样的业务约束。补货决策变量这更直观就是每种商品每日的补货量。但这里隐藏了一个关键补货不是即时完成的有提前期。今天下的订单可能后天才能到货。因此决策变量实际上应该是“订货量”而“到货量”会成为约束条件的一部分。我们一开始忽略了提前期在模型初步运行时发现库存逻辑完全对不上这是第一个坑。注意定义决策变量时一定要考虑其可控性和可观测性。在这个题目中我们可以决定“订多少货”、“打几折”但我们无法直接决定“能卖出去多少”销量是一个需要预测的、受价格影响的结果。混淆“决策变量”和“结果变量”是新手常见错误。2.2 目标函数是什么利润最大化不是唯一答案“商超要盈利”所以目标自然是最大化利润。这看起来毋庸置疑。但利润怎么算我们列出了一个基本公式总利润 销售收入 - 采购成本 - 损耗成本然而仅仅这样够吗我们审视了题目背景和附件数据发现了一些细节损耗数据是给定的并且与商品保鲜期和销量高度相关。这意味着如果补货太多、定价不合适导致卖得慢损耗成本会急剧上升。题目提到了“销售总量”和“市场份额”等字眼。这意味着单纯追求单日利润最大化可能导致定价过高、销量锐减从长期看并不健康。因此我们的目标函数从“单日利润最大化”演变为一个多期如一周的总利润最大化问题并且在目标函数中显式地加入了对损耗成本的惩罚项。更进一步我们甚至讨论过是否要建立一个双目标模型在利润和销量或市场份额之间寻找帕累托最优解。但考虑到竞赛时间和模型的复杂性我们最终选择将“维持一定销量规模”作为约束条件来处理例如要求每日销量不低于历史同期均值的某个比例。这个从“单一目标”到“带约束的复合目标”的思考过程是模型贴合实际的关键。2.3 约束条件从哪里来从业务常识和数据中挖掘约束条件是将天马行空的模型拉回现实的缰绳。它们主要来自两方面业务逻辑与常识售价约束售价 ≥ 成本价否则亏本售价 ≤ 市场常规价否则毫无竞争力。库存动态平衡这是一个核心约束形式为今日末库存 昨日末库存 今日到货量 - 今日销售量。这里“今日销售量”需要由需求预测模型给出。库存容量约束总库存不能超过仓库容量题目虽未明确给出但可作为假设提出体现模型完整性。非负与整数约束补货量是非负整数价格是非负实数。附件数据揭示的规律我们通过分析历史销售数据发现了明显的季节性和周期性如周末效应。因此在需求预测模型中必须引入这些作为影响因素。损耗率数据显示某些商品在特定季节损耗极高。这提示我们在模型中不同商品、不同时期的损耗成本系数应该是不同的而不是一个固定值。将以上三点变量、目标、约束梳理清楚并用数学公式清晰地表达出来一个模型的骨架就立住了。这比一上来就讨论“我们用神经网络还是时间序列”要有用得多。3. 模型构建的核心需求预测与优化求解的耦合骨架有了需要填充血肉。对于C题血肉就是两个核心子模型需求预测模型和优化决策模型。它们的关系不是串联而是耦合的这是本题的难点也是我们“初步想法”演进最深的地方。3.1 需求预测模型价格是核心输入变量销量需求受什么影响历史销量、季节、节假日、促销活动……以及价格。在本题中价格恰恰是我们需要决策的变量。这意味着我们不能用一个基于历史固定价格训练好的预测模型直接套用到未来变化的价格上。我们尝试了几种思路思路一价格弹性模型。这是最经典的经济学方法。我们先利用历史数据拟合出每种商品的需求价格弹性系数。假设需求函数形式为Q a * P^e或线性形式Q a - b*P其中e是弹性系数。这样给定一个决策价格P就能立刻得到预测销量Q。这个方法简洁明了物理意义清晰非常适合嵌入优化模型。我们最终采用了这个方法的变体。思路二机器学习特征工程。将“价格”作为一个特征连同历史销量、星期几、月份等特征一起训练一个预测模型如XGBoost、LightGBM。但在优化时问题来了优化算法需要反复试探不同的价格P每次都要调用这个机器学习模型来预测Q计算开销巨大且模型可能是黑箱不利于优化求解。我们初步尝试后放弃了这条路。思路三模拟与仿真。构建一个基于智能体Agent的仿真环境模拟顾客对不同价格的反应。这想法很酷但对于三天竞赛来说开发成本和不确定性都太高属于“屠龙之术”果断舍弃。实操心得在有限时间的竞赛中模型的简洁性与可解释性往往比绝对的预测精度更重要。一个带有价格弹性项的简单线性或乘幂模型虽然可能牺牲一些精度但它能无缝嵌入后续的优化框架整个模型的逻辑链条非常清晰这恰恰是评委看重的地方。我们花了大量时间对比不同预测模型的RMSE均方根误差后来才醒悟在耦合优化中一个误差稍大但稳定、可微的模型远比一个精度高但不可微、难调用的黑箱模型实用。3.2 优化决策模型将预测模型作为约束嵌入当需求预测模型可以表达为Q f(P, 其他因素)后它就不再是一个独立的模块而是优化模型的一个约束条件。整个问题可以抽象为如下形式决策变量P_i_t(商品i在t日的价格)Order_i_t(商品i在t日的订货量)目标函数最大化∑_t (∑_i (P_i_t * Q_i_t - Cost_i_t * Order_i_t - Loss_i_t))总利润约束条件Q_i_t f(P_i_t, X_t)// 需求预测约束X_t代表季节等因素Inventory_i_t Inventory_i_{t-1} Delivery_i_t - Q_i_t// 库存平衡约束P_min P_i_t P_max// 价格上下限约束Order_i_t 0 且为整数// 补货量约束Loss_i_t g(Inventory_i_t, ...)// 损耗成本计算约束其中Delivery_i_t到货量是Order_i_{t-L}的函数L为提前期。这样一来一个复杂的现实问题就被转化成了一个可能带有整数变量和非线性约束的数学规划问题。接下来的任务就是求解它。3.3 求解策略精确解与启发式算法的权衡面对这样一个模型我们首先考虑的是用现成的优化求解器如MATLAB的fmincon处理非线性规划或intlinprog处理混合整数线性规划或者Python的PuLP、SciPy。但我们的模型因为价格弹性项的存在目标函数和约束可能是非线性的且含有整数变量补货量这属于混合整数非线性规划MINLP求解难度很大很可能无法在有限时间内得到全局最优解。我们的策略是分解与简化时间解耦虽然模型是多期的但我们采用“滚动时域优化”策略。即每次只优化未来N天例如3天的决策只执行第一天的决策然后时间推进一天基于新的库存和价格状态重新优化下一个N天。这大大降低了单次优化问题的规模。变量松弛先将补货量的整数约束放松为连续变量用非线性规划求解器求出一个连续解。然后再对这个连续解进行取整处理。虽然这会损失一些最优性但在实际业务中补货量取整是完全可以接受的并且能极大提高求解速度。启发式搜索对于关键商品我们也尝试了简单的启发式算法如模拟退火SA或遗传算法GA来直接搜索定价和补货量的组合。这些算法不要求模型可微能处理整数约束适合作为对比验证方案。最终我们提交的论文中核心方案是基于价格弹性模型和滚动时域优化框架并用松弛后的非线性规划求解器获得基准解。同时在附录中我们展示了启发式算法的对比结果以证明方案的鲁棒性。4. 数据预处理与结果分析的魔鬼细节模型再漂亮没有扎实的数据处理和可信的结果分析也是空中楼阁。这部分工作枯燥但至关重要往往决定了论文的下限。4.1 数据清洗应对现实数据的混乱组委会提供的数据通常是“脏”的。C题的销售流水数据就存在缺失值某些日期的某些商品没有销售记录。这可能是真的没卖出销量为0也可能是数据遗漏。我们需要根据上下文判断。对于常规商品如果前后几天都有销售唯独中间一天缺失我们倾向于用前后均值插补或设为0。对于促销商品则要结合促销日期表来判断。异常值某天某个商品的销量突然是平时的一百倍。这可能是“团购”或“数据录入错误”。我们不能简单删除因为可能是真实的促销高峰。我们的做法是结合批发价数据如果当天有异常低的进货价则可能是促销和损耗数据大量销售后损耗是否异常进行交叉验证。对于无法合理解释的极端值我们采用盖帽法用99%分位数替换进行处理并在论文中说明。数据一致性销售流水、批发价、损耗率三个表格其商品编码、日期范围是否完全对应我们发现了部分商品编码在不同表格中不一致的情况这需要通过商品名称进行匹配和清洗。踩坑实录我们最初没有仔细检查数据的一致性直接按商品ID进行关联导致大约5%的数据匹配错误使得后续预测模型出现了系统性偏差。直到我们画出每种商品的销量-价格散点图发现一些点完全不符合常理价格极高还有大量销量才回溯发现了这个问题。教训是在建模前必须花时间做探索性数据分析EDA画图观察每个关键变量的分布和关系这是发现数据问题最有效的方法。4.2 结果可视化与灵敏度分析让结论自己说话模型跑出结果后不能只扔出一堆数字。评委和读者需要直观地看到你的方案“好在哪里”。可视化我们绘制了核心商品的价格-销量-库存-利润时序联动图。一张图上四条曲线可以清晰展示我们的模型如何动态调整价格在成本线上波动来平衡销量和库存从而平滑利润曲线。我们还绘制了优化方案与简单基准策略如固定价格、固定补货量的利润对比柱状图优劣一目了然。灵敏度分析这是体现模型深度和思考全面性的关键。我们主要分析了两个参数的灵敏度价格弹性系数如果我们对历史数据拟合得到的弹性系数有±10%的误差对最终的总利润影响有多大我们通过控制变量法进行了测试结果发现利润波动在5%以内说明我们的模型对该参数不特别敏感结论较为稳健。损耗成本系数我们假设了不同的损耗成本计算方式如线性、二次函数观察对最优补货策略的影响。发现当损耗成本显著增加时模型会倾向于更频繁、更小批量的补货即转向“精益库存”模式这完全符合商业直觉。这些分析不仅增强了论文的说服力也展示了我们队对问题理解的深度——我们知道模型的弱点在哪里以及它在什么条件下仍然有效。5. 论文写作与团队协作的实战经验三天时间最终交付物是一篇论文。写作不是最后一天才开始的“翻译”工作而是贯穿始终的“设计”工作。5.1 论文结构规划像讲故事一样推进国赛论文有相对固定的结构摘要、问题重述、模型假设、符号说明、模型建立与求解、结果分析、模型评价与推广、参考文献、附录但内在逻辑需要像讲故事一样流畅。摘要这是重中之重需独立撰写反复打磨。要用最精炼的语言说清楚针对什么问题、建立了什么模型、用了什么方法、得到了什么结果、有什么特色和结论。我们采用“问题-模型-方法-结果-结论”的五段式确保评委在2分钟内抓住所有亮点。问题重述与分析不是照抄题目而是用自己的话提炼出问题的本质、难点和解决思路。这里就可以引出我们的核心思路将问题分解为需求预测和优化决策两个耦合的子问题。模型建立这是论文的主体。我们按照“总-分”结构来写先给出整个优化模型的完整数学表述2.2节中提到的决策变量、目标、约束让评委看到全局。然后再分小节详细解释每一个子模型如需求预测子模型、库存动态子模型、损耗计算子模型是如何构建和推导的。公式要编号重要变量要在符号说明表中列出。模型求解详细说明求解算法、软件工具我们用了MATLAB的fmincon和自行编写的滚动优化脚本、以及遇到的困难和解决方案如整数约束的松弛处理。流程图在这里非常有用。结果分析展示核心图表并配以详细的文字说明解释图中每一个拐点、峰值代表的业务含义。结合灵敏度分析讨论模型的稳健性。5.2 团队协作与时间管理三天的高效节奏三个人三天几乎不眠不休合理的分工至关重要。我们队采用的是“动态角色阶段主攻”的模式第一天上午-中午所有人一起读题、讨论、查资料、头脑风暴确定核心思路和模型框架。这个过程必须充分避免中途大改。第一天下午- 第二天全天建模手主攻模型公式的细化、推导以及求解算法的设计。编程手主攻数据清洗、算法实现、模型求解和初步结果输出。写手开始撰写论文的“问题重述”、“模型假设”、“符号说明”等前期部分并同步绘制模型框架图、流程图。关键三人必须保持高频沟通。编程手遇到数据问题立刻反馈建模手调整模型立刻同步写手对任何部分有疑问立刻提出。我们使用在线文档如腾讯文档实时协作撰写论文草稿。第三天上午-下午编程手输出最终结果和图表。建模手和写手一起基于结果撰写“模型求解”、“结果分析”、“模型评价”等核心部分。写手负责统稿确保语言流畅、格式一致。第三天晚上所有人集中精力打磨摘要、检查全文、调整格式、生成最终PDF。摘要必须三人一起字斟句酌。个人体会最有效的协作工具就是一个共享的在线文档和一个能随时语音的会议房间。避免各自为战每天至少开三次短会同步进度。另外一定要有人通常是写手尽早开始写论文不要等模型全部跑通再动笔。写作是整理思路的过程能暴露出逻辑上的漏洞。回顾2023年C题的整个历程从面对“自动定价与补货”这个庞大命题时的茫然到最终形成一篇结构完整、逻辑自洽的论文最大的收获不是某个数学公式或算法而是一套解决问题的结构化思维方法定义问题、分解问题、构建模型、处理数据、求解验证、表达呈现。这套方法不仅适用于数学建模竞赛对于日后解决任何复杂的工程或商业问题都有着巨大的价值。数学建模本质上是一次思维的极限训练。希望这篇基于真实战斗的复盘能为你即将开始的征程提供一些切实的弹药和地图。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价