news 2026/8/17 14:54:06

数学建模竞赛实战:需求预测与随机规划优化供应链决策

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数学建模竞赛实战:需求预测与随机规划优化供应链决策

1. 赛题核心与破题思路

2021年的全国大学生数学建模竞赛C题,题目是“生产企业原材料的订购与运输”。这题一出来,很多队伍都懵了,感觉像是个供应链管理或者运筹学的题目,但又和传统的模型不太一样。我当时带队的感受是,这道题表面上考的是数学建模,实际上是在考察我们如何将一个复杂的、信息不全的实际商业问题,转化成一个可量化、可求解的数学模型的能力。它不像一些物理题或者微分方程题有明确的公式可以套,更像是在模拟一个企业供应链部门经理每天要面对的真实决策场景:手里有一堆历史数据,未来充满不确定性,你得制定一个既不让生产线断粮,又尽量别把太多钱压在库存上的采购计划。

这道题的核心矛盾非常清晰:在需求不确定和供应商供应能力随机波动的双重约束下,如何制定成本最优的原材料订购与运输方案。这里的成本是一个综合概念,包括采购成本、库存持有成本,以及潜在的缺货导致的停产损失(虽然题目没明说,但我们必须考虑)。很多新手队伍容易犯的错误是,一上来就试图建立一个超级复杂的、包含所有现实因素的模型,结果要么无从下手,要么求解不出来。我们的破题思路是“分而治之,逐步迭代”。

首先,我们把整个问题拆解成三个环环相扣的子问题:

  1. 需求预测问题:根据过去五年的订货量数据,预测未来24周(即两个半年)每周的需求量。这是所有决策的基础,预测准了,后面就成功了一半。
  2. 订购策略问题:在预测需求的基础上,考虑供应商的供应可靠性(有历史数据),决定每周向哪些供应商订购多少原材料。这里要权衡的是,多找几家供应商可以分散风险,但可能增加管理成本或无法享受单一供应商的量大优惠;只盯着一两家,万一它“掉链子”就麻烦了。
  3. 运输策略问题:确定了订购量,还要决定怎么运。题目给了运输费的折扣表,运得越多单价越便宜,但一次性运太多又会导致库存积压,增加仓储成本。这就需要在运输的规模经济效益和库存成本之间找平衡。

我们的整体建模思路是建立一个多阶段决策优化模型。以周为单位,每一周都是一个决策阶段。在每一周开始时,我们根据当前的库存水平、对未来需求的预测、以及供应商的历史表现,做出本周的订购决策(向谁订、订多少)和运输决策(是否启动运输、运多少)。然后,本周的决策会影响下一周的初始库存状态,如此滚动进行下去。这种思路在学术上接近“随机动态规划”或“基于模拟的优化”,但对于数模竞赛,我们需要将其简化成可求解的形式。

2. 需求预测模型的构建与选择

需求预测是整个项目的基石。题目附件提供了过去五年(240周)的订货量数据。第一眼看去,数据有明显的季节性波动和趋势性。很多队伍会直接想到时间序列模型,比如ARIMA(自回归积分滑动平均模型)或者它的季节性版本SARIMA。这确实是一个标准思路,但直接套用存在风险。

2.1 数据特性分析与预处理

我们拿到数据的第一步不是急着跑模型,而是先画图观察。用Python的Matplotlib或者Excel,把240周的数据做成折线图,规律一目了然:

  • 长期趋势:整体需求量呈现缓慢的上升趋势,这说明市场可能处于成长期。
  • 季节性:每年内(约48周,题目以周为单位,一年按48周计)有明显的波动周期,通常在年中(第20-30周左右)和年末(第40-48周左右)会出现需求高峰。这很可能对应着行业的销售旺季或生产旺季。
  • 随机波动:除了趋势和季节,每周数据还有不规则的起伏,这就是我们需要用模型去捕捉或平滑的随机因素。

预处理的关键一步是检测并处理异常值。我们通过计算移动平均和标准差,发现历史数据中有几周的订货量远高于或低于趋势线。对于这些点,需要判断是真正的需求爆发(如突发大订单)还是数据记录错误。在竞赛中,如果没有特别说明,我们通常采用相对保守的方式:用前后几周的均值进行平滑替换,而不是直接删除,以避免人为改变数据分布。

