2026年的美赛备赛窗口又打开了。作为一个带过好几届队伍的“老建模人”每年这时候都会被问到同一个问题美赛到底该怎么准备思路怎么找代码要写到什么程度这篇帖子我想换个角度回答不绕圈子、不灌鸡汤把我自己的备赛思路和沉淀下来的代码资产摊开讲。我把它定位成一个持续更新的备赛笔记随着我自己刷题、复盘、优化代码库会陆续把新内容和坑点补进去。不管你是第一次接触美赛还是想冲一下Outstanding的熟面孔这篇内容都值得你花十分钟看完顺手存下几张代码模板。先交代清楚适用范围。美赛的全称是美国大学生数学建模竞赛MCM/ICM一次比赛持续四天左右参赛队伍三人一组从六道题里选一道针对一个开放式问题建立数学模型、求解、验证最后提交一篇英文论文同时把支撑代码打包上传。它和传统考试最大的区别在于没有标准答案你面对的是一个真实世界中可能压根没有现成数据的问题。你要做的不是“解题”而是“构建一套解决问题的流程”。适合谁来读正在备赛的美赛队伍、准备考研复试想补充竞赛经历的同学、想提升数据分析和建模能力的非数学专业学生都适用。这篇帖子的主线是思路先行模型跟进代码兜底论文收口。1. 2026美赛备赛的整体思路拆解1.1 先想清楚美赛到底在考什么很多人一上来就纠结“我们队能不能拿奖”“哪个题简单一点”我觉得这都是顺序问题。美赛真正考察的是在有限时间内把一个模糊的开放式问题转化成可计算、可解释、可复现的模型链条。这个链条里有四个环节问题重述、模型建立、模型求解、结果转述。你翻任何一份获奖论文都能看到这四步差别只在于每一步做得是否扎实。我见过太多队伍第一天拿到题目读了两遍就开始写代码结果写了一整天发现方向不对推倒重来。方向感比速度重要得多。所谓思路不是赛场上灵光一闪而是赛前对建模流程的肌肉记忆看到问题先判断它属于哪一类再决定用哪套模型体系然后是数据从哪来、假设怎么设、结果怎么检验。把这套流程想明白四天时间其实是够用的。一个容易被忽略的事实是美赛的评阅高度依赖论文呈现裁判不会真的去跑你的代码。所以“做出来”和“让别人相信你做出来了”是两件事。前者靠建模和编程能力后者靠清晰的逻辑、规范的可视化和严谨的结论。这两个能力一个都不能少。1.2 六道赛题的分工与选题策略美赛六道题的分类这些年一直很稳定我把它整理成了一张表方便你们对照着选。表格题号所属竞赛典型特点适合队伍AMCM 连续型物理/工程问题常用微分方程、数值模拟有物理直觉、数学功底扎实的队伍BMCM 离散型图论/离散优化涉及路径规划、调度擅长算法设计、编程强的队伍CMCM 数据洞察大数据分析、预测、模式识别熟悉机器学习、特征工程的队伍DICM 运筹/网络网络建模、资源配置重视决策优化有运筹学基础、建模能力全面的队伍EICM 环境/可持续环境评价、指标体系和政策结合擅长综合评价模型、文献阅读量大的队伍FICM 政策/设计政策评估、方案设计问题开放度最高思维发散、写作逻辑强的队伍先说一个普遍规律近几届报名人数最多的通常是C题因为数据题思路明确、套路成熟上手体验对新手最友好。但对应的竞争也是最激烈的。A题历年来都是“硬骨头”一旦啃下来模型的含金量和区分度都很高。E题和F题文字量大但模型往往不复杂更考验阅读理解能力和论文写作功底。选题目不能只看难易“这道题自己队伍能不能形成差异化优势”才是核心。如果队伍里有人数学能力强优先考虑A题如果三个人都代码熟练C题更方便做出清晰的成果如果写作能力突出E、F题可以把“讲故事”的能力发挥到极致。选完题就不要回头别在第一天下午看到别的题有想法就换这是四天赛程里最大的时间黑洞。1.3 备赛阶段的任务分解我不建议赛前一个月才开始刷题更不建议完全不刷题直接上场。有效的备赛期可以拆成三块。第一块是算法和代码语料准备阶段目标是让自己拥有一套“开箱即用”的代码库数学上理解每个模型能干什么、不能干什么。第二块是真题限时模拟阶段挑一两道往年题目严格按照四天时间走一遍全流程体验一下第三天晚上论文还没写完的焦虑感。第三块是论文模板预置阶段摘要结构、排版样式、图表配色提前定好省得赛时在格式上浪费时间。用游戏举例子刷题是练习“操作”准备代码库是提前“买装备”定论文模板是设置“快捷键”。很多人只刷题不存代码每次都现场敲还有人只存代码不模拟真上战场才发现自己连题目都读不完。三条腿都齐了四天时间才真正属于你。2. 赛前必须备齐的“模型武器库”与代码资产2.1 模型体系别贪多要成体系美赛四天里临时翻书学新模型是不现实的。赛前你要做的不是“会的模型越多越好”而是把每个模型练到“拿来就能改、改完就能跑”的状态。以我的经验准备四类模型体系就足够覆盖大多数赛题评价类、预测类、优化类、统计分析类。评价类模型里层次分析、熵权法、TOPSIS是组合拳常用于E题和F题的指标体系构建。预测类模型建议准备三档简单的线性回归和灰色预测、中等的随机森林和XGBoost、复杂一点的时间序列和神经网络模型C题几乎必用其中一种。优化类模型重点掌握线性规划、整数规划的基础写法再了解一点遗传算法的调包用法B题和D题常用。统计类模型则负责敏感性分析、显著性检验和结果稳健性分析这是每篇论文都需要的“安全网”。把模型当成工具包里的螺丝刀你不用拥有全系列的型号但常用的几个必须称手。真正拉开差距的往往不是模型多高端而是你能不能把模型和问题匹配得恰到好处。2.2 Python代码资产模板直接可复用的骨架我个人的原则是所有建模代码统一用Python理由很简单数据清洗、机器学习、可视化生态都很完整。下面这套代码骨架是我每次比赛前都会跑一遍确认可用的你可以直接抄到自己队伍的项目里。首先是项目初始化部分把绘图主题和中文字体一次性设置好避免出图时乱码import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from scipy.optimize import linprog from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from sklearn.preprocessing import StandardScaler from sklearn.model_selection import cross_val_score # 画图统一风格 plt.rcParams[font.sans-serif] [SimHei] # 视系统调整字体 plt.rcParams[axes.unicode_minus] False sns.set_theme(stylewhitegrid, palettemuted)其次是数据清洗与探索。美赛给的数据质量参差不齐缺失值不能一删了之要看缺失比例和字段含义def load_data(path, sheet_nameNone): if path.endswith(.csv): return pd.read_csv(path) return pd.read_excel(path, sheet_namesheet_name) def clean_data(df, date_colNone): # 缺失值比例统计 missing_ratio df.isnull().mean() drop_cols missing_ratio[missing_ratio 0.5].index df df.drop(columnsdrop_cols) # 数值列填充中位数分类列填充众数 num_cols df.select_dtypes(include[np.number]).columns cat_cols df.select_dtypes(include[object]).columns df[num_cols] df[num_cols].fillna(df[num_cols].median()) df[cat_cols] df[cat_cols].fillna(df[cat_cols].mode().iloc[0]) return df然后是几个高频模型模板。熵权TOPSIS在评价类赛题中出现频率很高我把核心函数放在一块def entropy_weight(df): # 归一化正向指标 data df.values norm_data (data - data.min(axis0)) / (data.max(axis0) - data.min(axis0) 1e-8) # 计算熵值 m, n norm_data.shape p norm_data / (norm_data.sum(axis0) 1e-8) e -np.sum(p * np.log(p 1e-8), axis0) / np.log(m) w (1 - e) / (1 - e).sum() return w def topsis_score(df, w): data df.values norm_data (data - data.min(axis0)) / (data.max(axis0) - data.min(axis0) 1e-8) weighted norm_data * w ideal_best weighted.max(axis0) ideal_worst weighted.min(axis0) d_best np.sqrt(((weighted - ideal_best) ** 2).sum(axis1)) d_worst np.sqrt(((weighted - ideal_worst) ** 2).sum(axis1)) return d_worst / (d_best d_worst 1e-8)预测模型里随机森林往往比线性回归更能应付美赛里“关系不明朗”的数据但要注意可解释性输出def rf_predict(X_train, y_train, X_test): model RandomForestRegressor(n_estimators300, max_depthNone, random_state42) model.fit(X_train, y_train) pred model.predict(X_test) importance pd.Series(model.feature_importances_, indexX_train.columns) return pred, importance优化模型以线性规划为例。注意美赛的问题往往是整数决策变量需要在bounds里限制变量的取值范围并用整数规划库如pulpfrom pulp import LpProblem, LpMaximize, LpVariable, LpStatus def solve_lp(costs, supplies, demands): n_src len(supplies) n_dst len(demands) prob LpProblem(Transport_Problem, LpMaximize) x [[LpVariable(fx_{i}_{j}, lowBound0, catInteger) for j in range(n_dst)] for i in range(n_src)] for i in range(n_src): prob sum(x[i][j] for j in range(n_dst)) supplies[i] for j in range(n_dst): prob sum(x[i][j] for i in range(n_src)) demands[j] prob sum(costs[i][j] * x[i][j] for i in range(n_src) for j in range(n_dst)) prob.solve() solution [[x[i][j].value() for j in range(n_dst)] for i in range(n_src)] return LpStatus[prob.status], solution这套代码骨架不算花哨但胜在稳定。我每次比赛都直接复制出一份按题目改改数据路径和模型参数就能用。你要做的就是把每一段跑通、看懂千万不要赛前只收藏不执行。2.3 代码文件的组织方式代码混乱是美赛最常见的翻车点之一。最后提交时评委虽然不跑代码但支撑材料质量会侧面反映队伍的严谨度。我的项目目录一般长这样project/ ├── data/ │ ├── raw/ │ └── processed/ ├── code/ │ ├── 01_clean.py │ ├── 02_models.py │ ├── 03_optimization.py │ └── 04_plot.py ├── output/ │ ├── figures/ │ └── results.csv └── README.md命名规范就一个原则按执行顺序编号让任何人拿到你的文件夹都能顺着号码看完整个流程。千万别起final_final_v2.py这种名字比赛到第三天你会疯掉的不是比喻是真疯。README里简要说清楚每个脚本的作用和依赖库最后打包上传之前跑一遍全流程确认无报错。3. 四天赛程实操从拿到题目到提交的完整节奏3.1 第1天选题、定框架、出第一版模型不要把第一天浪费在反复换题上。上午通读六道题和队友交换一次想法最晚下午两点前必须锁定题目。锁题之后立刻做两件事一是快速检索相关文献二是把问题的核心变量列出来。文献不一定要精读但至少搞明白这类问题常用的建模方法是什么。以E题为例如果题目涉及碳排放评价你至少要清楚碳足迹、生命周期评价、综合评价模型这些基本概念。第一天结束前最好能完成模型框架的第一版。什么叫框架就是写出模型的输入、输出和关键假设。比如C题确定目标变量是“需求量”特征有哪些用什么模型这些都白纸黑字写下来。这一步的意义在于让全队对“我们要做什么、怎么做”达成共识避免第二天出现一个人在做预测、另一个人在写评价模型的错位。很多队伍第一天熬夜写代码第二天进度反而慢因为思路没理顺。第一天晚上宁可少写代码也要把问题分析的逻辑链条理顺。模型可以第二第三天迭代“我们到底在回答什么问题”必须从第一天起就清晰。3.2 第2到第3天模型求解、结果分析、论文同步推进第二第三天进入最核心的“产出期”。我强烈建议论文不要留到最后一天再写而是从第二天就开始动笔。原因很简单文字是你梳理思路的工具写着写着才能发现自己模型的漏洞。分工上三个人可以拆成两条线一人主攻代码求解一人主攻结果分析一人主攻论文写作但每天早晚必须碰头同步进度。模型求解时我有一条经验先跑通一个简单版本再逐步加复杂度。比如第一版先用线性回归第二版换成随机森林后续再考虑要不要上更复杂的模型。很多人一上来就想用深度学习结果数据量不够、调参半天没结果白白损失半天时间。先完成再完美这条经验在美赛现场百试不爽。结果分析不能光贴出一张图。裁判想看的是你如何解释结果、如何验证模型的合理性。建议至少做一次敏感性分析也就是让关键参数上下浮动10%到20%观察结果变化幅度。这个动作很加分因为它证明你的模型不是“黑箱”而是一套经得起推敲的决策工具。3.3 最后12小时摘要、排版、检查、提交最后半天是最考验心态的阶段。不管前面三天进度如何最后12小时必须把重心完全转移到论文上。先留出至少两小时写摘要这是全篇最重要的部分很多评委只细读摘要和结论。摘要的结构我推荐五句话问题背景、你的方法、核心结果、灵敏度表现、最终建议。每句话都要干货不要出现空泛的“本论文提出了一个模型”这种废话。然后是格式检查列一个checklist逐项过摘要页是不是第一页、页码是否连续、图表有没有编号和标题、参考文献格式是否统一、支撑材料有没有放数据字典和README。文件命名按官方要求来注意队号和控制页别搞混。最后上传前开一个压缩包测试一遍从解压到运行的流程是否顺畅确保队友拿不同的电脑也能复现。还有一个特别容易忽略的点AI使用报告。近几年美赛允许使用AI辅助工具但要求把使用情况在论文末尾逐条说明。哪怕你只是在头脑风暴阶段用过一次也必须写进去。这项说明不是可选项漏掉可能导致论文判罚问题。建议比赛结束前专门留出半小时全队一起回忆并记录AI工具的使用场景。4. 常见问题与避坑实录4.1 新手最爱踩的四个坑第一个坑是重模型轻问题。拿到题目就想套复杂模型却连问题的核心变量都没定义清楚。解决办法是强制自己先写半页“问题分析”用大白话复述一遍问题再列假设。假设写不出来说明你还没真正理解题目。第二个坑是可视化敷衍。评委一天要看几十篇论文图表是最直观的“信息压缩器”。如果全篇只有几张大而全的折线图没有任何局部放大图、对比图、机理示意图论文印象分会受影响。我的建议是论文中至少有一张“系统流程图”或者“模型框架图”让评委一眼看到你的思路骨架。第三个坑是分工严重失衡。经典崩盘剧本写论文的同学干坐两天建模的同学累倒第三天代码的同学最后拿不出可解释的结果。美赛是三人协作战不是一个人单打加两个挂件。即便某一阶段某个人任务少也要让他去帮忙写研究背景、整理参考文献、检查数据质量。第四个坑是忽略假设与符号说明。很多队伍模型建得很好但论文里没有统一的符号表变量一会儿用x一会儿用X公式编号乱成一团。这部分看起来很“细节”但恰恰是区分专业与否的分水岭。赛前准备一份latex或Word模板把符号表、公式编号、参考文献样式都预设好能省出大半天时间。4.2 关于AI工具的合规使用边界AI工具在美赛中的定位很微妙可以用但不能滥用。核心边界在于建模的决策和论文的核心思想必须由人完成。比如用AI做数据预处理、代码查错、润色英文段落这些是合规的。但如果你直接把题目原文丢进去让它生成一整套模型再原样抄进论文不仅违背竞赛规则而且非常危险因为AI生成的文本和公式往往不能支撑完整的逻辑链评委很容易看出来。写AI使用报告时按官方要求的格式逐条记录用了什么工具、在哪个环节使用、输入了什么、模型输出是什么、你如何修改和利用。写得具体、诚恳反而会给评委留下“这组学生合理使用工具”的印象。我见过有些队伍避重就轻写“未使用”但论文里明显有AI痕迹结果反而引发争议。别碰这条线老老实实记录你的底气更足。4.3 从评委视角倒推论文怎么写最后分享一下我个人对评阅逻辑的理解。评委拿到一篇论文先看摘要判断问题有没有读懂然后看模型判断方法是否合理再看结果判断结论是否可信最后翻图表和附录判断工作量是否饱满。这个顺序决定了你的精力分配摘要占三成模型和结果占五成图表达标占两成。摘要的写法值得单独说。别用“本文建立了一个XX模型”这种平平无奇的句式更好的写法是“针对XX问题我们构建了基于XX方法的XX模型结合XX数据得到XX结论并通过XX验证了模型稳健性”。一句话里信息密度越高越好要让评委读完第一段就知道你做了什么、怎么做的、得到什么结果。还有一个常被忽视的点模型评价别糊弄。很多论文在“模型评价”一节只写两句“误差较小”“结果符合实际”这等于告诉评委你根本没认真检验。哪怕简单的交叉验证、残差图、与基线模型对比都能让评价部分充实起来。稳定性证明不只是形式它是评委建立信任的桥梁。写在最后的一点个人体会带过这么多队伍我最大的感受是美赛的意外几乎年年相同不是不会建模而是输在了流程管理和细节检查上。我自己的固定习惯是准备一个“赛前检查文档”里面存好摘要句式模板、论文格式样例、代码库入口以及去年踩过的坑上场后直接按文档执行。美赛这种高压短赛程拼得就是谁的系统化程度更高。希望这篇持续更新的帖子能帮你少走一些我走过的弯路。后续我会继续把刷题中碰到的模型代码、排版模板和易错点更新进来你收藏一下等下次更新就能第一时间看到。