简介:一份面向数学建模竞赛的系统性备赛资料,涵盖数模培训讲义、历年真题解读、源代码和优秀获奖论文,适合从入门到冲刺的各阶段参赛学生及指导老师使用。压缩包共61个文件,以30个MATLAB脚本(.m)为主,配合16个Word文档(.doc)的赛题解析与论文模板、6个Excel数据表(.xls)的统计与优化例题,以及2个PPT课件和少量数据文件,整体仅2.02MB,便于快速下载与按需查阅。已有354人学习下载,资料虽小但内容精炼,覆盖了蒙特卡洛模拟、微分方程求解、神经网络建模等常用算法,并包含1998年A题、自动化车床管理、彩票中的数学等经典赛题的完整方案。通过研读源代码和获奖论文,读者可系统掌握从数据预处理、模型构建到论文写作的全流程方法,为实战竞赛打下扎实基础。
1. 数学建模竞赛备考:先别急着堆算法,你要先知道评委到底看什么
数学建模和数模竞赛这件事,最容易被数模培训反复强调的是算法难度,但评阅时真正拉开差距的往往是另一套东西:建模思路是否清晰、代码能否复现、论文能不能让人十分钟读懂你的贡献。很多同学刷了几十套源码,真正上赛场时把精力全压在“用更高级的模型”上,结果摘要写得像算法菜单,模型假设和后续推导完全脱节,最后分数远低于预期。数模竞赛拿分的关键不是模型多深奥,而是能不能走完“读题—建模—求解—验证—表达”这条完整链路。这篇备考笔记就把高频考点、真题解法和易错点一次理清,适合正在备赛、想系统提升答题稳定性的人直接拿来用。
2. 考点分布与赛题识别:拿到题先判断它是哪一类,再动手
2.1 赛题类型与分值占比:四种题对应四种解题范式
从近些年的竞赛真题看,赛题基本落在四个模型族里:优化类、预测类、评价类、机理分析类。这几类的占比并不均匀,优化类是绝对主力,大概占四成;预测类和评价类各占两到三成;机理分析类最少,但一旦出现往往最难。你要做的第一件事不是翻模型库,而是把题目归类,因为每一类的解题范式完全不同。
| 赛题类型 | 题干信号词 | 核心模型 | 经验占比 |
|---|---|---|---|
| 优化类 | 安排、调度、成本最低、收益最大、有限资源 | 线性规划、整数规划、动态规划 | 35%~40% |
| 预测类 | 预测未来、趋势、未来一段时间内的数据 | 回归、时间序列、灰色预测、神经网络 | 20%~25% |
| 评价类 | 排序、比较优劣、权重、满意度 | 层次分析法、熵权法、TOPSIS | 20%~25% |
| 机理分析类 | 变化率、演化过程、内在机制、物理规律 | 微分方程、差分方程、图论 | 10%~15% |
为什么这个分布很重要?因为优化类题目通常有一问是“给方案”,评委看的是约束条件有没有列全、目标函数建得对不对;预测类题目看的是数据处理规范不规范、结果有没有做样本外检验;评价类题目看的是权重从哪来,主观还是客观依据是否充分。
识别的关键是动词和数据的形状。题目里出现“如何安排”“怎样分配”“使总成本最小”,基本锁定优化类。出现“预计未来”“给出第某年的预测值”,就是预测类。“对某几个对象进行综合评价并排序”,指向评价类。你拿到题后不要急着读完全部三个问,先扫题干里的动词和任务句,把类别定下来,后面所有步骤才能顺。
2.2 五分钟识别流程:从信号词反推模型族
很多备赛者忽略的一步是“读题定类”,直接开始查资料、选模型,结果做到一半发现方向错了。给一个可以反复用的五步操作,整个过程控制在五分钟以内。
第一步,把题干中所有动宾短语圈出来,例如“设计调运方案”“预测未来三期的库存”“对各方案进行排序”,每圈一个就对应一个任务块。第二步,圈数据形态,看题目给的是截面数据、时间序列还是面板数据,决定了你能不能直接套时间序列或回归。第三步,看有没有明显的资源约束词,比如“不超过”“至少”“有限”,只要出现这类词,这一问一定优先考虑规划模型。第四步,把前三个信号映射到四个模型族里,如果题目是复合题型,就按题干顺序拆任务块。第五步,为每个任务块选主模型和一个备选模型,主模型用来写论文主线,备选模型用来做对比验证。
这套流程解决的是大多数人的通病:拿到综合题不知道从哪下手。你可以把历年真题的题干拉出来,只看任务句不看数据,反复练这个识别过程,直到每个任务句都能在十秒内给出模型族归属。
2.3 真题演练:一道排产题目你怎么判断、怎么破
这里用一道典型的综合题做演示,题干是:某制造车间有三条产线,生产两种产品,每种产品需要经过机器加工和人工组装两道工序,机器工时和人工工时都有限制,已知单位利润和单位消耗,第一问要求给出使总利润最大的排产方案;第二问要求结合过去两年的产量数据,预测未来三个月的总产量。
先判断类别:第一问有“利润最大”“工时限制”,是标准的整数规划问题,决策变量是每个产品的生产数量,约束是两条工序的工时上限;第二问给了历史产量数据,要求预测未来,属于时间序列预测。两个任务块对应的主模型分别是整数线性规划和ARIMA或灰色预测。答题时先在第一问把模型建好,用求解器得到排产结果,再在第二问里做数据预处理和预测,最后把第一问的最优产量作为第二问预测结果的校验基准。
这道题最常见的错法是:在一个模型里同时解决两个问题,把预测结果塞进优化模型当参数,导致模型复杂又不透明。正确做法是分块处理,每一问都有独立的模型和结论,再写清楚两个任务之间的数据流关系。这样评阅容易找到你的得分点,你自己也不会在赛时被一个卡住的模块拖垮。这类题通常这么答可以稳定拿分:先列表格整理决策变量和已知参数,再建模型,最后用代码求解,每一步都让评委能对应到题干。
3. 高频考点:优化类赛题的建模套路与源代码模板
3.1 线性规划与整数规划:决策变量、目标函数、约束的三件套
优化类题目说到底是三件事:决策变量设得准、目标函数列得对、约束条件写全。大部分赛题里,决策变量就是“做某事的数量”,比如产量、运量、分配量;目标函数往往是总成本最小或总收益最大;约束条件来自题干里的资源上限、需求下限和非负约束。
以 3.2 那类排产问题为例,第一步设决策变量,两种产品的产量记为 x0、x1。第二步写目标函数,总利润等于单位利润乘以产量求和。第三步写约束,机器工时和人工工时都不能超过上限,产量取非负整数。这里容易被忽视的是“整数”二字:产量不可能出现小数点,所以必须用整数规划,而不是普通的线性规划。
import cvxpy as cp # 决策变量:两种产品的产量,取整数 x = cp.Variable(2, integer=True) # 目标函数:总利润最大化 objective = cp.Maximize(30 * x[0] + 20 * x[1]) # 约束:机器工时上限12,人工工时上限16,产量非负 constraints = [ 2 * x[0] + 3 * x[1] <= 12, 4 * x[0] + 2 * x[1] <= 16, x[0] >= 0, x[1] >= 0 ] prob = cp.Problem(objective, constraints) result = prob.solve() print("最优产量:", x.value) print("最大利润:", prob.value)这段代码里最关键的参数是integer=True,加上它才是整数规划,去掉它就变成线性规划,求解结果可能是非整数,比如 2.4 件,这在排产类题目里是无法落地执行的。两个约束条件分别对应机器和人工两条生产瓶颈,你可以看到第一个资源约束较紧,哪个约束先达到上限,哪个就是瓶颈,写论文时这一点要专门点出来,评委很吃“瓶颈分析”这个表述。
代码跑完后如果求解器提示问题无解,通常不是代码问题,而是约束条件之间本身就矛盾,比如把两个上限写成同时要求超过总工时。排查时逐条检查每个约束的数值符号,尤其注意小于等于和大于等于有没有写反。另一个常见坑是求解器默认用连续松弛方法,遇到整数变量时收敛慢,你可以把约束里的上限数据放大十倍观察结果是否稳定,判断模型本身有没有错误。
3.2 多目标与动态规划:权重、Pareto 和状态转移
有些优化题不止一个目标,比如既要成本最低又要碳排放最少,或者既要交付时间短又要库存成本低。遇到多目标,最简单的处理是加权求和,把两个目标乘以权重 λ 和 1-λ 合并成一个目标函数。权重怎么定?一般在 0.2 到 0.8 之间取几个值做灵敏度分析,看最优方案会不会随权重明显漂移,如果漂移不大,说明模型稳健。
还有一类题干里出现“分阶段决策”“每个阶段的状态”等词,比如多周期库存问题或多阶段投资问题,适合用动态规划。动态规划的核心是状态转移方程,你要明确每个阶段的状态变量是什么、决策变量是什么、阶段收益怎么算。这类模型的论文写法强调递推关系清楚,评阅时会看你能不能把状态转移写成数学表达式,而不只是堆一段代码。
3.3 真题演练:资源调度题从建模到求解的完整链条
资源调度题几乎是优化类里最常出现的变体,把排产换成车辆调度、人员排班、应急物资分配,底层都是同一套框架。答题时按五步走:第一,列出所有已知参数,包括资源种类、每个任务消耗量、每个资源总量;第二,定义决策变量,明确是整数还是 0-1 变量;第三,写出目标函数和全部约束;第四,用代码求解;第五,对关键参数做灵敏度分析并画图。
以 2.3 的排产题为例,第一问完整推导过程是:设产品一的产量为 x0、产品二的产量为 x1,目标函数是 max 30x0 + 20x1。机器工时约束 2x0 + 3x1 ≤ 12,人工工时约束 4x0 + 2x1 ≤ 16,非负整数约束 x0、x1 ∈ N。代进求解器,最优解即是满足两个瓶颈约束的那个整点。写完模型后,把机器工时上限从 12 改到 13,看总利润变化多少,这组灵敏度数据写在论文里,能直接回应“方案在什么条件下会失效”这个评委必问的问题。
失败时怎么排查,记住三个地方:第一看变量定义,如果是分配问题却没用 0-1 变量,求解结果会输出一堆小数;第二看约束完整性,漏掉非负约束会让模型跑出负产量;第三看求解器状态,返回 infeasible 时优先怀疑两条约束方向矛盾,返回 unbounded 时优先怀疑目标函数和约束里少写了限制条件。这三条按顺序查一遍,九成求解失败都能当场解决。
4. 高频考点:预测与评价类模型的解题范式
4.1 数据准备好了吗:清洗、插补与平稳化的顺序
预测类赛题的数据往往不是干净的,题干会给你一批带有缺失值和异常值的原始数据,这时直接建模就是送分题变送命题。正确的处理顺序是先清洗后建模,不要跳步。清洗第一步做完整性检查,统计每列缺失比例,超过三成的列要考虑舍弃或重新定义指标;第二步做异常值识别,用箱线图或三西格玛法则挑出离群点,再判断它是真实波动还是录入错误;第三步做缺失值插补,连续性数据用线性插值或相邻均值,离散数据用众数填充。
插补方法不是随便挑的,它会影响后续预测的平滑程度。线性插值适合趋势明显的连续变量,如果你预测的是库存这类周期性数据,线性插值会抹掉周期特征,应该用前几期同周期的均值填充。判断数据是否适合直接建模前,先画时间序列折线图,如果均值明显随时间漂移,就需要差分处理,一般差一阶或两阶就能让序列平稳。这个“看图定差分阶数”的习惯能避免你拿着非平稳序列硬套回归模型,输出一堆看似显著实则伪回归的系数。
4.2 灰色预测 GM(1,1):短数据的保底方案
比赛里经常遇到“过去五年”“过去七期”这种小样本数据,传统时间序列模型在数据量少于二十个时往往失灵,灰色预测就是这时候的保底方案。它只要求原始数据非负、样本量不小于四、大致满足准指数规律,非常适合竞赛场景。使用前要先做级比检验,计算相邻两期数据的比值,比值落在可容区间内才可以用,这是很多备赛者略过的关键步骤,不检验直接预测会被评委质疑。
import numpy as np def gm11(x0, pred_len=3): # x0:原始序列,pred_len:预测长度 x0 = np.array(x0, dtype=float) x1 = np.cumsum(x0) # 累加生成序列 z1 = (x1[:-1] + x1[1:]) / 2 # 紧邻均值生成序列 B = np.vstack([-z1, np.ones(len(z1))]).T Y = x0[1:] a, b = np.linalg.lstsq(B, Y, rcond=None)[0] c = b / a x1_hat = np.empty(len(x0) + pred_len) for k in range(len(x0) + pred_len): x1_hat[k] = (x0[0] - c) * np.exp(-a * k) + c x0_hat = np.concatenate([[x0[0]], np.diff(x1_hat)]) return x0_hat[:len(x0)], x0_hat[len(x0):]这段代码的核心是两步:第一步对原始序列做累加,把波动较大的数据变成近似指数增长的序列;第二步通过最小二乘估计出发展系数 a 和灰作用量 b,再用指数函数还原预测值。使用时要观察 a 的绝对值,一般要求小于 0.3,预测精度才可接受,大于 0.5 时模型基本不能用于中长期预测。输出结果里前一段是拟合值,后一段是预测值,写论文时要画出“原始值+拟合值+预测值”三线对比图,评阅看到这张图就知道你确实跑通了模型,而不是空谈方法。
4.3 评价模型:层次分析法、熵权法与 TOPSIS 怎么串起来
评价类赛题的核心是权重从哪来。层次分析法是主观赋权,靠专家打分构造判断矩阵;熵权法是根据数据离散程度自动算权重,数据波动越大权重越高;TOPSIS 则是在拿到权重后对方案做排序。一道完整的评价题通常把三者串起来用:先用层次分析法得到主观权重,再用熵权法得到客观权重,最后组合成一个综合权重并套 TOPSIS。
层次分析法最容易翻车的地方是一致性检验。构造好判断矩阵后,必须计算最大特征值、一致性指标 CI 和一致性比率 CR,CR 小于 0.1 才认为矩阵打分是合理的,否则要重新调整矩阵里的比值。
import numpy as np A = np.array([[1, 3, 1/2], [1/3, 1, 1/4], [2, 4, 1]], dtype=float) eigvals = np.linalg.eigvals(A) lambda_max = np.max(eigvals.real) n = A.shape[0] CI = (lambda_max - n) / (n - 1) RI = {1: 0, 2: 0, 3: 0.58, 4: 0.9, 5: 1.12} CR = CI / RI[n] print("CI:", CI, "CR:", CR)这段代码里 RI 是随机一致性指标,只跟矩阵阶数有关,n 等于 3 时取 0.58。跑出 CR 大于 0.1 时,回到判断矩阵里找数值最离谱的比值重新打分,通常是两两比较时出现“甲比乙重要三倍,乙比丙重要两倍,甲却只比丙重要一点五倍”这类逻辑矛盾。熵权法相对简单,只需要对指标做归一化,再计算信息熵,权重和信息熵成反比,即某个指标所有样本取值都一样时,它不提供区分信息,权重应趋近于零。
4.4 真题演练:一项评价任务的完整执行顺序
评价题答题时容易写成“用了层次分析法选出了最佳方案”一句话带过,这是最亏的写法。完整执行顺序应该是:先明确评价对象和指标体系,再构建判断矩阵并做一致性检验,接着用熵权法算客观权重并与主观权重结合,最后用 TOPSIS 计算各方案与理想解的接近程度。
假设要对五个方案进行优选,指标包括成本、效率、风险、满意度。第一步把五个方案的原始数据整理成矩阵;第二步对成本和风险这类反向指标做正向化处理;第三步用熵权法算出四个指标的权重;第四步把权重乘到标准化数据上;第五步求正理想解和负理想解,计算每个方案的相对贴近度,最后按贴近度排序。你还应该在论文里放一张排序对比表,列出每个方案在四项指标下的得分和最终排序,让评委一眼看到结论的生成过程。评价类题的高分要点不是模型复杂,而是每一步都有据可依,权重来源说得清,排序结果经得起追问。
5. 失分点:批改中最常见的5类错误与正确写法
5.1 摘要写成算法菜单:评委不知道你的模型贡献在哪
错在哪:摘要开头就是“本文使用了层次分析法、灰色预测、遗传算法、卷积神经网络”,罗列了一堆模型名。为什么错:评委读摘要的目的是在十秒内知道题目是什么、你给出了什么核心结果,你堆模型名等于没说。这类题通常这么答:摘要第一句写问题背景和你的任务,第二句写你建立的主模型,第三句写关键求解结果,第四句写灵敏度或验证结论。顺序是“问题—模型—结果—验证”,不是“模型—模型—模型”。
5.2 模型假设是凑字数:后文根本用不上
错在哪:假设部分写了三行“假设数据准确、假设市场稳定、假设无突发情况”,但正文模型里完全没用到这些假设。为什么错:评阅会默认你的每一条假设都在消解建模风险,写了不用的假设说明你对问题的理解是分裂的。怎么答对:每写一条假设都补一句“该假设简化了……,在灵敏度分析中将检验其影响”,并把对应参数单独拎出来做分析。假设的数量不是越多越好,而是每条都必须与模型和后续验证联动。
5.3 数据清洗不做记录:结果一出来就说不清来源
错在哪:直接在模型里灌入原始数据,跑出来的结果很离谱,又找不到原因是数据里有缺失还是异常值。为什么错:数据预处理是预测类题目的重要得分点,你不展示清洗记录,评委就无法判断你的结果可信度。怎么答对:正文单列一小节“数据预处理”,用一张表写出每列缺失比例、处理方式、异常值个数,哪怕只有四行也要交代清楚。这是成本最低的规范动作,却能避免大量无谓扣分。
5.4 灵敏度分析等于换个参数跑两遍:没有结论
错在哪:把某个系数增大减小百分之十,输出结果变化表,然后写一句“结果稳定,模型可靠”。为什么错:灵敏度分析回答的是“参数改变会不会让结论失效”,不是“参数改变结果会不会变”。怎么答对:选两个关键参数,写下参数变到哪个临界值时最优决策翻转,比如人工工时降到 10 小时以下排产方案改变,然后说明这个临界现实中有没有可能出现。这样评阅才会认可你的模型有实际解释力。
5.5 代码和论文是两套东西:评委想看的注释和结果图都没有
错在哪:论文里大段贴代码,没有注释,没有输出结果,更没解读结果,评委根本不知道代码跑通了没有。为什么错:评阅时间有限,代码只是论证模型的一个辅助证据,你要提供的是“代码能复现”的证据链。怎么答对:只贴核心求解代码段,每段控制在十到十五行,代码前后各写一段文字,前面说明这段代码在求解哪个模型,后面贴出输出结果并解释经济或工程含义。把完整代码放附录,正文永远只留可读性最强的片段。
6. 赛时答题流程与考前押题:从读题到提交的稳定打法
6.1 三天时间怎么分:读题、建模、求解、成文
赛时最怕的不是题目难,而是时间分配失控,前两题做完第三题只剩两小时。推荐一套节奏:第一天上午只读题和定类,把三个任务块的模型族确定下来;第一天下午做数据清洗和原型求解,先让代码跑通一个小规模版本;第二天上午完成主模型的全部求解和灵敏度分析;第二天下午开始写论文主体,边写边补图表;第三天上午集中做结果验证和模型对比;第三天下午只做摘要、检查格式和检查数据一致性。
| 时间阶段 | 主要任务 | 完成标志 |
|---|---|---|
| 第1天上午 | 读题、定类、选主模型 | 三问对应模型族确定 |
| 第1天下午 | 数据清洗、小规模原型 | 原型代码跑通 |
| 第2天上午 | 完整求解、灵敏度分析 | 拿到关键数值结果 |
| 第2天下午 | 论文主体、图表制作 | 三个模型的论文初稿完成 |
| 第3天 | 摘要、检查、统一格式 | 可提交最终版 |
6.2 考前押题方向:三个大概率出现的赛题类型
结合近年赛题风向,三个方向值得重点准备:资源调度与方案优化类,通常结合成本最低和碳排放约束;时序数据预测类,题干会给较长周期数据,要求预测未来并做置信区间;综合评价与决策类,多出现在方案比选和满意度评估场景。这些方向有一个共同特征:都强调数据驱动和可解释性。你不需要押中具体题目,只需要把这三类题的标准建模流程各过三遍,达到看到题就能条件反射写出参数表和模型的目标。
6.3 提交前30分钟的止损清单
最后半小时不要写新代码,只做清单式检查。摘要四要素是否齐全;所有图表是否有编号和标题;模型假设是否被后文引用;代码输出结果与论文图表是否一致;每个问题是否都有明确结论;附录里的代码是否和正文版本一致。这六项检查完,基本能拦住九成低级失误。我从第一次参赛被评委指出“假设与正文脱节”之后,每次模拟训练都强制走一遍这个清单,从那以后再没在格式和一致性上翻过车。希望帮到你。
本文还有配套的精品资源,点击获取