2.2 预测模型选型与实战

我们对比测试了三种模型:

  1. 经典分解法:将时间序列分解为趋势(Trend)、季节性(Seasonality)和残差(Residual)三部分。这种方法非常直观,可以通过移动平均法提取趋势和季节成分。预测时,将未来时期的趋势项和季节项相加即可。它的优点是原理简单,结果易于解释,适合作为基线模型。
  2. Holt-Winters三指数平滑法:这是处理趋势和季节性时间序列的经典方法。它包含水平、趋势和季节三个平滑方程。我们使用了加法模型(因为季节性波动的幅度大致不随时间变化)。通过优化算法(如网格搜索)来寻找最优的平滑参数(α, β, γ)。它的优势在于模型轻量,预测速度快,对于中短期预测效果通常不错。
  3. SARIMA模型:这是更强大的统计模型。我们需要通过观察自相关图(ACF)和偏自相关图(PACF)来确定模型的参数(p,d,q)以及季节性参数(P,D,Q,s)。这个过程需要一定的经验。我们最终确定的模型是SARIMA(1,1,1)(1,1,0,48),表示经过了非季节性和季节性差分,并包含了自回归和移动平均项。

实操心得:模型融合提升鲁棒性单一模型总有局限性。我们的策略是“组合预测”。分别用Holt-Winters和SARIMA模型对未来24周进行预测,得到两个预测序列。然后,我们给这两个序列分配权重(例如,根据它们在历史数据上最近一段时间的预测误差来动态调整权重,误差小的权重大),进行加权平均,得到最终的预测需求。这样做的好处是,可以平滑掉单个模型的极端预测值,使最终结果更稳定。在实际编程中,我们用statsmodels库实现SARIMA,用statsmodels或自己编写实现Holt-Winters。

2.3 预测结果的不确定性量化

仅仅给出一个预测值是不够的,因为预测必然有误差。对于优化模型来说,了解预测的不确定性(即可能的误差范围)至关重要。我们为每周的预测需求生成了一个置信区间(例如95%置信区间)。在SARIMA模型中,这可以通过模型自身的预测误差方差来计算。对于Holt-Winters,则需要通过模拟或基于历史残差来估算。

在后续的订购模型中,我们不仅使用预测的中位数(或均值),还会考虑这个置信区间。例如,在制定安全库存时,我们会参考需求预测的上限,而不是中点值,以应对需求波动的风险。

3. 供应商订购策略:随机规划与鲁棒优化

有了需求预测,接下来就要解决“向谁买”的问题。附件提供了402家供应商过去240周的供货数据。这些数据揭示了一个关键现实:供应商的供应是随机的、不可靠的。每周供应商实际能提供的原材料数量,是一个围绕其“供货能力”波动的随机变量。

3.1 供应商画像与分类

我们不能对402家供应商一视同仁。第一步是给他们“画像”。我们计算了每个供应商的两个核心指标:

  • 平均供货率:历史周供货量的平均值。这代表了供应商的“产能规模”。
  • 供货稳定性(变异系数):用标准差除以平均值,这个值越小,说明供应商每周的供货量越稳定,越可靠。

根据这两个维度,我们可以把供应商大致分为四类:

  1. 明星供应商:高平均供货率、高稳定性。这是最优质的供应商,应该是我们合作的核心。
  2. 潜力供应商:高平均供货率,但稳定性一般。他们的产能大,但表现时好时坏,需要谨慎管理,比如可以作为核心供应商的补充。
  3. 稳定型小供应商:低平均供货率,但高稳定性。他们虽然量小,但贵在准时,适合用来填补一些固定的、小量的需求缺口。
  4. 问题供应商:低平均供货率、低稳定性。这类供应商风险最高,通常应避免合作或仅作为最后的选择。

这个分类为我们后续的供应商选择提供了直观的依据。

3.2 订购策略模型建立

我们的目标是制定未来24周,每周向每家供应商的订购量。这是一个典型的随机规划问题。因为未来的需求是预测的(有不确定性),供应商的供货也是随机的,我们的决策需要在不确定性中寻找成本最优解。

