恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
数学建模竞赛供应链优化:从需求预测到鲁棒性分析的全流程解析
首页
资讯中心
/
数学建模竞赛供应链优化:从需求预测到鲁棒性分析的全流程解析
数学建模竞赛供应链优化:从需求预测到鲁棒性分析的全流程解析
发布时间:2026/8/23 19:35:56
1. 项目概述一次从混沌到清晰的解题旅程2021年的全国大学生数学建模竞赛C题题目是“生产企业原材料的订购与运输”。这个题目一出来当时我们团队三个人盯着题目看了半天第一感觉是这题背景太“实”了数据量不小但问题又很“散”。它不像一些优化题目标明确就是求个最小成本或者最大利润而是把订购、仓储、运输、生产这些环节像拧麻花一样拧在了一起还给了你过去五年的历史数据让你去预测和决策。很多队伍一开始就懵了不知道从哪里下手是做个时间序列预测就完事还是得建个庞大的供应链优化模型其实这道题的精髓在于“分解”与“耦合”——你得先把大问题拆成几个能独立分析的小问题比如需求预测、经济订购批量、运输规划然后再想办法把它们之间的逻辑关系比如库存水平影响订购决策订购决策又影响运输成本用数学语言重新“焊接”起来。今天我就以一名当年参赛并取得不错成绩的“老队员”视角来彻底拆解这道题的解题思路、核心模型构建的底层逻辑以及那些在比赛现场才会遇到的“坑”和应对技巧。无论你是正在备赛的新手还是对供应链优化感兴趣的学习者这篇文章都能带你回到那个紧张的比赛周末看看一个复杂的现实问题是如何被一步步抽象、建模并求解的。2. 核心思路拆解如何将现实问题转化为数学语言面对一个庞大的案例题最忌讳的就是一头扎进细节里。我们的首要任务是进行“问题翻译”把题目中那些描述性的、定性的要求变成一个个可以量化、可以建模的数学问题。2.1 题目关键信息提取与问题定义题目背景是一家生产企业需要向数百家供应商采购原材料。给出了过去五年的订货量和供货量数据。问题主要围绕三个方面订购方案根据未来24周的原材料需求制定每家供应商每周的原材料订购方案目标是使采购成本最低。转运方案原材料需要先运至中转仓库再转运至企业。需要制定转运方案目标是使转运成本最低。保障能力评估与选择在面临某些供应商可能无法供货的极端情况下如何调整方案并评估哪些供应商对保障生产至关重要。这里的关键词是“方案”和“最低”。这直接指明了本题的核心是优化问题。但优化需要有目标函数和约束条件。目标函数相对明确成本最低但约束条件需要我们从题目描述和数据中自己挖掘和定义。例如“满足企业每周的生产需求”就是一个硬约束这意味着每周到货的原材料总量必须大于或等于当周的需求量。再比如供应商有供货能力的上限仓库有库存容量的上限这些也都是约束。2.2 建模思路总览分层优化与顺序求解经过团队讨论我们否定了试图建立一个“超大型一体化模型”的想法。因为那样模型会异常复杂求解极其困难而且一旦出错满盘皆输。我们采用了更稳健的“分层优化顺序求解”策略。第一层需求预测与订购决策。这是基础。虽然题目给出了未来24周的需求但这个需求是确定性的吗通常不是。我们需要利用前五年的历史数据对需求进行一个简单的预测或平滑处理甚至可以分析其季节性虽然本题周期以周计季节性可能不明显。订购决策的核心是解决“何时订、向谁订、订多少”的问题。这里会自然引入库存论的思想考虑持有成本、订货成本但需要结合题目中给出的供应商具体报价单价和订货费进行改造。第二层运输路径与成本优化。在确定了每周从各个供应商的订购量后这些货物需要从供应商运到中转仓库再从中转仓库运到企业。这里就构成了一个典型的运输问题或网络流问题。供应商是发货点企业是收货点中转仓库是中间节点。我们需要决定每条路径上的运输量以最小化总运输费。运输费通常与距离和运量有关题目会给出相关费率。第三层鲁棒性分析与策略调整。前两层是在理想情况下的优化。第三层则要应对风险“如果某个供应商断供了怎么办” 这要求我们的模型不能是“紧绷绷”的而要有一定的弹性。我们需要评估每个供应商的重要性例如计算其供应量占比、其原材料的不可替代性等并为可能的供应中断设计应急预案比如增加安全库存、启用备用供应商等。这部分往往涉及灵敏度分析或情景模拟。这个分层思路的优势在于它将一个复杂问题模块化了。我们可以先集中精力攻克第一层得到订购方案再以订购方案为输入求解第二层运输问题最后基于前两层的模型进行第三层的拓展分析。逻辑清晰且便于分工协作。注意这种顺序求解方法在数学上并非全局最优解因为订购决策会影响运输成本两者是耦合的。但在数模竞赛有限的时间内这是一种非常务实且高效的策略。我们可以在模型讨论部分明确指出这一点并探讨如果采用联合优化可能的方向和复杂度这反而能体现我们对问题深度的思考。3. 核心模型构建与求解细节解析接下来我们深入每一层看看具体的模型是如何搭建起来的。3.1 第一层基于s, S策略改进的订购模型经典的库存模型如EOQ经济订购批量在这里不能直接套用因为需求是时变的每周不同供应商有多个且价格不同。我们的目标是制定未来24周设t1,2,...,24的订购计划。决策变量定义设x_{it}为第t周向供应商i订购的原材料数量。 设I_t为第t周周末的库存水平设初始库存I_0已知或为0。目标函数最小化总采购成本。总成本通常包含两部分货物成本单价 × 采购量。供应商i的单价为p_i。订货固定成本只要每周向某个供应商订货就会产生一笔固定费用k_i类似于启动费。这是本题的一个关键点它会导致模型倾向于减少订货次数每次订更多货。 因此目标函数为Min Z1 Σ_t Σ_i (p_i * x_{it} k_i * y_{it})其中y_{it}是一个0-1变量如果x_{it} 0则y_{it}1否则为0。这就需要引入大M法来建立x_{it}和y_{it}之间的逻辑关系约束x_{it} M * y_{it}M是一个足够大的正数。约束条件需求满足约束每周的期初库存加上本周到货量减去本周需求D_t等于本周期末库存。同时本周的生产必须得到满足这通常体现为库存非负或者更精确地本周的到货量期初库存 本周需求。我们采用动态库存平衡方程I_t I_{t-1} Σ_i x_{i,t-L} - D_t。这里L是供应商i的供货提前期题目可能给出或假设为0。且I_t 0或安全库存。供应商能力约束每周从供应商i的采购量不能超过其最大供应能力Cap_{it}x_{it} Cap_{it}。仓库容量约束每周的库存量不能超过仓库最大容量W_maxI_t W_max。变量非负与0-1约束。模型求解与技巧这是一个**混合整数线性规划MILP**问题因为包含了0-1变量y_{it}。可以直接使用优化求解器如LINGO、MATLAB的intlinprog、Python的PuLP或Gurobi进行求解。实操心得这里有个巨大的坑——直接对24周*数百家供应商的规模进行全周期MILP求解计算量可能非常大导致求解时间过长甚至无法求解。我们的策略是“滚动规划周期截断”。即每次只优化未来N周例如8周只考虑主要的供应商例如根据历史采购额筛选出前50家求解后实施第一周的方案然后时间滚动一周基于新的库存和需求数据再次优化未来N周。这样就将一个大问题分解为多个可管理的小问题。在论文中需要说明这种简化处理的合理性。3.2 第二层多商品网络流运输模型在得到订购方案x_{it}后我们知道第t周需要从每个供应商i那里提取x_{it}的货物。现在要考虑如何将这些货物运到企业。问题抽象假设有S个供应商源点W个中转仓库中间节点F个工厂汇点本题通常为1个。货物从S到W再从W到F。决策变量定义设f_{ijt}为第t周从节点i(供应商) 运到节点j(仓库) 的货量。 设g_{jkt}为第t周从节点j(仓库) 运到节点k(工厂) 的货量。目标函数最小化总运输成本。运输成本与距离和运量有关假设为单位运价c_{ij}乘以运量。Min Z2 Σ_t ( Σ_i Σ_j c_{ij} * f_{ijt} Σ_j Σ_k c_{jk} * g_{jkt} )约束条件流量平衡约束供应商从供应商i运出的所有货物总量等于其当周订购量x_{it}Σ_j f_{ijt} x_{it}。流量平衡约束仓库对于每个仓库j每周流入量等于流出量假设仓库不存储即周转仓Σ_i f_{ijt} Σ_k g_{jkt}。如果仓库有存储能力则需要引入仓库库存变量约束会变为“流入量 流出量 库存增量”并增加仓库容量约束。流量平衡约束工厂运到工厂k的所有货物总量等于其当周需求D_tΣ_j g_{jkt} D_t。运力约束每条运输路径可能有最大运力限制f_{ijt} U_{ij},g_{jkt} U_{jk}。非负约束。模型求解这是一个标准的**线性规划LP**问题规模可能很大节点多周期多但结构清晰求解速度比MILP快得多。可以使用MATLAB的linprog、Python的SciPy或专业的优化求解器求解。由于每周运输问题独立甚至可以分24周分别求解进一步降低单次求解规模。注意事项在实际编程求解时特别是使用像MATLAB这样的工具构建这个大型线性规划的系数矩阵Aeq, beq是一个挑战。我们的技巧是先为每个节点供应商、仓库、工厂在每个时间点编写流量平衡方程然后使用循环或向量化操作来组装大矩阵。务必仔细检查矩阵的维度确保每个约束都正确对应。一个有效的调试方法是先用一个极小的例子如2个供应商、1个仓库、1个工厂、1周手动计算并验证模型输出是否正确。3.3 第三层供应商关键性评估与鲁棒性优化这部分是体现模型深度和思维全面性的地方。供应商关键性评估我们可以设计几个指标来量化供应商i的重要性供应份额指标R1_i (Σ_t x_{it}) / (Σ_t Σ_i x_{it})即该供应商总订购量占比。成本敏感度指标从模型一的最优解出发微调该供应商的单价p_i或固定订货费k_i观察总成本Z1的变化率。变化率越大说明该供应商对成本越关键。唯一性指标检查是否有某种原材料只由此供应商提供或者其供应能力在特定时间段内不可被其他供应商替代。 综合这些指标可以对供应商进行排序找出那些“牵一发而动全身”的关键供应商。应对供应中断的鲁棒性策略情景模拟假设关键供应商i在第T周突然断供。我们需要重新运行模型一和模型二但增加约束对于t Tx_{it} 0。对比新方案与原方案的成本上升幅度ΔZΔZ越大说明该供应商中断的影响越严重。预案设计在原有模型中主动增加鲁棒性。安全库存法提高模型一中库存水平的下限约束例如要求I_t S_safety。这样即使某周到货不足也有库存缓冲。多源采购法在模型一中增加约束限制从单一供应商的采购比例例如x_{it} θ * D_t强制分散采购。备用供应商在模型中预先引入一些单价较高但可靠的备用供应商在正常优化中它们可能不会被选中但在情景模拟中允许启用。实操心得鲁棒性分析部分在论文中往往是加分项。但要注意时间有限我们不可能对所有供应商做全面中断模拟。我们的策略是结合前述关键性评估选取排名前3-5的供应商进行中断模拟。在论文中详细展示1-2个最具代表性的供应商中断情景的完整分析过程包括调整后的订购方案、运输方案、成本对比并简要说明其他几个的结果。这样既展示了方法又控制了工作量。4. 数据处理、编程实现与团队协作要点模型思路清晰了但比赛成败往往取决于细节实现。这部分分享我们当时在数据和编程上的具体操作。4.1 历史数据的分析与预处理题目附件会提供大量的历史数据表格通常是Excel格式。数据预处理的第一步不是写代码而是用Excel打开人工浏览。了解数据有哪些字段供应商ID、周次、订货量、供货量、单价、数据是否有缺失、是否有明显异常值如供货量为负数。核心预处理步骤数据清洗处理缺失值。对于少量的缺失可以采用前后周的平均值插补对于某供应商整段缺失可能需要考虑其是否已失效在建模时将其剔除或特殊处理。特征提取从历史数据中提取对预测未来需求有用的特征。例如计算每家供应商历史供货量的均值、方差以评估其供应稳定性。计算企业历史总需求的周平均值、趋势性是否在缓慢增长。检查需求是否有周期性如季度性。虽然本题以周为单位但可以尝试计算月度或季度聚合后的趋势。未来需求处理题目直接给出了未来24周的需求D_t。我们是否需要完全信任这个数据通常我们会将其作为一个基准但可以基于历史数据的趋势对其进行微调。例如如果历史需求年均增长5%我们可以将给出的D_t视为“基准需求”然后乘以一个增长系数(10.05/52)^t。这个操作不一定能显著提高模型精度但能在论文中体现我们的思考。4.2 编程求解环境与工具链选择我们队当时使用的是MATLAB作为主力工具辅以Excel进行前期数据探查和后期结果整理。为什么选择MATLAB优化工具箱强大intlinprog用于求解混合整数规划模型一linprog用于求解线性规划模型二接口相对统一。矩阵操作方便构建大型LP/MILP模型的系数矩阵时MATLAB的矩阵操作比Python当时我们对SciPy/PuLP不熟更直观。绘图功能便捷快速绘制库存变化曲线、运输网络图、成本对比柱状图等用于论文可视化。工具链工作流Excel - MATLAB将清洗好的数据另存为CSV格式在MATLAB中用readtable或csvread导入。MATLAB建模求解编写独立的脚本或函数文件分别对应模型一、模型二。每个脚本都包含数据读取、参数设置、决策变量定义、目标函数和约束矩阵构建、调用求解器、结果解析。结果输出与可视化将求解得到的x_{it},f_{ijt},g_{jkt}等结果写入CSV文件或直接存入MATLAB工作区。使用plot,bar,graph等函数生成图表。MATLAB - Word/LaTeX将关键图表和汇总数据整理到论文中。避坑指南一定要尽早搭建一个可运行的最小可行性模型MVP。比如先用2个供应商、1个仓库、4周的数据把模型一的整个求解流程跑通。这能帮你提前发现很多问题数据格式对不对约束方程写错了吗求解器报什么错如果等到最后一天才把所有代码拼在一起运行一旦出错调试的恐慌会严重影响比赛心态。我们当时在第一天下午就完成了模型一的MVP心里顿时踏实了很多。4.3 团队分工与时间管理策略三天时间三个人的团队分工至关重要。我们采用的是“主线-副线”并行模式。人员A队长主攻手职责负责核心模型模型一的构建、数学推导、MATLAB编程实现。时间线Day1上午深入读题确定分层优化总思路完成模型一的数学公式化。Day1下午-晚上搭建模型一的MVP并完成小规模数据测试。Day2全天将模型一扩展到全规模数据考虑滚动规划等简化策略并完成求解。输出订购方案x_{it}。人员B副攻手职责负责运输模型模型二的构建与实现以及部分数据预处理。时间线Day1协助读题研究运输部分数据和约束完成模型二的数学公式化。Day2在人员A提供订购方案x_{it}后立即开始模型二的编程与求解。同时负责从原始数据中提取供应商-仓库、仓库-工厂的距离和运价数据。Day3上午完成模型二的求解输出运输方案和成本。人员C辅助与论文职责负责数据预处理、结果分析、鲁棒性分析、论文初稿撰写和图表制作。时间线Day1使用Excel和MATLAB进行数据清洗和探索性分析绘制历史需求趋势图等。Day2开始撰写论文的“问题重述”、“模型假设”、“符号说明”等前期部分。设计论文图表模板。Day3接收A和B的结果进行整合分析完成供应商关键性评估和中断情景模拟可以基于A的模型稍作修改运行。全力撰写论文的“模型建立与求解”、“结果分析”、“模型评价与推广”等核心部分。每日固定会议早中晚各一次短会15-20分钟同步进度、解决卡点、调整计划。特别是第二天晚上必须完成所有模型的求解第三天全天留给论文写作和打磨。5. 论文写作与结果呈现的独家技巧数学建模竞赛“建模”和“求解”只完成了前半部分“表达”同样重要。一篇逻辑清晰、图文并茂的论文是取得好成绩的关键。5.1 论文结构框架与写作要点国赛论文有相对固定的结构但我们要在框架内写出亮点。摘要重中之重评委首先看摘要摘要决定了第一印象。我们采用“总-分-总”结构。首段总用2-3句话概括问题本质、我们的整体解决思路如“针对…问题本文建立了基于分层优化的订购与运输决策模型…”和最终达到的效果如“实现了总成本最小化并评估了供应链鲁棒性”。主体分对应论文的几个主要部分每部分用一两句话说明做了什么、用了什么方法、得到什么关键结果或结论。例如“首先基于混合整数规划建立了…模型采用滚动规划策略求解得到未来24周订购方案总采购成本为X元。”、“其次基于网络流理论建立了…模型求解得到最优运输路径转运成本为Y元。”、“最后通过定义关键性指标和中断情景模拟识别出供应商A、B为关键供应商并提出了安全库存策略以提升鲁棒性。”尾句总简要评价模型优点如“模型层次清晰实用性强”或特色。注意摘要务必精炼控制在半页到一页之内。所有数字结果成本、关键供应商编号必须在摘要中体现。写完摘要后要反复修改确保没有废话逻辑跳跃。问题重述与分析不要照抄题目要用自己的语言概括问题背景和需要解决的具体问题1.订购方案 2.转运方案 3.保障能力分析。然后进行“问题分析”这里可以画一个思维导图或流程图直观展示我们的“分层优化”总思路这是很大的加分项。模型假设与符号说明假设要合理且必要例如“假设同一供应商每周原材料单价不变”、“假设运输途中无损耗”、“假设中转仓库周转迅速不考虑仓储成本除非题目提及”等。符号说明建议使用三线表清晰列出所有主要变量、下标含义和单位。模型的建立与求解这是论文的核心。必须分小节对应我们的模型一、二、三来写。每个小节的结构先阐述这一部分要解决的具体问题 - 给出决策变量定义 - 详细推导目标函数和约束条件公式要编号如(1)(2)(3)- 说明模型中参数如何从题目数据获取 - 简要说明求解方法如“这是一个混合整数线性规划问题我们使用MATLAB的intlinprog函数进行求解”-展示关键结果。结果不要只扔一个数字要用图表呈现。例如订购方案可以用一张热力图横轴周次纵轴供应商颜色表示订购量来展示运输方案可以画一个简单的网络流量图库存变化可以用折线图。模型的评价与推广优点客观陈述如“模型采用分层优化降低了求解复杂度”、“模型同时考虑了固定订货成本和变动运输成本更贴合实际”、“引入了鲁棒性分析使决策更具前瞻性”。缺点诚恳说明如“分层优化未能实现全局最优”、“模型假设运输单价恒定未考虑批量折扣”、“对需求的预测较为简单未考虑突发市场因素”。指出缺点并不可怕这体现了思维的严谨性。推广可以谈谈模型稍作修改后还能应用于哪些类似场景如“本模型可推广至其他制造企业的采购与物流协同优化问题”、“可通过引入随机需求变量进一步研究在不确定环境下的库存策略”。5.2 可视化让结果自己说话在数模论文中一图胜千言。订购方案热力图使用imagesc或heatmap函数绘制直观显示哪些供应商在哪些时间段是采购主力。库存水平变化图简单的折线图横轴时间纵轴库存量。可以加上安全库存水平线作为参考。运输网络流量图可以使用MATLAB的graph和plot函数节点大小代表货物吞吐量边的粗细代表运输量。这张图非常直观能极大提升论文的专业观感。成本构成饼图或柱状图展示总成本中采购成本、固定订货费、运输成本各自的比例。供应商关键性指标雷达图或柱状图对比展示前几位关键供应商的各项指标得分。注意事项所有图表必须有清晰的标题、坐标轴标签、图例。图表在论文中的位置要紧跟在引用它的文字段落之后。在提交前务必检查所有图表中的数字、标签是否准确无误一个错误的数字可能导致严重失分。6. 常见问题与临场应对策略即使准备再充分比赛现场也总会遇到意外。以下是我们总结的一些常见“险情”及处理办法。6.1 模型求解失败或速度太慢这是最令人崩溃的情况。应对策略有检查模型正确性首先用极小规模数据如2个供应商、2周测试确保模型逻辑和代码无误。经常出错的地方包括约束条件符号方向写反、变量维度不匹配、大M值设置不合理导致整数变量松弛。简化模型如果模型正确但求解慢果断简化。减少时间范围采用滚动规划从24周减到8周或4周。聚合供应商将数百家供应商按地区或产品类型合并成几十个“超级供应商”降低变量维度。松弛整数约束如果0-1变量y_{it}导致求解困难可以先尝试将其松弛为连续变量0y_{it}1求解得到一个下界理想情况。然后观察解如果大部分y_{it}都接近0或1可以将其固定四舍五入再求解剩下的线性规划。在论文中需说明这种启发式方法的合理性。更换求解器或算法MATLAB的intlinprog可以调整选项如增大最大迭代次数、改变分支定界策略。如果不行可以尝试调用更专业的求解器如Gurobi如果有安装许可。6.2 结果不合理或与直觉相悖例如计算出的成本高得离谱或者订购方案显示连续几周库存为负。回溯检查输入数据单位是否统一需求D_t和供应能力Cap_{it}的单位是否匹配都是吨/周单价p_i是每吨的价格吗检查约束条件库存非负约束I_t 0是否真的写进了模型需求满足约束是否包含了提前期L如果L1那么第1周的需求必须由第0周的库存和更早的订单满足如果初始库存为0且没有提前订单模型必然无解。这时可能需要调整初始条件或假设第一周的需求由特殊渠道满足。进行敏感性测试手动调整一个参数比如某个供应商的单价看结果变化方向是否符合经济学常识单价提高向其采购量应减少。如果不符合说明模型目标函数或约束可能有根本性错误。6.3 论文写作时间不足这是最常见的问题往往因为前期的建模和编程耗时超出预期。严格守住论文启动时间我们强制规定最晚在第三天早上8点无论模型调试到何种程度都必须开始正式撰写论文。未完成的调试工作由一人通常是主编程继续其余两人全力投入写作。使用模板并行写作在比赛开始前就准备好论文的LaTeX或Word模板包括预设好的章节标题、图表标题样式、公式编号样式等。写作时每个人负责不同的章节同时进行。先完成再完美先搭起论文的所有骨架把该有的内容都填进去哪怕有些地方的描述还比较粗糙图表还是草图。确保在截止时间前3小时有一份完整的初稿。然后用剩余的时间进行润色语言、美化图表、检查错别字和公式编号。摘要最后写但必须留足时间摘要是论文的灵魂必须基于最终的全部结果来写。我们通常在最后2-3小时由队长主笔三人共同讨论修改字斟句酌确保精准反映全文精华。回顾2021年C题的解题过程它更像是一个完整的工业系统优化项目的微缩版。它考验的不仅仅是数学和编程能力更是问题拆解、团队协作、时间管理和抗压能力。最大的体会是在数模竞赛中没有一个模型是完美无缺的重要的是展示出你从实际问题到数学模型的清晰思考路径以及面对复杂性和不确定性时所采取的务实、创新的解决策略。那些写在论文里的“模型假设”和“优缺点分析”往往就是你思考深度的最好体现。当你拿到一个题目感觉千头万绪时记住这个口诀先分解后耦合先简化后求精早动手早试错重结果更重过程。把这套思路和技巧内化再面对任何建模赛题你都能从容地找到那条通往答案的路。