每年寒假前后,总有一批人认认真真地守在电脑前,啃着几十页英文赛题,像过年赶工一样打一场为期四天的硬仗。这个比赛就是美赛——MCM/ICM数学建模竞赛。说来也很奇怪,很多拿过国内数模奖项的队伍,第一次参加美赛反而连H奖都拿得吃力。我见过不少队伍把精力全砸在模型复杂度上,结果论文被评审翻得飞快;也见过模型本身并不惊艳、但叙事完整、图表清晰的队伍,反而拿到Outstanding。美赛本质上不是单纯的数学能力比拼,而是一场“在有限时间内完成一个完整科研故事”的工程。
这篇文章想做的事很简单:把美赛从题目认知、赛前准备、选题决策、建模思路、代码实现、论文写作到四天时间的整体节奏全部梳理一遍。适合第一次准备美赛的本科队伍,也适合那些打过几次数模但总觉得美赛发挥不稳定的老手。我不会给你“万能模板”式的空话,能给到的都是能直接落到实操层面的具体做法,包括代码框架和写作排版的细节。
1. 美赛MCM/ICM的题目格局与评审偏好
1.1 六道题的真实画像
MCM和ICM合在一起,每年一共六道题,官方编号是A、B、C、D、E、F。很多队伍第一天的纠结不是“这道题怎么做”,而是“我们到底选哪道题”。所以先把六道题的底细摸清楚,比急着建模更重要。
MCM部分三道题:
- A题(连续型):通常涉及微分方程、物理机理、连续介质建模,比如结构受力、热传导、流体类问题。对数学推导能力要求高,代码往往是数值求解为主。
- B题(离散型):偏图论、离散优化、组合决策,比如资源调度、路径规划、供应链网络。要想拿稳,需要有较扎实的整数规划和启发式算法功底。
- C题(数据洞察型):给真实数据的概率很高,考数据清洗、特征工程、预测与分类、时间序列,有点像简化版的数据科学项目。近几年参与热度最高,因为门槛相对友好。
ICM部分三道题:
- D题(运筹学/网络科学):通常与交通网络、通信网络、物流调度相关,属于离散优化和网络分析的组合。
- E题(环境科学):环保、可持续性、资源分配,带有明显的政策与管理色彩。大量数据支撑,但最终做出来的模型要有现实可解释性。
- F题(政策/战略建模):六道题里最开放的,通常是社会、政策、未来战略话题,没有标准答案,写作占比极重,对结构化思维的要求很高。
我的建议是:如果你第一次参赛,优先在C、E、F三选一;如果你擅长物理机理推导,A题合适;如果你对图论优化有肌肉记忆,B题或D题更容易出彩。当然这不是绝对的,每年赛题难度也会波动,但大方向基本稳定。
1.2 评审视角:从摘要到原文的阅读路径
美赛的评审方式决定了论文的写法。一轮评审时,评委面前堆着一摞厚厚的论文,单篇正文上限25页(不含附录、参考文献、摘要),你能指望评委逐字读完吗?实际上,绝大多数评委的阅读路径是这样的:
先把所有论文的摘要页翻一遍,筛选出第一印象过关的;然后对这部分的论文翻正文,重点看模型是否清晰、假设是否合理、结果图表是否直观;最后才关注求解细节和数学表达。
也就是说,摘要不过关,正文连被认真看的机会都没有。许多国内数模赛事对摘要的要求远远没有美赛这么苛刻,这是参赛者最容易低估的地方。我后面会专门讲摘要怎么写,这里先记住一个结论:写美赛论文,摘要值得花掉整个比赛时间里的半天以上反复打磨。
1.3 美赛与国内赛的核心差异
在国内参加数模比赛,很多时候题目是“可解的”,答案是有标准参考泛式的。美赛则明显更开放,特别是E题和F题,你很难判断某个模型到底对不对,评审更在意“你的思路是否有说服力”。
另一个显著差异是写作权重。美赛的最终产出是一篇英语论文,语言表达、图表质量、段落逻辑直接影响奖项等级。代码虽然不要求提交,但你的正文里必须清晰地呈现模型求解过程和关键结果,代码只是背后的支撑。很多队伍觉得“代码跑通就完事了”,实际上代码跑通只是最底线,如何把结果组织成一个可信的研究故事才是高分的分水岭。
2. 赛前组队与备战:把时间花在刀刃上
2.1 三人分工不是“建模、编程、写作”那么简单
经典的三人分工是:一人建模、一人编程、一人写论文。但这个方案放到美赛里其实不够用,因为四天要完成的工作是高度耦合的。我见过最稳的结构是:
- 队长兼建模核心:负责选题方向、拆解问题、构建整体建模框架,同时把控时间节点。
- 编程主力:负责数据清洗、模型实现、调参、生成图表,必须熟练到“不查文档能写出常用函数的程度”。
- 写作统筹:负责论文框架、摘要、正文文字的逻辑衔接和语言润色,而不是最后才接手。
但这个分工不是让你三个人各干各的。我强调“角色”而不是“岗位”,意思是每个角色都有主责任,但讨论和决策必须三个人同时参与。真正打起来的时候,建模的也要去查数据格式,写论文的也要看懂模型输出的每张图,编程的也要了解论文结构才能知道代码要输出什么。三人三机一套思路,这句话是美赛队伍的核心心法。
2.2 赛前必备知识储备清单
美赛赛前不需要系统性刷完所有数学模型,那既不现实也不高效。更有用的做法是准备一个模型弹药库,按场景分类储备,赛前一周内把每一项过一遍熟悉度:
| 场景 | 备用模型/方法 | 常用工具 |
|---|---|---|
| 预测类 | 线性回归、ARIMA、随机森林、XGBoost、LSTM(简单场景) | Python:sklearn/statsmodels |
| 分类/评分类 | 逻辑回归、决策树、KNN、聚类(K-Means) | Python:sklearn |
| 优化/决策类 | 线性规划、整数规划、贪心、遗传算法、模拟退火 | Python:scipy.optimize / OR-Tools |
| 机理/连续类 | 微分方程建模、数值解、灵敏度分析 | Python:scipy.integrate / MATLAB |
| 评价/分析类 | 层次分析法(AHP)、熵权法、TOPSIS、灰色关联分析 | Python 或手算 |
这个表不是让你全背下来,而是提醒你比赛中遇到的90%的问题,都能在上述集合里找到初步的解决思路。最重要的是,每一项你要有一个“最小可用代码”的记忆。赛前把每个模型跑通一个Demo,比临时看书有用得多。
2.3 工具链要提前一天装好并试跑
比赛期间没时间折腾环境。建议提前做三件事:
- 配置Python环境,把常用的库一次性装好:pandas、numpy、matplotlib、seaborn、scikit-learn、scipy、statsmodels。有条件的话再装上openpyxl和xlrd用于Excel读写。
- 确定LaTeX写作方案。美赛推荐用LaTeX排版,因为公式和表格排版效果好,也有官方模板。需要提前下载一份往年的LaTeX模板,把标题、摘要、正文样式跑通一遍。
- 建立共享网盘同步文件夹。建议按“代码/数据/图表/论文/参考文献”五类建目录,比赛期间所有产出统一命名,避免最后交卷时出现版本混乱。别小看这一步,我见过不止一支队伍在最后两小时到处找最新版论文文件。
3. 选题决策:如何在一小时内锁定合适的题目
3.1 选题前先给队伍做“能力画像”
选题不是看哪道题“感觉好写”,而是看你们这支队伍“擅长什么”。我建议赛前第一件事就是三个人各自填写一个小问卷:
- 谁的数学推导能力强?能接受A题的微分方程嘛?
- 谁写过数据处理类的完整项目?熟悉pandas的清洗和透视操作吗?
- 谁的英文写作功底好?愿意承担摘要和文字润色吗?
- 谁对优化算法有手感?写过遗传算法或模拟退火吗?
把答案汇总后,基本就能确定强力位置在“连续、离散、数据、开放写作”中的哪一个。美赛辛辛苦苦打四天,最亏的就是选了一道和队伍优势完全拧着的题目。
3.2 六道题的快速筛查法
拿到赛题后的第一个小时,不要急着看数据文件,先做两轮筛查。
第一轮是关键词扫描:快速浏览六道题的Task Description,在草稿纸上记下每道题的目标动词(预测?优化?构建决策?)、数据提供形式(是否含CSV文件)、输出要求(策略建议?政策报告?评估模型?)。这个过程大概20分钟就能完成,能帮你把不合适的题直接划掉。
第二轮是难度匹配:把剩下的两三道题放到队伍能力画像里对比。如果你们的数据基础好,C题无疑胜率最高;如果写作能力强且愿意读文献,F题和E题是拿M奖以上不错的候选;如果队伍有物理背景,A题能最大限度发挥特长。
这里提醒一句:美赛有一个明显的特点,就是“数据题不单纯考模型,开放题不单纯考写作”。C题表面是预测准确率,实际还要看你如何塑造一个完整的数据故事;F题表面是写报告,其实需要你设计出令人信服的指标体系和逻辑闭环。所以千万不要只看题型名称就拍板。
3.3 确定题目后的首个两小时任务清单
一旦选定题目,前两个小时要做的事情非常固定:
- 把官方PDF翻译成中文要点版,逐条列出“我们要解决的问题是什么”“最后需要输出什么”。
- 把附带数据文件全部下载并存档,先记录文件格式、行数、列名,不必深入分析。
- 采集三到五篇相关的可靠文献或行业报告,作为引言和背景知识的素材。
- 初步列出“建模任务清单”,按问题拆成3~5个子问题,给每个子问题预估完成时间和对应模型方向。
这个清单做完,整个比赛的主体框架就已经在你们面前了。剩下的四天,就是不断填充和打磨这个框架的过程。
4. 从问题到模型的完整思路链
4.1 拆题:把赛题文字翻译成建模任务
很多队伍在建模前犯的致命错误是——把题面翻译成中文后,直接开始“套模型”。正确的做法是先做语义拆解,把题目的自然语言描述反向翻译成结构化的建模问题。
举个例子,一道C题如果把“识别影响因子并给出预测模型”拆开,实际上包含三类任务:
- 描述性任务:这些数据的分布长什么样?哪些变量与目标变量显著相关?
- 预测性任务:用什么模型做未来结果的估计?如何做训练集/测试集划分?
- 决策性任务:给出解释和策略,说明模型的局限性以及对不同场景的适应程度。
展开成这种结构后,每个任务都对应一个或一组候选模型,你也就自然知道时间该往哪里投。拆题的最高标准是:三个人分别复述一遍“这道题到底要我们做什么”,如果三个人理解的答案一致,说明拆题到位了;如果不一致,请务必回到原文继续抠细节,不要急着建模。
4.2 建模框架:数据、机理与启发式三条路线
美赛建模没有固定套路,但绝大多数题目最终会走向三条路线中的一条或组合:
- 数据驱动路线:靠统计分析、机器学习模型从数据中发现规律。适合C题和E题,主要工作集中在特征工程、模型对比和结果可视化上。
- 机理驱动路线:从物理规律或系统运行机制出发,用偏微分方程、微分方程、人口模型、动力学方程刻画过程。适合A题,也适合B/D题中网络调度问题的约束建模部分。
- 启发式优化路线:当问题规模大到精确解法跑不动时,用遗传算法、粒子群、模拟退火、贪婪+局部搜索等技术找近似最优解。适合B题和D题。
实战中,你要做的不是选一条走到黑,而是判断“这个子问题最自然的数学描述是什么,然后用对应的思路切入”。真正拿高分的队伍,往往是把多条路线混搭成一个完整的建模链,比如先做机理分析定框架,再用数据拟合参数,最后用启发式算法求解。
4.3 模型之间的衔接与灵敏度分析
模型的“衔接”是美赛论文里特别容易露怯的地方。很多队伍做了A模型、B模型、C模型,但说不清楚为什么要做多个模型,以及它们之间的逻辑关系是什么。
更稳健的做法是采用“基础模型+改进模型+对比验证”的三段式结构。
- 基础模型:保证可解释、好实现,先把流程跑通,做出基线结果。
- 改进模型:针对基础模型的不足,引入更复杂的机制或更精细的参数,得到更好的结果。
- 对比验证:用两种模型在相同数据上的表现对比,证明你的改进有效。
灵敏度分析也是美赛评审的点位,建议至少要做两处:一是参数扰动分析,看看主要参数上下浮动10%~20%时结果变化是否剧烈;二是数据剔除分析,看看去掉一些关键样本后结论是否稳健。不要把它当作可有可无的附件,很多评审不看完整个模型,但会专门扫灵敏度分析的图表来评估你对模型的把握程度。
5. 代码实现:不是炫技而是服务叙事
5.1 代码在美赛中的真实定位
美赛不需要提交源码,这句话让很多人误以为代码不重要。实际恰恰相反:代码直接决定图表质量,图表直接决定论文说服力。评审看不懂你的每个函数,但一定能看出你的图表是“精心设计”还是“随手一plot”。
所以在比赛里写代码,唯一的标准是:要能快速、批量、可靠地把模型结果转换为论文素材。这里我不建议在比赛期间写那种精巧得能封装的框架,也不建议花大量时间对一个小模型做超参数调优。能用现成库就用现成库,能画直方图散点图就先画,先把论文能用的图攒出来,后面有时间再精细化。
5.2 一个“够用的代码框架”
以Python为例,我建议把代码按照数据流程组织成四个脚本模块,而不是一个长长的notebook:
# module_0_data_loading.py # 数据装载与基础清洗 import pandas as pd import numpy as np df = pd.read_csv("data.csv") print(df.shape, df.columns.tolist()) print(df.isna().sum()) df = df.dropna(subset=["target"]) # 按需调整清洗逻辑# module_1_eda.py # 快速探索性分析与可视化 import matplotlib.pyplot as plt import seaborn as sns sns.pairplot(df, vars=["var1", "var2", "target"]) plt.savefig("fig1_pairplot.png", dpi=200) corr = df.corr() sns.heatmap(corr, annot=True, cmap="RdBu") plt.savefig("fig2_corr.png", dpi=200)# module_2_model.py # 模型训练与对比 from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error X = df.drop(columns=["target"]) y = df["target"] X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) model = RandomForestRegressor(n_estimators=300, random_state=42) model.fit(X_train, y_train) pred = model.predict(X_test) print("MAE:", mean_absolute_error(y_test, pred))# module_3_report_plots.py # 产出论文用图:预测vs真实值、残差图、特征重要性 import matplotlib.pyplot as plt # 特征重要性 imp = pd.Series(model.feature_importances_, index=X.columns).sort_values() imp.plot.barh() plt.tight_layout() plt.savefig("fig3_importance.png", dpi=200)这个框架虽然基础,但好处很明显:模块之间解耦,一个人跑数据处理的时候另一个人可以同时写模型部分;每个模块都可以独立运行,产出图表自动存入charts文件夹。四天时间完全够支撑论文的素材供给。
5.3 三类高效率代码技巧
结合我自己的参赛经历,有三类技巧对美赛提效非常明显:
- 函数化一切可能重复的操作。比如“读取一份新的数据并做分布统计”“绘制模型预测对比图”这类操作,一旦写成函数,后面反复调用时省的时间远超写函数的时间。
- 用字典或批量方式管理多模型实验。不要为每个模型单独写一段训练代码,而是把模型类名、参数字典放到一个列表里,用循环跑对比,结果直接汇总成一张表格。
- 保存中间结果。每跑完一个阶段,把处理后的DataFrame和图表立即保存到对应文件夹,不要留在内存里等下次一起输出。四天里中断、重跑、换电脑都极其常见,中间结果是你最好的保险。
5.4 可视化是代码成果的出口
论文里图表分两种:一种是“解释型图表”,帮助评审理解数据和模型结构,比如相关性热力图、数据分布图、模型结构图;另一种是“结论型图表”,直接体现你的成果,比如预测对比曲线、误差热力图、优化收敛图、灵敏度分析图。
这两类图表的美观度要求完全不同。解释型图表以清晰为主,结论型图表则要讲究配色和标注。我建议队伍里至少安排一个人熟练掌握matplotlib和seaborn的常用配置,包括设置字体、坐标轴、图例、注释箭头这些基本操作。图表绝对不要用默认样式,稍加调整后,整篇论文的专业度会立刻上一个台阶。
6. 论文写作:从摘要到附录的呈现艺术
6.1 摘要页:一页纸决定第一印象
美赛摘要的要求很明确:在一页以内,用最精炼的语言说清楚你们解决的问题、建立的模型、主要求解方法和关键结论。摘要中的结论必须带数字,比如“预测模型的平均绝对误差为0.023”“优化方案的排放量相较于基准方案降低了18.6%”。只写“我们用了随机森林模型”不写精度,等于白写。
我的摘要写作模板一般是这样:
- 第一句:声明你们解决的问题与背景,一句带过,不要展开。
- 第二段:依次说明每个子问题对应的模型,说清是“用什么数据/特征,建立了什么模型,得到什么结果”。
- 第三段:列出最核心的结论和数字,加上方案的亮点。
- 结尾:补充灵敏度分析的结论,说明模型稳健性。
摘要最后一定要三个人一起逐字读三遍,改掉任何可能让评审困惑的表达。如果摘要中提到了模型但正文中没有给出完整定义,或者给出了结论但正文中没有对应的图表,这些都是交卷前的低级雷区。
6.2 正文七段式结构怎么排
美赛正文结构大同小异,但我建议按照“七段式”来组织:
- Introduction与Restatement of the Problem:重述问题,不要复制题目,换成自己的理解。
- Assumptions:列出所有假设,并解释每条假设的合理性。3~5条为宜,太多显得脱离实际,太少会显得考虑不周。
- Model(主模型部分):这是核心段落。按“建模思路→数学表达→求解方法→结果展示”的顺序来写,每个重要公式都要跟一句文字解释。
- Solution与Discussion:对模型求解的结果展开讨论,结合题目的实际背景解释数字含义。
- Sensitivity Analysis:用图表展示参数波动的影响,并写一段话分析模型稳定性。
- Strengths and Weaknesses:既要写优点,也要写缺点,批评要中肯,不要写成空洞的自夸。
- Conclusion:总结结论,适当指出模型的适用范围和未来改进方向。
这个顺序的好处是,评审在任何一段停下来,都能快速定位想找的内容。另外记得每张图和每个表格都要有编号和标题,正文里必须引用。引用格式用“Figure 3”“Table 2”的形式,不要写“下图”这种模糊说法。
6.3 LaTeX排版与图表规范细节
排版这件事,不要比赛当天再研究。提前一天把模板跑通,给团队成员各分配一个章节的小节,用在线LaTeX协作平台进行同步编辑。
几个排版细节非常加分:
- 公式编号自动生成,且正文中引用到的每个公式都要有编号。
- 表格一律用三线表样式,不要用花哨的竖线。
- 图片统一采用高分辨率导出(200dpi以上),图片内部文字清晰可读。
- 附录目录中放置关键代码和额外图表,但正文建议控制在25页以内。
还有一个很容易被忽略的点:参考文献格式必须统一。美赛不强制特定引用格式,但团队里不要出现两种引用风格混合的情况。建议赛前约定用“作者. 标题. 期刊/机构, 年份.”的标准格式,并且把常见的引用模板提前存到共享文档中。
7. 比赛期96小时的节奏与避坑
7.1 四天三夜的时间分配表
美赛从周五早晨开始,到周一晚上截止。把时间切碎来看,最稳定的节奏大概是这样的:
| 时间段 | 核心任务 | 验收标准 |
|---|---|---|
| 第1天(选题与起步) | 六题扫描、选一题、拆题、数据探索、建框架 | 完成选题、建模任务清单、数据初步EDA |
| 第2天(主模型与求解) | 实现基础模型、讨论改进方向、产出第一批图表 | 至少两个模型跑通,核心结果图表已出 |
| 第3天(完善与写作) | 补充灵敏度分析、正文主体完成、摘要初稿 | 摘要初稿、正文结构完整、图表齐全 |
| 第4天(润色与交卷) | 最终摘要打磨、全文语言润色、排版细节 | 全文可交、图表引用完整、检查清单通过 |
这个表最大的价值是“验收标准”一栏。每完成一个阶段,对照看看是否达标,能防止队伍在某个子问题上陷入过深——美赛最怕的不是模型不够好,而是时间耗尽了论文还没写完。
7.2 高频踩坑复盘
根据我多年观察和亲历,下面是几个最高频的失分原因:
- 图表无法自解释。图表没有标题、没有轴标签、没有图例,评审完全看不懂图上画的是什么。
- 摘要和正文脱节。摘要宣称用了三种模型,正文里却找不到第三个模型的完整展现。
- 假设部分敷衍。只写“假设数据准确”“假设样本独立”,没有结合题目背景的解释,评审一看就知道是凑的。
- 灵敏度分析缺失或走过场。很多时候不是没有时间做,而是忘了做。建议在第三天中午前就完成灵敏度分析初稿。
- 三个人最后各自为战。交卷前一天还在统一术语、统一符号、统一图表风格,几乎必然导致论文前后不一致。
这些坑补起来其实不难,难的是提前意识到它们的存在。读到这里,你已经比很多参赛队领先一步了。
7.3 交卷前两小时的强制检查清单
最后两小时不要安排任何新的建模任务,必须切换到纯检查模式。我在每次比赛冲刺期都会把下面这一列问题放出来逐条打勾:
- 所有图片是否在文中引用?编号是否连续?
- 表格是否包含关键结果,是否在正文中被提到?
- 摘要页是否控制在单页?是否包含具体数字结论?
- 参考文献是否全部在正文中引用过,格式是否统一?
- 附录中的代码是否和正文描述一致?
- PDF文件是否可以正常打开?是否按官方要求命名并转换成最终提交文件?
- 是否已经准备官方要求的控制页(Control Sheet)和相关提交材料?
这套检查清单基本涵盖了过去几年踩过的大部分雷。建议打印出来或者贴到共享文档置顶,交卷前挨个确认,不要凭感觉判断。
8. 赛后复盘与几点真实体会
8.1 无论拿不拿奖都要做的复盘
比赛结束不等于这件事结束了。拿奖不拿奖,我建议每支队伍在两天内做一次认真的复盘,把下面三个问题写下来:
- 这次比赛的得分点和失分点分别是什么?我们的哪一步决策起了关键作用?
- 我们的分工方式是否符合队伍节奏?下次比赛是否要调整?
- 我们的模型与论文中,有没有一个亮点是真正属于自己的?还是完全来自现成模板?
特别是最后一点。很多队伍范文读多了,写出来的论文千篇一律,评审没有理由给高分。
8.2 给下一届参赛者的话
如果往届队员写心得,大家往往会异口同声地感叹“时间不够用”。但真正打过一次后你会发现,美赛真正稀缺的,不是时间,而是决断力。什么时候定选题不再反复横跳,什么时候停止调参转为写作,什么时候放弃一个能加分的想法来保护已有的成果——这些“收手”的时机,远比建模能力本身更能决定你的最终名次。
回头看这些年带过的队伍和身边获奖的朋友,他们的共同点是:没有人四天都在无休止地推进模型,但每个人心里都有一个清晰的“今天必须完成什么”的底线。数学建模竞赛毕竟是竞赛,比的不只是谁懂得多,更是谁在压力下输出得更稳定。
写到这里,我最后想分享一个很小的技巧:把比赛过程中每完成一步的图和数据都顺手存到网盘,并且用“日期+内容”命名。四天后的你,一定会感谢这个习惯。如果这篇文章能让你在拿到赛题的第一小时多冷静一分钟,能让你在决定摘要措辞时多斟酌一轮,那它就没有白写。参赛愉快。