我们建立了一个两阶段随机规划模型的思想框架:

  • 第一阶段决策(“here-and-now”):在每周初,我们必须决定向各供应商的订购量。这个决策必须在观察到当周供应商的实际供货量和当周的实际需求之前做出。
  • 第二阶段决策(“wait-and-see”)/ 补偿决策:当本周结束后,供应商的实际供货量和工厂的实际需求都已知了。此时,可能会出现两种情况:1) 到货总量加原有库存,不足以满足本周生产需求,产生缺货;2) 到货太多,库存积压。模型的目标函数就是要最小化总期望成本,它包括:
    • 采购成本(与订购量有关)
    • 库存持有成本(与期末库存正相关)
    • 缺货惩罚成本(这是一个关键设定。题目没有明确缺货成本,但我们必须自己定义。我们将其设定为一个远高于库存成本的单位惩罚,比如设定为缺货量乘以一个大的惩罚系数,以模拟生产线停工带来的巨大损失)。

由于直接求解完整的随机规划模型非常复杂,我们采用了样本平均近似法。即,我们不再考虑供应商供货和需求的全部可能分布,而是基于历史数据,用蒙特卡洛方法模拟生成N个可能的未来情景(Scenario)。例如,每个情景就是一套未来24周,每周各个供应商的具体供货量和工厂的具体需求量的实现值。这样,随机规划就近似变成了一个大型的确定性线性规划问题:最小化在所有模拟情景下的平均总成本。

3.3 模型简化与启发式策略

即便做了SAA近似,决策变量(402家供应商 × 24周)依然巨大。我们进一步引入了启发式规则来简化:

  • 供应商选择集中化:基于之前的分类,我们只选择“明星供应商”和部分“稳定型小供应商”作为主要合作对象,将“问题供应商”剔除出考虑范围。这大大减少了决策变量。
  • (s, S)库存策略:对于主要供应商,我们采用经典的库存策略。设定一个库存下限s和一个上限S。每周初检查库存水平,如果低于s,则发起订购,将库存补充至S水平。这里的订购量分配给我们选定的核心供应商组合。我们需要优化s和S的值。
  • 安全库存动态调整:安全库存水平(s)不是固定的。它会根据未来几周的需求预测置信区间上界和供应商的联合供应可靠性动态调整。例如,如果预测到接下来是需求旺季,或者某核心供应商近期稳定性下降,我们就调高安全库存。

最终,我们的订购策略是一个混合策略:用优化模型(简化后的随机规划)计算出大致的每周总订购量和核心供应商分配比例,再用(s, S)策略和动态安全库存规则来生成每周具体的、可执行的订购指令。

4. 运输策略:规模经济与库存成本的权衡

原材料订购后,存放在供应商那里,需要运输回企业仓库。题目给出的运输成本函数是典型的分段折扣函数:运输量越大,单位运费越便宜。这诱导我们倾向于“凑满”一个高折扣的运输量批次进行运输。

4.1 运输成本模型化

设每周的运输量为Q,则当周运输成本C(Q)是一个分段线性递减函数。例如:

  • 当 0 < Q ≤ A时,单价为 p1
  • 当 A < Q ≤ B时,单价为 p2 (p2 < p1)
  • 当 Q > B时,单价为 p3 (p3 < p2) 因此,C(Q) = p1Q (if Q≤A), = p1A + p2*(Q-A) (if A<Q≤B), 以此类推。这个函数是凹函数,体现了规模经济。

4.2 联合优化模型

运输决策不能孤立进行,必须和库存决策联合优化。因为:

  • 提前运输:为了凑够一个大的、享受高折扣的运输量Q,我们可能需要把未来几周供应商那里累积的原材料提前运回。但这会导致这批原材料提前入库,从而提前开始计算库存持有成本
  • 延迟运输:反之,为了降低当期库存,我们可以选择暂时不运,让原材料暂存于供应商处(假设供应商处存储免费或成本极低)。但这会延迟原材料的可用时间,增加未来缺货风险,并且可能错过本次凑整享受折扣的机会。

