☰
数学建模2021C题全解:从指标构造到灵敏度分析的得分链路
2026/10/26 10:33:53 网站建设 项目流程

简介:这份资料面向备战全国大学生数学建模竞赛的参赛者与指导教师,聚焦2021年C题,提供从解题思路、模型构建到算法实现的完整参考,适合需要复盘赛题、学习建模流程与MATLAB编程的学习者。压缩包共27个文件,约996KB,以13个.m脚本、10个.mat数据文件和4个.xlsx表格为主:脚本对应各小问的求解实现,数据文件保存中间计算结果便于复现,表格则涵盖供应商与转运商原始数据及订购、转运方案结果。目前已有2310人学习。读者可据此对照题目理解建模步骤,从问题解读、模型建立、数值求解到结果验证与敏感性分析逐层推进,并借助完整代码与数据复现计算过程,体会数学理论如何转化为可运行程序,对提升建模与编程能力有实际帮助。

1. 从一道“看起来会做、算出来全错”的题说起

数学建模 2021 年 C 题的资料,真正拉开差距的地方不在“会不会建模”,而在“能不能把一道开放题算到阅卷人愿意给分”。这道题给的数据量大、指标口径多、问法层层递进,很多人第一问还能写,第二问开始就翻车:模型选错、指标算错、结果对不上、论文里全是“本文采用某某方法”却说不清为什么。备考这类竞赛,核心不是背算法,而是把“读题—选模型—算指标—写结论”这条链路练成条件反射。这份资料把 2021 年 C 题的全部代码和过程拆开,适合已经学过基础建模、但一到真题就不知道从哪下手的人。下面按考点分布、高频问法、逐题思路、易错点一路讲透,你照着练就能把分拿稳。

2. 考点分布:这道题到底在考哪几块能力

2.1 题目结构拆解与分值逻辑

2021 年 C 题属于典型的“数据驱动 + 多目标评价”型赛题。它不会直接告诉你用哪个算法,而是给一堆原始数据和企业背景,让你自己定义指标、建模型、给结论。阅卷时的给分逻辑大致是:问题理解与假设(约 15%)、模型建立与合理性(约 30%)、求解与结果(约 30%)、检验与灵敏度(约 15%)、论文表达(约 10%)。这个比例意味着,哪怕你模型不高级,只要假设清楚、结果自洽、检验到位,分数就不会低;反过来,模型再花哨,结果对不上、没有检验,直接掉档。

从能力维度看,这道题集中考四块:第一是数据清洗与指标构造,原始数据往往有缺失、量纲不一、异常值,能不能处理干净直接影响后面所有问;第二是多指标评价与排序,涉及权重确定、综合评价;第三是优化或预测类建模,需要根据问法选对工具;第四是结果检验,包括灵敏度分析和误差讨论。这四块在资料里都有对应代码,但代码只是壳,真正要背的是“什么问法对应什么模型”。

提示:不要一上来就翻代码。先把题目每一问的关键动词圈出来——“分析”“建立”“给出”“检验”对应的产出物完全不同,圈错了后面全白做。

2.2 高频考点清单与对应模型

把这道题反复出现的考点归拢,大概是下面这几类,每一类都对应固定的答题套路:

考点模块常见问法首选模型/方法答题产出
指标构造请建立评价指标体系层次分析 + 相关性筛选指标表 + 权重
综合评价对对象排序/分级TOPSIS、熵权法、灰色关联排序表 + 分级结果
参数确定确定某系数/阈值回归、拟合、规划反推参数值 + 拟合优度
优化决策在约束下使某目标最优线性/整数规划最优方案 + 约束说明
结果检验分析结果可靠性灵敏度分析、扰动实验变化表 + 结论

这张表建议直接背下来。考场上看到“排序”两个字,脑子里第一反应就该是 TOPSIS 或熵权法;看到“在满足……条件下使……最大/最小”,就是规划模型。资料里的代码基本按这个映射组织,你练的时候要刻意把“问法→模型”这条对应关系练熟,而不是记住某段代码长什么样。

