2026 年第七届华数杯数学建模竞赛已经进入备战期很多队伍这两天最关心的问题就是A 题到底怎么切入代码怎么写得又快又稳模型怎么搭才能让评委打出高分今天这篇就围绕华数杯 A 题的完整解题链路从题目拆解、模型建立、代码实现到论文写作把获奖队伍常用的思路和工具一套讲清。注意本文虽然以 2026 华数杯 A 题为背景但核心方法论适用于华数杯近年来的出题风格也适用于国赛、美赛中的同类赛题。拿到具体题目后只需要把文中的框架套进实际数据就能很快跑通全流程。1. 华数杯 A 题到底在考什么1.1 竞赛定位与题目风格华数杯数学建模竞赛是由华数杯组委会主办的数学建模竞赛赛题风格对标全国大学生数学建模竞赛A 题通常是一道偏重实际问题、工程问题或社会问题的综合建模题。从往年的出题方向看A 题往往具有以下特征问题背景真实题干信息量大经常附带大量附件数据或背景材料。需要做数据预处理、指标构建、模型求解、结果分析流程完整。通常包含多个小问第一问偏简单越往后越综合最后一问往往需要写方案、建议或政策分析。优化类模型和评价类模型出现频率很高少数年份会用到预测、分类或仿真模型。换句话说A 题不是单纯“算一个结果”而是要求队伍像做一个小型科研项目一样把问题定义清楚、建模合理、求解有效、结果可信、表达规范。1.2 评审老师想看到什么搞清楚评委怎么打分比盲目堆模型更重要。从获奖论文的共性来看A 题评分通常围绕以下五个维度评分维度核心要求问题分析能准确拆解题干抓住主要矛盾不遗漏约束条件模型建立模型有依据、假设合理、公式和符号规范模型求解算法选择得当代码能跑出结果数据图表完整结果分析对结果有解释有误差分析、灵敏度分析或对比实验论文写作摘要突出、排版清晰、图表美观、逻辑完整很多队伍模型建得很好但摘要写得像说明书或者灵敏度分析完全缺失最后分数卡在二等奖上不去。这一点在后文会专门展开。1.3 参赛队伍需要掌握的核心能力针对 A 题的特征一个能拿奖的队伍通常需要具备三块能力数学建模能力能根据问题背景选择恰当模型而不是把见过的模型全部套一遍。编程实现能力能把模型转成可运行的代码快速处理数据、求解结果、生成图表。论文写作能力能用规范的语言把思路、模型、结果表达清楚让评委在有限时间内看懂并认可。这三块缺一不可。如果你所在队伍里有人只擅长其中一块建议尽快补短板。下面就从备战阶段开始逐步梳理完整方案。2. 赛前工具箱环境、依赖库与文件组织2.1 编程语言与运行环境华数杯 A 题允许使用多种工具但目前绝大多数获奖队伍选择 Python主要原因有三个Python 的数据处理能力覆盖完整Pandas 处理 Excel 表格非常方便。优化、预测、评价类模型都有成熟第三方库不需要从零造轮子。Matplotlib 和 Seaborn 能快速输出论文级图表方便后期排版。建议统一使用 Python 3.9 或更高版本开发环境使用 Anaconda Jupyter Notebook 或 VS Code Python 插件。Jupyter 的好处是分块运行、实时看结果适合数学建模阶段边调边记录VS Code 则更适合写大量可复用的代码文件。2.2 常用第三方库清单建议赛前把以下库全部安装并验证一遍避免比赛时因为环境问题浪费时间pip install numpy pandas scipy matplotlib seaborn scikit-learn openpyxl pulp ortools statsmodels这些库对应的用途如下库用途numpy数值计算、矩阵运算pandas数据读取、清洗、聚合scipy.optimize线性规划、非线性优化、求根matplotlib / seaborn可视化绘图scikit-learn回归、分类、聚类等机器学习模型pulp整数规划、混合整数规划求解ortools路径优化、调度类问题statsmodels时间序列分析、统计检验此外如果题目中涉及复杂网络图可以提前装好 networkx涉及元胞自动机或仿真可以装 mesa涉及多目标优化可以装 pymoo。这些根据实际题目选装即可。2.3 赛前文件目录规范三天赛程中文件会越来越乱如果一开始不规划目录最后整理论文时会非常痛苦。推荐使用下面的目录结构A题_队伍编号/ ├── data/ # 原始数据和中间数据 │ ├── raw/ # 赛题附件原始数据 │ ├── processed/ # 预处理后的数据 │ └── result/ # 模型输出结果 ├── code/ │ ├── 01_data_cleaning.py # 数据清洗脚本 │ ├── 02_model_build.py # 模型求解脚本 │ └── 03_plot.py # 可视化脚本 ├── paper/ │ └── 论文正文.docx / .tex └── README.md # 队内分工和进度记录建议在 README 中记录每次模型调整的时间、参数和结果防止三天后忘记前面试过哪些方案。3. 读题三小时从题干到建模方向的拆解3.1 拿到题目后的第一件事不是写代码很多队伍拿到 A 题后第一反应是赶紧找数据跑代码。这其实是比较危险的做法。A 题题干信息量大经常包含背景知识、问题描述、数据说明、要解决的问题四个部分。如果跳过背景直接建模很容易忽略关键约束或指标含义。推荐拿到题目后先用 1 到 2 小时四个人一起完成以下动作每一段题干都朗读一遍把“问题目标”“约束条件”“已知数据”三类信息分别用不同颜色标出来。把题目中的名词术语列成一个词汇表确保全队理解完全一致。将附件文件名和题干对应起来搞清楚每个文件的作用。把需要解决的问题拆成“先算什么、再算什么、最后给出什么”的流水线。A 题通常不是单一问题而是由多个小问组成的。先梳理出整体问题链条后面写模型时才能保证前后衔接自然。3.2 把问题转化成数学语言读题完成后下一步是把文字描述翻译成数学建模语言。这里举一个典型的优化问题转化示例。假设题干描述为“在满足资源约束的条件下使总成本最小”那么数学上可以写为设决策变量为 $$x_i$$第 i 种方案的选择数量目标函数为$$ \min Z \sum_{i1}^{n} c_i x_i $$约束条件为$$ \sum_{i1}^{n} a_{ij} x_i \le b_j, \quad j 1, 2, \dots, m $$$$ x_i \ge 0, \quad x_i \in \mathbb{Z} $$这一转化过程看似简单但在实际竞赛中很多队伍的瓶颈恰恰是“不知道把哪个量作为决策变量”。一个经验是把“题目问‘应该怎么选/怎么分配/怎么安排’的那个对象”作为决策变量把“需要尽量好或者尽量坏的那个指标”作为目标函数把“题干中所有不能突破的限制”作为约束条件。3.3 建立问题假设与探索性数据分析建模前需要写清楚假设条件。例如“假设数据缺失值不影响总体趋势”“假设短期内各影响因素保持稳定”等。假设不能乱写每一个假设都要在论文中说明理由并且最好在后文进行合理性检验。如果题目提供附件数据在建立正式模型前还需要做一次探索性数据分析EDA目的不是直接建模而是了解数据的基本形态。常见的检查项包括数据维度、字段名称、缺失值情况。数值字段的分布情况是否存在异常值。时间字段的跨度是否有周期性、趋势性。字段之间的相关性哪些因素对目标变量影响较明显。下面是一个快速检查数据缺失值分布和数值字段统计量的代码示例# 文件路径code/01_data_cleaning.py import pandas as pd import numpy as np # 读取原始数据 df pd.read_csv(data/raw/problem_data.csv, encodinggbk) # 查看前5行与字段名 print(df.head()) print(字段列表, df.columns.tolist()) # 缺失值检查 missing df.isnull().sum() missing missing[missing 0].sort_values(ascendingFalse) print(缺失值情况) print(missing) # 数值字段分布概览 num_cols df.select_dtypes(include[np.number]).columns print(数值字段统计信息) print(df[num_cols].describe().T) # 保存清洗后的数据备份 df.to_csv(data/processed/problem_data_cleaned.csv, indexFalse, encodingutf-8-sig)这一步输出虽简单但能帮助队伍在建模前发现数据中的明显问题比如缺失率过高的字段、存在极端值的字段等避免建模时踩坑。4. 模型建立的三个层次4.1 基本层从经典模型入手A 题的小问通常难度递进第一问往往可以用经典模型解决不需要一上来就设计全新算法。常见的经典模型包括线性规划 / 整数规划资源配置、生产计划、运输调度。层次分析法AHP权重确定、方案排序。熵权法 / TOPSIS多指标综合评价。多元线性回归 / 时间序列预测类问题。聚类分析样本分组、区域划分。以综合评价问题为例如果题干要求“对多个对象进行综合评价排序”经典思路是建立评价指标体系选取可量化的指标。对指标进行正向化、标准化处理。使用熵权法或层次分析法计算指标权重。使用 TOPSIS 方法计算每个对象与正理想解的相对贴近度得到排名。这一套流程在 A 题中出现频率非常高代码模板也很固定建议赛前写成自己的“模型库”。下面给出一个基于熵权法和 TOPSIS 的综合评价 Python 示例# 文件路径code/02_model_build.py import numpy as np import pandas as pd def entropy_weight(data): 熵权法计算权重data为n行m列的标准化正向指标矩阵 n, m data.shape # 数据平移避免log(0) data data 1e-10 p data / data.sum(axis0) e -np.sum(p * np.log(p), axis0) / np.log(n) w (1 - e) / (1 - e).sum() return w def topsis(data, weight): TOPSIS综合评价返回每个对象的得分和排名 z data / np.sqrt((data ** 2).sum(axis0)) z z * weight z_plus z.max(axis0) z_minus z.min(axis0) d_plus np.sqrt(((z - z_plus) ** 2).sum(axis1)) d_minus np.sqrt(((z - z_minus) ** 2).sum(axis1)) score d_minus / (d_plus d_minus) rank score.argsort()[::-1] 1 return score, rank # 示例10个对象5个指标 X np.array([ [85, 90, 78, 82, 88], [72, 85, 91, 76, 80], [90, 70, 84, 88, 75], [65, 88, 79, 92, 83], [78, 92, 86, 70, 90], ]) w entropy_weight(X) score, rank topsis(X, w) print(熵权法权重, w) print(综合得分, score) print(排名, rank)这个模板在遇到“评价排序”类问题时可以直接改数据运行省去大量调代码时间。4.2 提升层根据问题类型选择优化或预测模型A 题的第二问或第三问往往需要根据第一问的结论做进一步建模。如果第一问做到了评价或筛选第二问很可能是“在评选结果基础上做优化配置”或“对未来的发展情况进行预测”。此时需要补充更高级的工具。如果题目属于优化类推荐使用 scipy.optimize 或 pulp 建模。下面以 pulp 求解一个整数规划问题为例# 文件路径code/02_model_build.py from pulp import LpProblem, LpVariable, LpMaximize, LpStatus, value # 建模最大化利润 model LpProblem(Production_Plan, LpMaximize) # 决策变量产品A、B、C的产量 x1 LpVariable(x1, lowBound0, catInteger) x2 LpVariable(x2, lowBound0, catInteger) x3 LpVariable(x3, lowBound0, catInteger) # 目标函数总利润最大化 model 5 * x1 8 * x2 6 * x3 # 约束条件 model 2 * x1 3 * x2 2 * x3 120 model 4 * x1 2 * x2 3 * x3 150 model 3 * x1 4 * x2 2 * x3 100 # 求解 model.solve() # 输出结果 print(状态, LpStatus[model.status]) for v in model.variables(): print(f{v.name} {v.varValue}) print(最大利润 , value(model.objective))pulp 的语法非常接近数学表达的原始形式写完以后评委在论文里看公式、看代码容易对应上。如果题目属于预测类建议先做数据的时间趋势可视化再选择模型。简单趋势用线性回归带季节性的用 statsmodels 的 seasonal_decompose数据量较大时可尝试 ARIMA 或 Prophet。但要注意A 题并不要求模型越复杂越好如果数据本身就支持线性趋势强行用深度学习反而容易过拟合解释性也差。4.3 点睛层灵敏度分析与对比实验无论用什么模型A 题拿高分的一个关键动作是灵敏度分析。灵敏度分析的目的是验证模型的稳定性即当某些参数在一定范围内变化时结果是否会发生剧烈变化。以优化模型为例可以变化约束条件的右端项大小观察目标函数值的变化# 灵敏度分析示例 from pulp import LpProblem, LpVariable, LpMaximize, value bounds_list [100, 120, 140, 160, 180] results [] for b in bounds_list: model LpProblem(Sensitivity_Test, LpMaximize) x1 LpVariable(x1, lowBound0, catInteger) x2 LpVariable(x2, lowBound0, catInteger) model 5 * x1 8 * x2 model 2 * x1 3 * x2 b model 4 * x1 2 * x2 150 model.solve() results.append((b, value(model.objective))) print(参数b - 最优目标值) for b, obj in results: print(f{b} - {obj:.2f})让结果随参数变化而变化的趋势可以绘制成折线图放进论文中。灵敏度分析不是凑字数它能让评委看到队伍对模型的理解深度。5. 代码推荐可直接改用的核心模板5.1 数据清洗与特征构造通用模板A 题数据通常以 Excel 或 CSV 格式给出特点是字段名可能是中文数据存在缺失或异常值。推荐按下面的顺序处理数据import pandas as pd import numpy as np # 读取中文表头 df pd.read_excel(data/raw/附件1.xlsx, header0) # 统一列名去掉空格、特殊字符 df.columns [str(c).strip().replace( , _).replace(, ().replace(, )) for c in df.columns] # 填充缺失值数值列用均值/中位数类别列用众数 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]) # 异常值处理使用四分位距识别 def cap_outliers(series): q1 series.quantile(0.25) q3 series.quantile(0.75) iqr q3 - q1 lower q1 - 1.5 * iqr upper q3 1.5 * iqr return series.clip(lower, upper) for col in num_cols: df[col] cap_outliers(df[col]) # 保存处理后的数据 df.to_csv(data/processed/附件1_clean.csv, indexFalse, encodingutf-8-sig) print(数据清洗完成形状, df.shape)需要注意的是数据清洗不是越狠越好。是否剔除异常值、是否填充缺失值都要结合题目背景判断。最好在论文中单独写一节“数据预处理”描述每个字段的处理方式让评委知道你的数据是可信的。5.2 可视化插图模板论文中的图表质量直接影响阅读体验。推荐使用 Matplotlib 设置统一的论文风格把字体、坐标轴、网格、图例一次性配置好import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams[font.sans-serif] [SimHei, Microsoft YaHei] matplotlib.rcParams[axes.unicode_minus] False def set_paper_style(): plt.rcParams[figure.figsize] (8, 4.5) plt.rcParams[axes.grid] True plt.rcParams[grid.linestyle] -- plt.rcParams[grid.alpha] 0.6 plt.rcParams[font.size] 11 plt.rcParams[axes.titlesize] 13 plt.rcParams[axes.labelsize] 11 set_paper_style() # 示例绘制折线图 x np.arange(1, 13) y np.random.randint(60, 100, size12) plt.plot(x, y, markero, color#2E86AB, linewidth2, markersize6) plt.xlabel(月份) plt.ylabel(指标值) plt.title(指标随月份变化趋势) plt.tight_layout() plt.savefig(paper/figures/trend.png, dpi300) plt.show()注意SimHei 字体在论文排版中可能和 Word 不一致如果最终论文用 Word 排版建议导出高分辨率 PNG 之后再在 Word 中调整宽度和字体。5.3 大模型辅助写代码的正确用法2026 年备赛阶段很多队伍已经用大模型辅助写代码、改公式。这里给出三条实际建议让大模型解释代码含义而不是直接复制运行。如果不理解代码逻辑出了问题根本无法排查。让大模型根据题目生成建模思路框架再用队伍自己的判断筛选。大模型给出的方案不一定适合作答要求。报错时把完整报错信息贴给大模型它会比人更快定位语法错误或数据维度问题。但要注意数学建模竞赛的个人能力和团队协作仍然是核心代码可以借鉴论文摘要和模型解释必须自己写清楚。6. 论文写作拿奖的最后一公里6.1 摘要直接决定第一印象数学建模竞赛论文的评阅时间有限评委往往会优先看摘要再决定是否深入阅读正文。摘要需要包含以下信息题目背景和研究问题用两到三句话概括。每一问使用了什么模型、什么算法。关键结果是什么最好给出量化指标。模型的亮点和创新点以及验证方法。写摘要时容易出现两个极端一是过于简略只写“我们用了层次分析法和TOPSIS”完全不给结果二是过于冗长把整个推导过程都塞进摘要。推荐控制在 800 到 1000 字明确按“问题一、问题二、问题三”分段描述每个问题给出模型名称、求解方法和核心数值结果。6.2 模型假设与符号说明模型假设不宜过多也不宜过少。每条假设应该是有必要的、合理的并且在后面能解释为什么可以这样假设。符号说明表要放在模型建立之前用一个三线表把论文中出现的所有符号集中列出。符号说明示例符号含义单位$$x_i$$第 i 个决策变量的取值个$$c_i$$第 i 个决策变量的单位成本元$$b_j$$第 j 类资源的可用总量单位$$Z$$目标函数值元6.3 公式、图表与排版规范论文中公式最好使用公式编辑器不要用图片替代。图表要有编号和标题每个图都要有文字解释而不是“如下图所示”之后就没有下文。正确写法是先说明图展示了什么再分析图中体现的规律最后说明这个规律对问题结论的影响。一张合格的论文图应该做到标题、坐标轴、单位齐全。图例清晰颜色区分度好。分辨率不低于 300dpi。图的大小与正文协调不放超宽图。6.4 结果分析与灵敏度分析不能敷衍如果说摘要决定了论文能否进入“重点评阅”范围那么结果分析和灵敏度分析则决定了最终能拿到什么奖项。结果分析要做三件事对主要结果给出合理解释不能只罗列表格。对不同模型的结果进行对比说明为什么选择当前模型。对模型中的关键参数做灵敏度分析画出参数变化与结果变化的趋势图。这部分写得好即便模型本身不是特别复杂也能给评委留下“建模很扎实”的印象。7. 三天赛程时间管理7.1 72 小时整体分配华数杯赛程通常是三天左右。很多队伍第一天前半天确定题目剩下时间都在赶进度。下面给出一份经过多数获奖队伍验证的时间分配建议时间段主要任务输出物第一天上午阅读题目、分析问题、确定建模方向问题拆解文档、假设列表第一天下午数据清洗、EDA、完成第一问基础模型清洗后数据、一版图表第一天晚上完成第一问论文初稿第一问正文、图表第二天上午第二问建模、求解第二问模型代码、初步结果第二天下午第二问结果分析、完成第二问写作第二问正文第二天晚上第三问建模、求解补充模型验证第三问结果第三天上午完成第三问写作开始整合全文论文初稿第三天下午修正摘要、统一格式、补充灵敏度分析论文修改稿第三天晚上全文检查、图表编号、提交材料整理最终提交版本7.2 团队分工与人效提升常见的分工模式是“建模编程写作”三人各负责一块同时在关键节点交叉检查。如果队伍有四个人可以安排一人专门负责数据清洗和画图这样建模和写作的人不会被数据细节打断。需要提醒的是分工不是“各干各的”。每天至少安排两次全队同步会议每次 15 到 20 分钟同步模型改动、数据发现和写作进度。不然很容易出现模型已经换了论文里还在写旧模型的情况。7.3 留出 4 小时用于修改和提交最后一天晚上不建议再开发新模型。剩余时间应该用于全文错别字、公式错误、图表编号检查。摘要与正文的一致性检查。根据格式要求调整页边距、字体、行距。提前熟悉提交系统和文件命名规则。8. 常见坑点避坑指南8.1 高频问题排查表下面把数学建模竞赛中经常出现的坑点整理成表格赛前通读一遍能少踩很多坑问题现象常见原因解决思路结果与常识明显不符数据未标准化或存在异常值重新检查数据清洗过程画出分布图优化模型无法求解约束条件互相冲突用纸面推导检查约束是否矛盾逐步注释约束测试代码运行报 KeyError列名存在空格或中英文括号统一使用 str.strip() 清理列名图表中文显示乱码未设置中文字体配置 rcParams 字体为 SimHei / Microsoft YaHei摘要与正文结果不一致模型修改后未同步摘要每天同步检查摘要中的数字灵敏度分析缺失时间不够或忽略该环节至少在最终模型中做一个参数范围的灵敏度分析8.2 关于数据文件编码的提醒很多赛题附件是 Excel 文件但也会提供 CSV 格式。CSV 数据如果是中文表头用 pandas 读取时可能需要指定编码参数。常见的中文编码有 gbk 和 utf-8如果一个编码报错可以换另一个试。还有一种情况是文件开头含有中文 BOM读取时设置 encodingutf-8-sig 即可。# 尝试不同编码读取CSV for enc in [utf-8, utf-8-sig, gbk, gb18030]: try: df pd.read_csv(data/raw/附件.csv, encodingenc) print(读取成功编码为, enc) break except UnicodeDecodeError: continue8.3 不要沉迷于“炫技模型”A 题拿奖不取决于模型有多前沿而取决于模型是否贴合问题、结果是否可靠。如果队伍对某个复杂算法掌握不牢强行使用到最后解不出结果不如把经典模型做到位。评委更看重逻辑闭环和结果可信度而不是看模型名字够不够高深。9. 总结与最后建议2026 年华数杯 A 题的备战核心在于“完整链路”四个字读题要拆透建模要合理代码要能跑论文要写全。建议赛前用一天时间把本文中的代码模板全部在本地跑通同时准备一份自己队伍的“代码片段库”比赛时按需调用。最后给三条实用建议一是全程保留中间结果不要反复覆盖文件方便回溯二是摘要写完后请队伍之外的老师或同学看一眼看能不能在 30 秒内看懂三是在提交前至少做一次全流程演练从读取数据到输出论文确保每一环都不卡壳。祝大家在 2026 华数杯 A 题中稳定发挥拿到满意的奖项。