因此,我们建立了一个库存-运输联合优化模型。决策变量是每周的是否运输以及运输量。目标函数是在整个规划期(24周)内,最小化“运输成本 + 库存持有成本 + 缺货惩罚成本”的总和。约束条件包括:每周的运输量不能超过当周在供应商处的累计到货量;库存平衡方程(本期库存 = 上期库存 + 本期运输到货量 - 本期需求量)。

4.3 求解算法:动态规划与启发式规则

这是一个带有复杂成本函数(分段线性)的动态优化问题。理论上可以用动态规划求解,但状态空间(库存水平)是连续的,会导致“维数灾”。我们采用了以下方法:

  1. 离散化状态空间:将可能的库存水平离散化为若干个等级(例如,0, 100, 200, ..., 最大仓容)。这样,动态规划就可以进行了。
  2. 向前递归求解:从第1周开始,计算在每个离散库存水平下,做出不同运输决策后,所能达到的最小“剩余周期总成本”(包括当期成本和后续最优成本)。逐步递归到第24周,再回溯得到最优运输策略。
  3. 启发式规则——“阈值触发法”:作为对复杂模型的补充,我们设计了一条简单易行的规则:设定两个库存阈值L和U(L<U)。每周检查企业仓库的库存水平I。
    • 如果I <= L,则立即启动运输,运输量至少补充到U水平(同时考虑供应商处的可用存量)。
    • 如果I > L,则计算“如果不运输,未来可能因凑不够折扣量而多花的运费”与“如果现在运输,提前入库带来的额外库存成本”。如果前者大于后者,则启动运输,运输量尽量凑到最近的折扣区间临界点。

在实际编程实现时,我们先运行动态规划模型得到一个基准最优解,然后发现其解的模式与“阈值触发法”非常相似。因此,在最终论文中,我们将“阈值触发法”及其阈值(L, U)的确定方法作为主要的可解释策略进行阐述,而将动态规划作为验证该策略接近最优性的工具。

5. 模型求解、灵敏度分析与论文呈现

5.1 求解工具与集成

我们使用Python作为主要工具。pandasnumpy用于数据处理;statsmodels用于SARIMA建模;scikit-learn可用于一些辅助的预测模型(如线性回归拟合趋势);核心的优化模型(随机规划的SAA近似和运输动态规划)使用PuLPcvxpy这样的优化库来求解线性/整数规划问题,或者用scipy.optimize进行函数优化(如寻找最优的s, S, L, U参数)。

所有模块被集成在一个主控脚本中:先运行预测模块,输出未来24周的需求预测及区间;然后基于预测和供应商数据,运行供应商选择与订购策略模块,输出每周的订购计划;最后,将订购计划(转化为供应商处的预计到货量)和需求预测输入库存-运输联合优化模块,输出每周的运输决策。

5.2 灵敏度分析与策略稳健性检验

一个好的模型必须经过稳健性检验。我们设计了以下几种灵敏度分析:

  • 需求波动测试:将未来需求整体上调或下调10%,观察我们的订购和运输策略如何变化,总成本增加了多少。这检验了模型对预测误差的承受能力。
  • 供应商风险测试:模拟一家核心供应商突然在某个时段供应能力下降50%,我们的策略能否通过启动备用供应商来缓解冲击。
  • 成本参数测试:改变库存持有成本率或缺货惩罚系数,观察最优策略的敏感性。例如,如果缺货惩罚变得极高,模型会倾向于持有更多的安全库存。

这些分析不仅能验证模型的鲁棒性,更能产生丰富的管理启示,成为论文的亮点。例如,通过分析我们发现,当需求不确定性增加时,动态调整安全库存比固定策略能节省更多成本;又比如,维持2-3家核心供应商加上4-5家小型稳定供应商的组合,抗风险能力最强,成本也相对较低。

5.3 论文写作与结果可视化