2.3 真题演练:指标权重怎么定才不被扣分

题目(模拟问法):请根据附件数据,建立供应商或对象的综合评价体系,并给出排序结果。

答题思路:这类题面试官和阅卷人最想听的是“你为什么这么定权重”。标准答法是三步走。第一步,先做指标筛选,用相关性分析去掉高度重复的指标,说明“避免信息重叠”;第二步,权重确定给出主客观结合的理由,比如“熵权法反映数据离散程度,层次分析反映业务经验,两者加权综合”;第三步,用 TOPSIS 算出贴近度并排序,最后补一句灵敏度检验“当权重扰动 ±10% 时排序前三位不变”。这三步写全,哪怕模型简单,分数也稳。

资料里对应的代码大致是这样组织的(示意,非原题逐行):

import numpy as np import pandas as pd # 读取清洗后的指标矩阵,行=对象,列=指标 data = pd.read_csv("indicators.csv") X = data.values.astype(float) # 正向化 + 归一化,消除量纲影响 def normalize(mat): return mat / np.sqrt((mat ** 2).sum(axis=0)) # 熵权法求权重 def entropy_weight(mat): p = mat / mat.sum(axis=0) e = -(p * np.log(p + 1e-12)).sum(axis=0) / np.log(len(mat)) return (1 - e) / (1 - e).sum() Z = normalize(X) w = entropy_weight(Z) score = (Z * w).sum(axis=1) # 综合得分 print(pd.Series(score, index=data.index).sort_values(ascending=False))

这段代码的关键在三个参数:归一化方式决定量纲是否可比,1e-12是防止 log 零的兜底,权重向量w的和必须为 1。跑完一定要检查权重和是否等于 1、得分排序是否和业务直觉一致,不一致就要回头查指标方向有没有搞反——正向指标和负向指标混在一起是最常见的翻车点。

3. 高频考点:优化与预测类问法的答题模板

3.1 规划类问法:约束写不全等于没做

这道题里但凡出现“在资源有限条件下安排……使……最优”,就是规划模型。很多人失分不是因为不会调库,而是约束条件漏写。答题模板固定为四段:决策变量定义、目标函数、约束条件、求解与结果解释。决策变量要写清单位和取值范围,目标函数要说明是最大化利润还是最小化成本,约束要覆盖资源上限、需求下限、逻辑互斥三类。资料里的代码用线性规划求解,核心是把业务语言翻译成不等式。

from scipy.optimize import linprog # 目标:最小化成本,c 为各决策变量单位成本 c = [4, 3, 5] # 不等式约束 A_ub @ x <= b_ub,每行对应一条资源上限 A_ub = [[2, 1, 3], [1, 2, 1]] b_ub = [60, 40] # 变量下界,防止出现负的安排量 bounds = [(0, None), (0, None), (0, None)] res = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method="highs") print(res.fun, res.x)

A_ub的每一行就是一条约束,漏一条结果就可能“看起来最优但实际不可行”。bounds一定要设,否则求解器可能给出负数方案,论文里直接判不合理。跑完要看res.success是否为真,失败时优先检查约束是否互相矛盾,而不是急着换算法。

3.2 预测类问法:别把拟合当预测

题目里如果有“根据历史数据预测未来趋势”,考的是你能不能区分拟合和预测。答题时要写清训练集与验证集划分、评价指标(如均方误差)、以及预测区间。资料里用回归加残差检验的套路,核心代码不长,但解释比代码重要。

import numpy as np from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # X_train 为历史特征,y_train 为目标值 model = LinearRegression().fit(X_train, y_train) pred = model.predict(X_test) rmse = np.sqrt(mean_squared_error(y_test, pred)) print("RMSE:", rmse, "系数:", model.coef_)

这里coef_的符号和大小要能讲出业务含义,RMSE 要和其他模型对比才有说服力。只报一个 RMSE 数字、不解释、不对比,是预测类题最常见的丢分方式。

