很多准备参加数学建模国赛的同学,最容易陷入的困境是:收藏夹里存满了经验贴,却不知道第一个晚上该做什么;看了几篇国奖论文,感觉自己离那个水平还差很远;等到比赛前一天,还在纠结到底用 MATLAB 还是 Python。其实数学建模国赛远没有想象中那么“拼天赋”。它更像一次有标准流程的团队项目:把题目读懂、把数据处理干净、把模型选对、把论文写清楚,每一步都有章可循。本文不打算给你灌鸡汤,而是按冲刺国奖的标准,把一套零基础也能落地的备赛流程拆开讲清楚。内容会覆盖工具选择、数据处理、三大类常用模型、完整参赛节奏、AI 辅助建模以及论文撰写,最后还会整理高频问题和工程建议,方便你直接照着准备。
1. 数学建模国赛是什么:竞赛形式与备赛思路
1.1 国赛的基本情况
全国大学生数学建模竞赛(CUMCM)是国内参与范围很广的数学应用类竞赛之一。比赛通常安排在每年 9 月前后,由三人组队,在三天左右时间内完成从建模、求解到论文写作的全部工作,最后提交一份完整的参赛论文。具体时间、报名方式、提交格式每年会有细微调整,务必以竞赛官网当年发布的通知为准。
很多第一次参赛的同学会把它理解成“数学考试”,这是最大的误区。国赛考察的不是数学定理背诵,而是把实际问题抽象成数学模型,再用程序求解,最后通过论文把整个思考过程表达出来。也就是说,数学基础、编程能力、写作能力三者缺一不可。哪怕你数学基础一般,只要数据处理熟练、模型库丰富、论文结构清晰,同样有机会拿到不错的奖项。
1.2 题目类型与评审标准
国赛题目通常分为 A、B、C 三类,这个分类对选题非常重要:
| 题目类型 | 常见特点 | 适合队伍 |
|---|---|---|
| A 题 | 偏连续型问题,常有物理背景,如热传导、流体、轨道、机理建模 | 有数学物理基础,擅长推导公式 |
| B 题 | 偏离散型问题,常见调度、路径规划、组合优化 | 擅长算法设计、编程能力强 |
| C 题 | 偏数据挖掘,通常给真实附件数据,需要清洗和统计建模 | 擅长 Python 数据处理、机器学习 |
需要提醒的是,这个分类不是绝对框架,每年题目风格都会有变化,比如有的题目是“连续的外壳 + 数据驱动的内核”。但了解经典分类能帮助队伍在选题那一刻快速判断:自己这支队伍最擅长做哪一类。
关于评审,官方不会公开详细评分细则,但从历年获奖论文和评审反馈来看,评委通常关注这几个点:摘要是否清楚、模型假设是否合理、求解过程是否完整、结果是否可信、灵敏度分析是否到位、论文排版是否规范。其中摘要的分量极重,评委往往先看摘要决定论文等级,后面我们单独用一节讲摘要怎么写。
1.3 零基础备赛的三个阶段
零基础准备国赛,最忌讳一上来就啃几百页的建模算法书,很容易在“马尔可夫链”“蒙特卡洛”这些名词里迷失方向。更合理的方式是分三个阶段推进:
- 第一阶段:工具熟练。花一周时间把 Python 基础语法、Pandas、Matplotlib 跑熟,能做到“拿到一份 CSV 数据,能完成读取、清洗、画图”。
- 第二阶段:模型复现。把预测、评价、优化三类问题各准备 2 到 3 个模型,每个模型都亲手跑通一小段代码,而不是只背概念。
- 第三阶段:论文训练。找 1 到 2 篇往届赛题,按照比赛节奏模拟一次 72 小时流程,重点练“写出能看的摘要”和“排版严谨的论文”。
后面所有章节,基本就是按这个路径展开的。
2. 工具链准备:MATLAB 还是 Python
2.1 常用工具对比
国赛并没有限制编程语言,评阅时也不管你是用什么软件算出来的。从近几年的趋势看,Python 已经成为绝大多数参赛队伍的首选,原因很直接:生态完善、免费、资料多。
| 工具 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| Python | 免费、数据处理生态强、机器学习库丰富 | 科学计算速度一般 | 数据分析、机器学习、深度学习 |
| MATLAB | 矩阵运算方便、内置数学函数多、部分评委熟悉 | 收费、安装体积大、生态较封闭 | 连续型机理建模、数值计算 |
| SPSS / Stata | 统计操作点击即可完成 | 可扩展性弱、不适合复杂算法 | 简单统计检验、因子分析 |
| Lingo / Gurobi | 求解规划问题专业 | 学习成本高、部分为付费软件 | 线性规划、整数规划、调度优化 |
这里并没有鄙视链。如果你的队伍里有 MATLAB 熟练工,A 题机理建模时确实方便;但对绝大多数队伍来说,Python 一套工具就能覆盖数据清洗、模型训练、画图、论文图表生成,是性价比最高的选择。本文示例统一使用 Python,如果你的比赛环境必须用 MATLAB,思路同样可以迁移。
2.2 Python 建模环境搭建
建议使用 Anaconda 管理 Python 环境,避免把系统 Python 环境搞乱。Anaconda 安装完成后,打开终端创建一个独立环境:
conda create -n mathmodel python=3.9 -y conda activate mathmodel pip install pandas numpy matplotlib seaborn scipy scikit-learn statsmodels版本说明:本文示例不依赖特别新的版本,Python 3.9 或 3.10 均可。如果使用过程中发现某个库不兼容,优先检查库版本,而不是直接更换 Python 大版本。安装完成后,建议再安装 Jupyter Notebook 或 VS Code,用来逐段运行代码。
conda install jupyter -y jupyter notebook实际比赛时,有的队伍喜欢用 Jupyter 写探索性代码,用 VS Code 写正式模型脚本。这个看个人习惯,但建议至少提前两周固定下来,不要在比赛期间换编辑器。
2.3 项目目录与代码规范
三天的比赛会产生大量文件,如果全部扔在桌面,第三天找图都会疯掉。建议整个队伍从第一天开始就使用统一的目录结构:
mathmodel_2026/ ├── data/ # 原始数据、中间数据 │ ├── raw/ │ └── processed/ ├── code/ # 所有代码脚本 │ ├── data_process.py │ ├── model_predict.py │ ├── model_evaluate.py │ └── figure.py ├── paper/ # 论文 Word 或 LaTeX 文件 ├── figures/ # 所有输出图片,统一命名 ├── output/ # 结果表格、提交附件 └── README.md # 记录团队分工和进度代码文件要按功能拆开,不要把 600 行全写在一个脚本里。函数命名尽量见名知意,关键变量旁边写注释。比赛到第三天的时候,你大概率会忘记第一天的变量含义,清晰的代码结构能救你一命。
3. 数据处理基本功
3.1 为什么要先处理数据
很多第一次参赛的同学拿到数据后,第一反应是直接把 Excel 喂给机器学习模型,结果得到的预测结果完全不可信。原因往往是数据里存在缺失值、异常值、重复值、量纲不一致等问题。数据处理不是“边角料”,它直接决定模型上界。数据处理这一环节做得越扎实,后面模型调参越省力。
从近几年 C 题和 B 题的趋势看,赛题提供的数据规模越来越大,字段越来越多,数据清洗、特征构造已经成为国赛的隐性考点。评委希望看到你不仅会跑模型,还能解释数据中的业务含义。
3.2 数据清洗的完整流程
数据清洗通常按以下顺序操作:
- 缺失值处理:先观察缺失比例,再决定删除或填充。
- 异常值处理:用箱线图或 3σ 原则识别极端值,结合业务判断。
- 重复值处理:去除完全重复的样本。
- 数据类型转换:把日期、分类、数值字段转成合适类型。
- 量纲归一化:对距离类算法和评价类模型尤其重要。
下面是一段典型的数据清洗代码,适合比赛第一晚快速完成“数据摸底”:
# 文件路径:code/data_process.py import pandas as pd import numpy as np # 1. 读取原始数据,常见中文数据编码为 gbk df = pd.read_csv("data/raw/raw_data.csv", encoding="gbk") print("数据形状:", df.shape) print("字段信息:") print(df.info()) # 2. 去除完全重复行 df = df.drop_duplicates() print("去重后数据形状:", df.shape) # 3. 查看缺失值比例 missing_ratio = df.isnull().mean() print("缺失比例:\n", missing_ratio) # 4. 数值列缺失值用中位数填充,分类列用众数填充 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]) # 5. 用 3σ 原则识别异常值,先看分布再决定是否删除 for col in num_cols: mean = df[col].mean() std = df[col].std() lower = mean - 3 * std upper = mean + 3 * std outlier_count = ((df[col] < lower) | (df[col] > upper)).sum() print(f"{col} 异常值数量:{outlier_count}") # 6. 保存清洗后的数据 df.to_csv("data/processed/clean_data.csv", index=False, encoding="utf-8-sig")这里需要特别说明第 4 步:中位数填充比均值更稳健,因为均值容易受异常值影响。如果缺失比例超过 30%,建议不要直接填充,而是考虑删除该列或单独增加“是否缺失”标记列。数据清洗没有万能公式,所有操作都应该在论文里写清楚依据,这也是评委考察“建模严谨性”的一部分。
3.3 特征工程与可视化探索
数据清洗完成后,下一步是特征构造。常见做法包括:从日期字段中提取星期、月份、是否是节假日;把分类字段做独热编码;把多个数值字段组合成比例或差值;对时间序列构造滞后特征。特征不是越多越好,关键是特征要能对应业务含义。
可视化在比赛中承担两个任务:一是帮自己理解数据分布,二是帮论文增加说服力。下面这段代码生成直方图和相关性热力图:
# 文件路径:code/figure.py import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns plt.rcParams["font.sans-serif"] = ["SimHei"] # 显示中文 plt.rcParams["axes.unicode_minus"] = False df = pd.read_csv("data/processed/clean_data.csv", encoding="utf-8-sig") # 1. 数值列分布直方图 num_cols = df.select_dtypes(include=[np.number]).columns[:6] df[num_cols].hist(bins=30, figsize=(12, 8)) plt.tight_layout() plt.savefig("figures/hist.png", dpi=200) # 2. 相关性热力图 plt.figure(figsize=(10, 8)) corr = df[num_cols].corr() sns.heatmap(corr, annot=True, cmap="RdBu_r", fmt=".2f") plt.title("数值特征相关性热力图") plt.tight_layout() plt.savefig("figures/corr_heatmap.png", dpi=200)在论文里放图时,记得不要直接截屏,应该用代码保存高清 PNG 或 PDF,并保证图例、横纵轴标签完整。图片清晰度是论文专业感的重要来源。
3.4 一个完整的数据处理案例
假设赛题给了一张“城市共享单车订单表”,字段包括:订单编号、用车时间、骑行时长、起点经纬度、终点经纬度、用户类型、车辆类型。拿到数据后,除了常规清洗,还可以构造这样几个特征:
- 骑行时长是否异常(小于 1 分钟可能是未锁车,大于 6 小时可能是数据错误)。
- 骑行距离:根据经纬度计算两点球面距离。
- 是否工作日:从用车时间提取。
- 早高峰或晚高峰标记。
这些特征构造出来以后,再进入模型阶段,预测结果往往比直接拿原始字段建模好很多。这个思路在 C 题中特别常见,本质上就是“把业务理解转化为可用特征”。
4. 三大核心模型
4.1 预测模型:从回归到灰色预测
预测类问题是国赛的常客,比如销量预测、交通流量预测、人口预测、疫情趋势预测。最基础的预测模型是线性回归,适合数据量中等、特征和目标基本呈线性关系的场景。
下面是一个用 Python 做线性回归的最小示例:
# 文件路径:code/model_predict.py import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score df = pd.read_csv("data/processed/clean_data.csv", encoding="utf-8-sig") X = df[["feature1", "feature2", "feature3"]] y = df["target"] X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) model = LinearRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) print("RMSE:", mean_squared_error(y_test, y_pred, squared=False)) print("R2:", r2_score(y_test, y_pred)) print("系数:", dict(zip(X.columns, model.coef_)))注意,比赛时不要只跑一个线性回归,至少要对比两种以上模型,比如随机森林、XGBoost 或时间序列模型。评委很看重“模型对比”这个环节,它体现的是你思考过不同方法的适用边界。
除了回归,国赛里还经常用到灰色预测 GM(1,1),适合样本量小、数据呈指数增长趋势的场景。它的好处是不需要大量历史数据,缺点是对波动较大的数据效果较差。下面给出一段可实现的最小代码,核心思路是通过累加生成序列来弱化数据波动,再拟合指数模型:
import numpy as np def gm11(x0): x0 = np.asarray(x0, dtype=float) n = len(x0) # 1. 一次累加生成序列 x1 = np.cumsum(x0) # 2. 构造数据矩阵 B 和向量 Y B = np.column_stack([-x1[:-1], np.ones(n - 1)]) Y = x0[1:] # 3. 最小二乘估计参数 a, u coef = np.linalg.lstsq(B, Y, rcond=None)[0] a, u = coef # 4. 累加序列的预测公式 x1_hat = np.zeros(n) x1_hat[0] = x0[0] for k in range(1, n): x1_hat[k] = (x0[0] - u / a) * np.exp(-a * k) + u / a # 5. 累减还原得到原始序列预测值 x_hat = np.zeros(n) x_hat[0] = x1_hat[0] for k in range(1, n): x_hat[k] = x1_hat[k] - x1_hat[k - 1] return x_hat # 简单测试 data = [2.67, 3.13, 3.25, 3.36, 3.56] print(gm11(data))实际使用灰色预测时,还应做后验差比检验或残差检验,并在论文里给出检验结果。这个细节能明显提升模型可信度。
4.2 评价模型:TOPSIS 与层次分析法
评价类问题在国赛中非常常见,比如“评价某地区发展水平”“评估多个方案优劣”“选择最优选址”。解决这类问题的通用思路是:确定评价指标 → 确定指标权重 → 对方案排序。
权重确定有三种常用方式:主观赋权用层次分析法(AHP),客观赋权用熵权法,组合赋权两者结合。在实际比赛中,熵权法 + TOPSIS 的组合特别受欢迎,因为代码简单、结果稳定、容易解释。
下面是一段 TOPSIS 的完整实现:
# 文件路径:code/model_evaluate.py import numpy as np import pandas as pd def topsis(data, weights=None, benefit_mask=None): """ data: 二维数组,每行是一个方案,每列是一个指标 benefit_mask: 布尔数组,True 表示效益型指标,False 表示成本型指标 """ data = np.asarray(data, dtype=float) m, n = data.shape # 1. 向量归一化 norm_data = data / np.sqrt((data ** 2).sum(axis=0)) # 2. 加权 if weights is None: weights = np.ones(n) / n else: weights = np.asarray(weights, dtype=float) weighted = norm_data * weights # 3. 正理想解和负理想解 if benefit_mask is None: benefit_mask = np.ones(n, dtype=bool) best = np.where(benefit_mask, weighted.max(axis=0), weighted.min(axis=0)) worst = np.where(benefit_mask, weighted.min(axis=0), weighted.max(axis=0)) # 4. 计算距离 d_best = np.sqrt(((weighted - best) ** 2).sum(axis=1)) d_worst = np.sqrt(((weighted - worst) ** 2).sum(axis=1)) # 5. 相对接近度 score = d_worst / (d_best + d_worst) return score # 示例:5 个方案,3 个指标 df = pd.DataFrame({ "方案": ["方案A", "方案B", "方案C", "方案D", "方案E"], "指标1": [8, 9, 6, 7, 5], "指标2": [7, 6, 9, 8, 6], "指标3": [6, 8, 7, 9, 5] }) scores = topsis(df[["指标1", "指标2", "指标3"]].values, weights=[0.3, 0.3, 0.4], benefit_mask=[True, True, False]) df["得分"] = scores df["排名"] = df["得分"].rank(ascending=False, method="min") print(df)注意,指标的方向很关键。比如“成本”是越小越好,在 TOPSIS 里需要把 benefit_mask 对应位置设为 False,否则排序结果会完全反掉。这是初学者最容易踩的坑。
层次分析法(AHP)适合指标层次多、需要体现专家主观判断的场景,但一致性检验常常让新手头疼。比赛时如果时间有限,优先推荐熵权法求权重,再把结果交给 TOPSIS 排序。熵权法的基本思路是指标变异程度越大,权重越高,代码只需要算信息熵,实现成本很低。
4.3 优化模型:线性规划与启发式搜索
优化类问题通常出现在 B 题,比如“如何分配资源使得收益最大”“如何安排生产计划使成本最小”。如果约束和目标函数都是线性的,可以直接用线性规划求解。
下面的示例用 SciPy 求解一个简单的生产计划问题:
from scipy.optimize import linprog # 目标:最大化 2x1 + 3x2 # 约束: # 2x1 + x2 <= 8 # x1 + 2x2 <= 6 # x1 >= 0, x2 >= 0 # linprog 默认求解最小值,所以把目标系数取负 c = [-2, -3] A_ub = [[2, 1], [1, 2]] b_ub = [8, 6] bounds = [(0, None), (0, None)] res = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method="highs") print("最优解:", res.x) print("最优目标值:", -res.fun)如果问题规模变大,变量变成整数,就要使用整数规划;如果问题带有非线性约束,需要转为非线性规划或用启发式算法。在比赛中,遇到组合优化问题(如路径规划、任务调度)时,遗传算法、模拟退火、蚁群算法都是常见解法。很多人以为启发式算法很难写,其实调用第三方库或写一个基础版遗传算法并不复杂,关键是把编码方式和适应度函数设计清楚。这一块建议赛前准备一个模板,不要现场裸写。
4.4 如何判断该用哪类模型
比赛时最怕的不是不会写代码,而是不知道用什么模型。这里给一个快速判断思路:
- 题目中有“预测未来”“估计某变量”,优先考虑预测模型。
- 题目中有“评价”“比较优劣”“选择最佳”,优先考虑评价模型。
- 题目中有“优化”“调度”“规划”“最大/最小”,优先考虑优化模型。
- 题目中给了大量数据且没有明确机理,优先考虑机器学习模型。
- 题目有明确物理方程和参数含义,优先考虑机理建模。
多数国赛题目不是单一模型能解决的,更常见的是“数据预处理 → 评价/预测 → 优化决策”的组合链条。论文里要把模型之间的关系讲清楚,画一张流程图会让读者更容易理解。
5. 完整实战流程:从题目到论文
5.1 拿到赛题后怎么拆解
比赛第一天上午,很多队伍会花两三个小时反复读题,最后一题都没选好。这里要注意用标准化流程快速破题。拿到题目后,团队三人先各自用 30 分钟独立阅读全部题目,列出几个关键信息:背景问题是什么、给了哪些数据、要输出什么结果、有没有明显约束。然后回到一起讨论,每个成员分别说一句“我最倾向做哪题,为什么”,不要互相说服太久。
选好题后,立刻把题目拆成若干小问,给每个小问标注“需要建模”“需要编程”“需要论文重点描述”。如果题目里已经明确给了小问编号,就直接用编号管理进度,这样后续分工和写作都能对齐。
5.2 三天时间怎么分配
三天时间看起来长,实际非常紧张。一个比较稳妥的节奏是:
| 时间 | 主要任务 |
|---|---|
| 第一天上午 | 选题、读题、查资料、确定初步思路 |
| 第一天下午 | 数据处理、画探索性图表、确定候选模型 |
| 第一天晚上 | 跑通第一个简化版本模型,确认可行 |
| 第二天白天 | 完成主模型的求解、调参、误差分析 |
| 第二天晚上 | 补充第二个模型,做模型对比 |
| 第三天上午 | 写摘要、问题分析、模型建立部分 |
| 第三天下午 | 完成结果分析、灵敏度分析、模型评价 |
| 第三天晚上 | 统一排版、检查参考文献、提交 |
这个节奏的核心思想是:第一天不要试图一步到位,先用简化模型跑通流程,给自己增加信心;第二天集中攻坚;第三天只做论文,不写新模型。很多队伍失败,是因为第三天还在改代码,最后论文草草收尾。
5.3 论文写作结构
国赛论文要求在评阅时能快速被读懂,所以结构要规范。通常包括以下部分:
- 摘要:单独一页,说明问题、方法、结果,不超过一页。
- 问题重述:用自己的话复述题意,不要照抄原题。
- 问题分析:把每个小问的解题思路写出来,建议配流程图。
- 模型假设:明确列出假设,每条都要解释合理性。
- 符号说明:用表格列出主要符号及含义。
- 模型建立与求解:这是正文核心,每个小问单独分节。
- 模型检验与灵敏度分析:分析参数变化对结果的影响。
- 模型评价:写优点和缺点,不要只说“模型合理”。
- 参考文献与附录:附录放核心代码和大量数据表。
摘要的写作结构可以固定为四句话:第一句写研究问题,第二句写用了什么方法,第三句写得到什么关键结果,第四句写模型特色或创新点。摘要中尽量不要出现“可能”“大概”等模糊词汇,数值要具体。
5.4 真题解析思路示范
这里不针对某一年具体题目展开,而是给出一种通用的真题拆解方法。假设题目给了一张订单数据表,要分析“不同区域的需求差异并制定补货计划”。拿到题目后,建议按下面四步推进:
第一步,明确每个小问要输出什么,比如“预测未来 7 天各区域需求量”和“设计补货方案”是两个完全不同的问题。
第二步,从数据中提取目标字段和特征字段。预测问题通常需要构造时间特征,如日期、星期、月份;评价问题需要确定指标,如配送距离、成本、覆盖人数。
第三步,先跑一个简单基准模型,比如用历史均值作为预测结果,再逐步换成线性回归或时间序列模型。有了基准模型,你才能判断复杂模型到底提升多少。
第四步,把模型结果和业务背景结合。如果某个区域预测值出现极端异常,不要直接写进论文,先回到数据检查是否漏掉了缺失值或重复值。所有异常结果都要能给出解释。
6. AI 应用:大模型如何辅助建模
6.1 AI 能帮我们做什么
近两年,大语言模型已经成为数学建模备赛和比赛过程中不可忽视的辅助工具。AI 在国赛中能发挥的作用主要体现在四块:查资料、补代码、做调试、整表达。
写代码时,如果某个 pandas 函数忘记了参数,直接把需求描述给 AI,通常能得到可用代码;模型求解报错时,把完整报错信息贴给 AI,让它帮你定位原因是语法错误还是版本兼容问题;论文写作时,AI 可以帮忙润色摘要初稿、生成规范的问题重述,但需要你提供足够准确的模型思路和结果。
6.2 AI 辅助的工作流示例
一个比较实用的 AI 辅助流程是:
- 把赛题背景和已确定的小问写成一个完整的 Prompt。
- 让 AI 列出候选模型和理由,再结合团队讨论筛选。
- 用 AI 生成第一版代码,但不要直接复制,必须读懂每一行。
- 运行报错时,把报错信息粘贴给 AI,并说明运行环境。
- 论文阶段,用 AI 润色摘要和问题分析,但所有数据和结果必须自己核对。
下面是一段 Prompt 示例,供参考:
你现在是一名数学建模竞赛教练。我要解决一个物流路径优化问题。 已知信息:共有 10 个配送点,1 个仓库,车辆载重限制为 20 吨,每辆车必须从仓库出发并返回仓库。 任务: 1. 判断这是哪类数学模型问题; 2. 给出 2 种可用的求解思路,并比较优缺点; 3. 提供一段 Python 代码框架,使用遗传算法求解。 要求:代码结构清晰,每一步有注释,不依赖未安装的第三方库。这样的 Prompt 能让 AI 输出相对结构化、可落地的答案。需要说明的是,AI 生成的代码有时会“一本正经地编造 API”,尤其是用了比较冷门的库时,报错的概率很高。因此,任何 AI 生成的代码都必须经过本地运行验证。
6.3 使用 AI 的边界与规范
数学建模竞赛对论文原创性有严格要求。AI 可以作为辅助工具,但不能直接把 AI 生成的整篇论文提交上去,也不能让 AI 代替你做核心建模决策。实际使用时,建议注意这几点:
- 所有代码必须先跑通,再写进论文附录。
- 所有模型结论必须来自真实运行结果,不能由 AI 编造。
- 摘要和论文正文的最终版本由人类成员撰写,AI 只能润色。
- 如果竞赛规则要求声明 AI 使用情况,务必如实填写。
一句话总结:AI 是帮你提高效率的工具,不是帮你参赛的队友。评委看重的模型理解、数据分析和逻辑表达能力,仍然需要你自己具备。
7. 常见问题与排查思路
比赛过程中会遇到各种问题,这里整理一张高频问题排查表:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 拿到题目后一直无法确定选题 | 团队缺乏明确分工,反复讨论 | 用 1 小时限时决策,每人在 30 分钟内独立读题并给出建议 |
| pandas 读取中文 CSV 乱码 | 文件编码不是 UTF-8 | 尝试 encoding="gbk" 或 encoding="utf-8-sig" |
| 缺失值太多,模型结果不稳定 | 直接删除大量样本 | 改用中位数填充、模型嵌入缺失处理或增加缺失标记 |
| 模型预测结果全部是同一个值 | 特征与目标无线性关系,或数据有问题 | 检查数据分布,改换随机森林等非线性模型 |
| 优化模型求解很慢 | 变量或约束太多 | 缩减问题规模,或改用启发式算法求近似解 |
| 论文图表模糊 | 保存时分辨率过低 | 使用 savefig(dpi=200) 或保存为 PDF |
| 第三天晚上还在改代码 | 前两天的模型没有收敛 | 及时回到稳定版本,优先保证论文完整 |
| 摘要写不清楚 | 对模型结果不熟悉 | 摘要放到最后写,先完成正文再提炼摘要 |
这张表不是标准答案,但覆盖了大多数队伍的典型痛点。所有问题最好的解决办法都是提前预防:赛前完整模拟一次 72 小时流程,比看一百篇经验贴都有用。
8. 最佳实践与工程建议
8.1 团队分工与协作
一支稳定的队伍通常由三个角色组成:建模手、编程手、写作手。建模手负责拆题、选模型、推导公式;编程手负责写代码、调参、生成图表;写作手负责论文结构、摘要、排版。角色分工不是固定的,比赛后期需要三人互相补位。
协作时最大的问题不是能力不足,而是信息不同步。建议每次完成一个阶段性结果,都在群里同步一句:模型做到哪一步、有什么新发现、需要谁支持。简单的进度同步,能避免“编程手写完了,写作手却不知道结果”的尴尬。
8.2 摘要写作与图表规范
摘要虽然放在论文最前面,但一定是最晚完成的。建议摘要控制在四段以内:第一段写问题背景和整体思路,第二段写第一问的模型和结果,第三段写第二问的模型和结果,第四段写第三问及模型亮点。关键数值要保留 2 到 3 位有效数字,不要写没有依据的“提升 30%”。
论文中的图表要有统一风格:字体大小一致、图例清晰、坐标轴标签完整。图不要一多就乱,每张图都要在正文中有明确引用,比如“如图 3 所示,需求量在早高峰出现明显峰值”。评委阅读速度很快,图表质量直接影响论文观感。
8.3 版本管理与备份
比赛三天代码改动非常频繁,建议从第一天开始就使用 Git 做版本管理,或者至少每小时手动备份一次到网盘。万一某个版本把数据洗坏了,还能快速回滚。如果不熟悉 Git,那就在文件命名上体现版本,比如data_process_v2.py,不要永远就叫final.py。
数据文件建议读写分离:原始数据只读,处理后的数据统一写到data/processed/目录。这样即使模型代码出错,也不用回到最原始的清洗阶段重新跑,能节省大量时间。
8.4 赛场避坑清单
- 不要花超过 1 小时纠结选题。
- 不要在没有结果的时候就写论文。
- 不要把 AI 生成的结论直接当作真实结果。
- 不要在比赛最后半小时大幅修改代码。
- 不要忽略论文附录中的代码可读性。
- 不要在数据逻辑没理清时强行套深度学习模型。
9. 总结与后续学习路线
9.1 八周备赛计划
如果你现在有八周时间准备,可以按下面的节奏来:
| 阶段 | 时间 | 目标 |
|---|---|---|
| 工具期 | 第 1 到 2 周 | 掌握 Python 基础、pandas、matplotlib,能独立完成数据清洗 |
| 模型期 | 第 3 到 5 周 | 跑通预测、评价、优化三大类模型各两个经典案例 |
| 真题期 | 第 6 到 7 周 | 完整做 1 到 2 道往届赛题,严格按 72 小时模拟 |
| 冲刺期 | 第 8 周 | 整理模型模板、论文模板、图表模板,查漏补缺 |
往届赛题不要只阅读,要真的动手写代码。哪怕第一道题做得不好,也比只看不练强得多,因为比赛当天你依赖的是肌肉记忆,而不是临时搜索能力。
9.2 下一步做什么
如果你现在还是个零基础新手,不需要在第一天就把所有模型学完。最值得做的第一件事,是找一份有缺失值、有重复值、有异常值的 CSV 数据,按照第 3 节的代码完整跑一遍数据清洗,并生成两张可视化图表。这一个练习做完,你对国赛的信心会比看十天资料都更扎实。
等数据处理熟练之后,再进入模型复现阶段。我建议把精力优先放在 TOPSIS 评价模型和线性规划上,因为这两类代码量小、逻辑直观、比赛命中率高,非常适合作为第一个成功案例。把第一个模型完整跑通,后面学习就会顺很多。