数模竞赛论文是成果的最终载体。在写作上,我们强调:

  • 问题重述要精炼:用自己的话概括问题,点明核心矛盾和挑战。
  • 模型假设要合理且明确:例如,“假设供应商处的暂存成本为零”、“假设运输能力无限”、“假设缺货惩罚成本为单件库存成本的5倍”。合理的假设是简化模型的前提。
  • 模型建立部分要逻辑清晰:按照“预测模型—订购模型—运输模型—联合模型”的顺序,层层递进。每一个模型都要讲清楚输入、输出、目标函数、约束条件。
  • 求解过程要具体:不能只说“我们用软件求解”,要说明用了什么算法、什么工具、关键参数如何设置、遇到了什么计算困难及如何解决的。
  • 结果分析要深入:不仅展示最终的总成本、采购计划表,更要用图表进行可视化。
    • 用折线图展示未来24周的需求预测与置信区间。
    • 用柱状图展示筛选出的核心供应商及其采购份额。
    • 用甘特图或堆叠面积图展示每周的库存水平、在途物料、运输批次之间的关系。
    • 用灵敏度分析的图表展示关键参数变化对总成本的影响趋势。
  • 模型评价与推广:客观评价自己模型的优点(如贴近实际、鲁棒性强)和缺点(如未考虑供应商价格差异、运输时间固定等),并提出几个可行的改进方向,体现思维的全面性。

这道C题是一个经典的运筹学与管理科学问题,它没有唯一的标准答案。获奖的关键在于能否用清晰的逻辑将实际问题转化为数学模型,用合理的算法进行求解,并用严谨的分析和生动的呈现来展示你的解决方案的合理性与优越性。整个过程,是对团队数据处理、建模、编程和写作能力的综合考验。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 14:48:57

邮件群发系统日志分析与效能优化实战

1. 项目概述&#xff1a;群发邮件报告日志的核心价值在数字化沟通成为主流的今天&#xff0c;邮件群发系统已成为企业营销、客户维护和内部通知的重要工具。Sona Systems作为专业的调研平台&#xff0c;其群发邮件功能被广泛应用于学术研究、市场调研和用户反馈收集等场景。但很…

作者头像 李华
网站建设 2026/8/17 14:47:43

小鹏全新智能轿跑技术解析:800V平台与XNGP如何重塑市场格局

1. 从“亮相”到“定调”&#xff1a;小鹏轿跑新车的战略意图解析 上海车展&#xff0c;对于任何一家中国汽车品牌而言&#xff0c;都远不止是一个新车发布的舞台&#xff0c;它更像是一场年度大考&#xff0c;一次战略定调的公开课。当小鹏汽车选择在这个舞台上&#xff0c;为…

作者头像 李华
网站建设 2026/8/17 14:46:52

AI如何重塑JIT编译器的性能经济学:从传统权衡到智能决策

在传统编程语言和运行时系统的演进中&#xff0c;即时编译器&#xff08;JIT Compiler&#xff09;一直是提升性能的关键引擎。它通过在程序运行时将字节码或中间表示&#xff08;IR&#xff09;动态编译为本地机器码&#xff0c;试图弥合解释执行的灵活性与静态编译的高效性之…

作者头像 李华
网站建设 2026/8/17 14:43:51

ADB操作Android电池信息:从获取到模拟测试的完整指南

1. 项目缘起&#xff1a;为什么需要从ADB层面操作电池信息&#xff1f; 在Android应用开发或者设备测试的日常工作中&#xff0c;我们经常会遇到一些与设备电量相关的棘手场景。比如&#xff0c;你正在开发一个需要深度优化功耗的App&#xff0c;或者在进行自动化测试时&#x…

作者头像 李华
网站建设 2026/8/17 14:43:35

Ubuntu虚拟机VMware Tools安装与共享文件夹配置全攻略

1. 从“能用”到“好用”&#xff1a;为什么VMware Tools和共享文件夹是虚拟化体验的分水岭 如果你在Ubuntu虚拟机里装过VMware Tools&#xff0c;并且折腾过共享文件夹&#xff0c;那你大概率和我一样&#xff0c;有过一段“痛并快乐着”的经历。快乐在于&#xff0c;一旦搞定…

作者头像 李华
网站建设 2026/8/17 14:42:31

Excel文件密码遗忘破解指南:从原理到实战恢复数据

1. 项目概述&#xff1a;当Excel文件被“锁”住时 相信很多朋友都遇到过这个让人头疼的场景&#xff1a;一份至关重要的Excel文件&#xff0c;因为设置了“打开密码”&#xff0c;而密码又被自己或同事遗忘在了记忆的角落。文件就在那里&#xff0c;数据就在里面&#xff0c;但…

作者头像 李华