3.3 真题演练:多问递进怎么串成一条线

题目(模拟问法):第一问要求建立评价体系,第二问要求在此基础上做优化,第三问要求检验方案稳定性。

答题思路:这类递进题最忌讳三问各写各的。面试官想听的是“你的第二问是不是真的用了第一问的结果”。正确答法是:第一问输出权重和排序,第二问把排序靠前的对象作为优化输入,第三问对第二问的关键参数做扰动。三问之间用一句话衔接,比如“基于第一问得到的综合得分,选取前若干对象进入优化模型”。资料里的代码也是按这个数据流组织的,你练的时候要刻意检查:第二问的输入变量是不是第一问的输出,如果不是,说明逻辑断了。

4. 易错点:五个最容易丢分的坑

4.1 指标方向搞反

错在哪:正向指标(越大越好)和负向指标(越小越好)没区分,直接一起归一化。为什么错:方向反了,排序会整体颠倒,后面所有结论全错。怎么答对:归一化前先给每个指标标注方向,负向指标取倒数或做极差反向处理,并在论文里写明处理方式。

4.2 权重不归一

错在哪:熵权法或层次分析算出的权重加起来不等于 1。为什么错:综合得分失去可比性,排序结果不可信。怎么答对:算完权重强制做一次归一化,代码里加一行w = w / w.sum(),并在结果表里核对。

4.3 约束漏写导致方案不可行

错在哪:规划模型只写了目标函数,资源上限、需求下限漏掉。为什么错:求解器给出的“最优解”在实际业务里根本执行不了。怎么答对:建模前先把所有限制条件列成清单,逐条翻译成不等式,求解后回代验证每条约束是否满足。

4.4 把拟合优度当预测精度

错在哪:只报 R² 很高就说模型好。为什么错:R² 高只说明拟合好,不代表新数据预测准。怎么答对:划分验证集,报 RMSE 或 MAE,并给出预测区间,必要时做残差分析。

4.5 没有灵敏度分析

错在哪:结果算完直接下结论。为什么错:阅卷人无法判断结论稳不稳,直接扣检验分。怎么答对:对关键参数做 ±5% 或 ±10% 扰动,列表说明排序或最优值是否变化,变化大就讨论原因。

注意:这五条里,指标方向和数据归一化是最容易在第一步就翻车的地方,建议每次建模前先把这两件事做成检查清单,跑完代码逐条打勾。

5. 答题技巧:把代码变成能得分的论文语言

5.1 从代码结果到论文结论的翻译方法

很多人代码跑通了,论文却写不出来,原因是不会把数字翻译成结论。方法很简单:每个结果表后面强制写三句话——第一句说“结果是什么”,第二句说“为什么是这样”,第三句说“这意味着什么”。比如排序表出来后写:“综合得分前三位为 A、B、C,主要因为这三者在成本指标上优势明显;说明在现有权重体系下成本是主导因素。”这三句话就是阅卷人想看的分析,而不是把表格一贴了事。

5.2 押题思路:下一道同类题大概率还考这些

同类数据驱动赛题的高频组合基本稳定:评价 + 优化 + 检验三件套。押题不用押具体数据,押的是“问法组合”。看到“建立指标体系并排序”,准备 TOPSIS 加熵权;看到“在约束下最优”,准备规划模型加约束清单;看到“分析可靠性”,准备灵敏度分析模板。资料里的代码覆盖了这三类,你练的时候按“问法→模板→代码→结论”四步走一遍,比单纯抄代码有用得多。

5.3 一套可复用的检查流程

每次交卷前强制走一遍:指标方向是否标注、权重是否归一、约束是否回代验证、预测是否划分验证集、关键参数是否做扰动、每个结果表后是否有三句分析。这六项走完,基本不会出现“会做但丢分”的情况。我自己的血泪经验是,早年一次模拟赛代码全跑通,结果指标方向反了两个,排序整个颠倒,复查时才发现,从那以后每次建模我都强制先做方向和归一化检查再往下走。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询