2021年国赛还没出成绩那阵,各群的讨论焦点就分成了三拨:一拨在算反射面三角形怎么转,一拨在拟合乙醇转化率的曲线,还有一拨在对着402家供应商的数据发呆。作为带过几年队伍、也参与过赛题复盘的老兵,我一直觉得2021年的三道题是近年质量最高的一年——A题考几何优化与物理建模,B题考化工数据挖掘与机理解释,C题考供应链运筹与大数据决策,三个截然不同的方向凑在一起,恰好把数学建模竞赛的三大主流范式一网打尽。这篇复盘就当是给后来者的地图,我会按题目逐一拆解建模思路、算法选型和踩坑记录,已经参赛的可以对照检查,正在备赛的可以直接拿来当训练指南。
1. 2021年赛题整体解读:三道题,三种建模范式的碰撞
先说选题。很多队伍拿到题的第一反应是“A题看不懂、B题不会画、C题数据太多”,于是纠结大半天才选定题目。其实这三道题的风格差异非常明显,适合的队伍类型也完全不同。A题FAST主动反射面形状调节,属于典型的几何+物理建模加约束优化,适合空间想象能力强、擅长数值计算的队伍;B题乙醇偶合制备C4烯烃,本质是化工实验数据分析加反应条件寻优,适合统计功底扎实、愿意钻研专业背景的队伍;C题原材料订购与运输,则是标准的供应链优化加数据挖掘,适合数据处理熟练、会调求解器的队伍。选错方向的结果,就是三天里每天都在跟自己的短板搏斗。
评审层面,国赛历来重视模型合理性、结果可复现性和论文表达三件事。A题需要给出明确的节点调节量和反射面精度指标,B题需要给出可操作的催化剂配方结论,C题需要给出能直接执行的订购与转运方案。三道题最终都要求落在“具体、可量化、可验证”的输出上,这比你在论文里堆了多少个时髦模型重要得多。我见过不少队伍用了非常复杂的神经网络或强化学习,结果无用武之地,因为评委要的是结果对不对、逻辑通不通,而不是模型名字好不好听。
还有一点建议:赛前把近三年赛题都扫一遍,明确自己队伍擅长哪类问题。比赛前6小时集中读题加检索资料,然后当机立断定题,不要在A、B、C之间反复横跳。2021年有个队伍上午选的A题,下午换B题,晚上又切回A题,最后交出来的论文里模型框架还是乱的,这种教训每年都在重复。
2. A题:FAST主动反射面形状调节——最硬核的一道题
2.1 题目核心任务与物理背景
A题的背景是500米口径球面射电望远镜,也就是常说的“天眼”。它的反射面是一个半径约300米的球冠,工作时需要把反射面从基准球面调节成工作抛物面,以便将电磁波聚焦到馈源舱。整体调节过程由固定在主索节点上的促动器完成,每个节点只能沿径向移动,且移动范围存在物理限位。
题目把这个大工程抽象成了一个数学问题:给定天体位置对应的理想抛物面参数,以及反射面的三角形剖分数据和节点坐标,要求求解每个节点的径向调节量,使实际反射面尽可能逼近理想抛物面,并评估调节后的精度。这里“实际反射面”不是那个光滑的抛物面,而是由几千块三角形面板拼出来的离散曲面。换句话说,我们要做的,是用一堆平面三角形去近似拟合一个目标曲面,这在计算机图形学里叫离散曲面逼近,在工程优化里叫形状控制。
这个题好就好在它的“物理味道”足够浓。节点不是随便动的,所有调节都沿着球心径向方向;三角形面板不能扭曲,只能整体平移旋转;促动器行程有上限,不能为了拟合精度无限调节。这些约束让题目一下子从纯数学游戏变成了有工程灵魂的优化问题。
2.2 问题拆解与几何建模思路
我带过的队伍里,A题拿到高分的通常是这样拆任务的。
第一步,坐标系与节点位移表达。以球心为原点建立三维直角坐标系,每个主索节点在基准球面上的坐标是已知的。节点沿径向调节后,新坐标可以写成原坐标乘以一个缩放因子。具体地,如果某节点的径向调节量是δ,那么它调节后的坐标就是原坐标乘以(1 + δ / R),这里R是基准球面半径。这个表达式虽然简单,却是后续所有计算的基石。不少队伍在这里把方向搞反,或者忘了加基准半径,导致后面全盘算错。
第二步,理想工作抛物面的参数化。题目会给天体所在方位角,然后要求确定工作抛物面的顶点位置、对称轴方向和焦距。这里最关键的技巧是坐标变换:把所有节点坐标变换到以抛物面顶点为原点、对称轴为z轴的局部坐标系中,在这个坐标系里抛物面方程就是标准的z = (x² + y²) / 4f。旋转矩阵看起来简单,但写错一个符号或者轴的顺序不对,结果就会完全跑偏。我建议在这个环节多花半小时做一次交叉验证,用已知对称轴方向的简单例子检验变换矩阵是否正确。
第三步,目标函数与约束建模。对每个工作状态,先确定哪些节点处于被照亮的反射区域内,然后以实际反射面与理想抛物面的偏差最小为目标。常用的目标函数有两种:一种是计算每个节点调节后位置与理想抛物面上对应点的距离平方和,另一种是计算每个三角形面板质心处相对理想抛物面的偏差并按面板面积加权求均方根误差。我个人更推荐后者,因为它更符合“反射面精度”的物理含义——毕竟电磁波是打在面板上的,不是打在节点上的。
约束方面,除了每个节点的径向调节量必须在物理限位范围内,还要考虑相邻面板在公共节点处的位置连续性。好在三角形网格天然保证了节点处连续,所以约束主要集中在调节量限位上。如果发现最优解的某些节点调节量越界,不要简单地删掉它,而应该采用“active set”的思想,把越界节点钳位到边界值,再重新求解其余节点的最优值。
2.3 核心算法:从最小二乘到智能优化的组合策略
在算法层面,A题的常见路径有三条,各有优劣。
第一类是交替最小二乘。先固定抛物面参数,求解每个节点的最优径向调节量,这是一个线性最小二乘问题,可以用正规方程或QR分解直接求解;然后再固定节点调节量,微调抛物面的焦距或姿态参数,这通常是非线性问题,可以用牛顿法或高斯-牛顿法。两步交替迭代,收敛速度快,工程上非常实用。缺点是容易陷入局部最优,尤其在抛物面偏轴角度较大的时候。
第二类是智能优化算法,比如粒子群、遗传算法、模拟退火。把每个节点的调节量编码成个体,目标函数就是RMS误差,直接在可行域内搜索。这类方法适用范围广,但计算量实在太大。A题有成百上千个可调节点,直接对全部节点编码做全局搜索,普通电脑根本跑不动。聪明的做法是先降维:先用最小二乘快速得到一个不错的初始解,再用粒子群在初始解附近做局部精细调整,这样既有了速度,又有了全局搜索能力。
第三类是分治加并行。按照照亮区域把反射面切成若干子区域,每个子区域独立优化,再通过边界连续性约束做整体协调。这一招当年用的人不多,但在节点数量巨大的情况下非常有效。如果队伍里有编程能力强的同学,用Python的多进程库把子区域并行计算,效率提升非常明显。
无论选哪条路径,最后都要做灵敏度分析。比如把某个节点的调节量人为设偏,观察RMS误差的变化,判断优化结果是否对初始值敏感。这个分析虽然不直接影响最终数值,但在论文里写出来,会让评委觉得你的工作是严谨的工程研究,而不是撞出来的结果。
2.4 状态切换与多目标问题
A题除了单个工作状态的寻优,还有多个工作状态切换的考察点。望远镜在工作时要跟踪天体运动,天体在天空中的方位角和仰角变化,要求反射面持续调整。这时问题就变成了:在满足各状态反射面精度要求的前提下,最小化整个调节过程中的总调节量或最大节点调节速度。
这一问本质上是多目标优化。一种做法是把各状态精度和状态切换调节成本做加权求和,变成单目标优化;另一种做法是先求解每一个状态的独立最优解,再在相邻状态之间做最小成本路径规划,类似动态规划的思路。很多队伍漏掉了状态切换的连续性,以为每个状态独立求解就完事了,最后被评委指出“工程上不可行”,非常可惜。
额外提醒一句:A题的数据文件里给了节点编号和面板连接关系,建议先写个小脚本检查数据完整性,比如是否存在重复节点、面板是否闭合。这个检查五分钟就能完成,但能避免你在错误的数据上白跑一天的优化。
3. B题:乙醇偶合制备C4烯烃——把化学反应变成数学语言
3.1 题目到底要我们做什么
B题的背景是化工领域的一条真实研究路线:乙醇在催化剂作用下偶合制备C4烯烃,也就是丁烯等碳四烯烃。题目给了若干组实验数据,每个样本包含反应温度、催化剂组合(不同催化剂的质量配比、装填方式等)、乙醇转化率、C4烯烃选择性以及C4烯烃收率。
核心任务概括起来有三件:第一,分析催化剂组合和温度对乙醇转化率与C4烯烃选择性的定量影响;第二,建立模型描述这种影响关系,并找出能最大化C4烯烃收率的工艺条件;第三,为企业设计新的催化剂配方实验方案提供量化建议。
这题对有化工背景的队伍来说相对友好,但对纯数学或计算机背景的队伍存在天然门槛。最典型的问题是不理解“转化率”和“选择性”的区别。举个例子:转化率相当于你一共吃了十个包子,被消化了六个,转化率就是60%;选择性相当于这六个被消化的包子里,有多少被转化成了你真正想要的肌肉,而不是变成脂肪。收率就是转化率乘选择性,也就是十个包子里最终变成肌肉的部分。这个关系式是整道题的地基,写论文时必须放在显眼位置并解释清楚。
3.2 从数据探索到回归建模的完整路径
拿到数据后,建议按三步走。
第一步,统计描述加可视化。先把所有变量的分布、均值、方差拉出来看一遍,再用散点图或箱线图看温度、催化剂配比与转化率、选择性之间的关系。不要跳过这一步直接上模型。2021年的数据显示,温度对转化率的影响往往是单调上升的,但对选择性的影响可能是先升后降,这种非线性特征通过可视化一眼就能看出来,而上模型反而容易忽略。
第二步,方差分析和特征筛选。B题的特征既有连续变量(温度、各组分含量),也有类别变量(催化剂编号、载体类型),还有交互作用。建议先做ANOVA或者用随机森林的特征重要性排序,筛掉对响应几乎没有影响的特征,减少后续建模的负担。
第三步,建模。我推荐的路径是:用带交互项的多项式回归作为主力模型,用随机森林或XGBoost作为对照组。如果你只想预测,机器学习模型可能精度更高;但如果你还需要解释“为什么”,甚至要写入论文作为工艺指南,多项式回归的系数解释价值是黑箱模型完全比不上的。
这里有一个非常关键的统计陷阱:催化剂各组分的配比往往存在总和约束,比如A、B、C三种催化剂的质量配比加起来等于某个固定值,这就导致了多重共线性。普通最小二乘在这种数据上极不稳定,回归系数可能大得离谱,甚至符号都和物理直觉相反。解决办法是使用岭回归或主成分回归,或者干脆把一个组分作为基准,只把其他组分的相对比例作为特征。当年不少队伍的回归系数出现“温度越高转化率越低”这种反直觉结果,十有八九就是多重共线性在作祟。
3.3 结果呈现与工艺优化
化工类题目非常看重物理解释性。你在论文里写“温度系数为正,说明升温有利于乙醇转化”,评委就会认为你真的理解了这个反应过程;如果你只是列出一堆回归系数而不做任何机理解释,那跟报流水账没有区别。所以每一个显著系数的正负号,都要尽量结合化学反应原理去解释。比如高温通常提高转化率,但可能因为副反应加剧而降低选择性,这种“温度对转化率的正面影响和对选择性的负面影响”在模型里表现为两个响应方程的系数符号相反,写出来会让论文内容非常饱满。
工艺优化部分,不要只给一个“最优解”的孤立点。工程上更合理的输出是一个操作窗口,例如推荐温度区间、催化剂配比范围,以及在这个范围内C4烯烃收率的预测值和置信区间。具体做法是在回归模型的预测面上做置信域估计,或者对模型施加小幅扰动做蒙特卡洛采样,看最优解是否稳定。这样输出的结论才具备工程可信度。
还要特别注意新实验方案的预测。B题后面的问题会要求你对新催化剂组合的新实验条件给出预估,这时候模型的外推能力比拟合精度更重要。我的建议是:在建立最终模型时,把训练集的样本按实验条件分层,而不是随机切分,这样能检验模型在未见过的条件组合下是否仍然可靠。
4. C题:生产企业原材料的订购与运输——大数据加运筹优化的综合实战
4.1 题目背景与数据理解
C题还原了一个非常真实的制造业采购场景。一家生产企业每周生产需要消耗A、B、C三类原材料,候选供应商有402家,原材料的运输由8家转运商负责。题目给出了48周内每家供应商的供货量数据、到货原材料的质量情况、转运商的运力和运输损耗率等信息。
最终目标有两层:第一层是决策向哪些供应商订购多少原材料,第二层是决策选择哪几家转运商以及如何分配运量。约束条件包括满足生产需求的库存下限、仓储容量上限、供应商供货能力上限、转运商运力上限,以及尽可能控制订购与转运总成本。
读题时最容易犯的错误是把两问割裂开。事实上,一旦确定了订购方案,转运方案必须同步匹配,因为转运商的运力上限和损耗率会直接决定实际到货量能否满足生产。最稳的思路是把整题拆成“供应商评价→订购优化→转运分配→两阶段迭代”的流水线,先做初步决策,再检验物流可行性,循环修正。
4.2 供应商评价体系怎么搭
C题第一问的核心是供应商评价。题目没有直接告诉我们谁好谁坏,需要自己定义标准。我当时给队伍的建议是,从三个维度评价:供货稳定性、供货质量和供货效率。
供货稳定性可以用每周供货量的均值、方差或变异系数来衡量,也可以用“周供货量是否连续”“缺货周数占比”来刻画。供货质量方面,题目给了到货质量的缺陷数据,可以用缺陷率或不合格批次占比来衡量。供货效率方面,可以用实际供货量与订购量的比值来衡量——有些供应商答应供货100件,实际只到80件,这种就要扣分。
评价方法上,推荐先用ABC分类法把402家供应商分成核心、重要、一般三类,对核心供应商再用TOPSIS方法做精细排序。TOPSIS的好处是结果直观,不用人为指定太多主观权重。如果想让权重更有说服力,可以结合熵权法自动确定权重。这个组合去年在C题上相当普及,但大家结果差异很大,差异来源就在数据预处理上。
这里有一个很多人没处理好的细节:48周的数据里充斥着大量零值。有些供应商很多周没有供货,但这可能只是因为企业没有下单,而不是供应商不供货。直接把所有周的供货量取均值,会严重低估供应商的真实能力。正确的做法是先看订单数据,区分“未下单”和“下单未供货”两种情况,前者不算供应商的过错,后者才是供应风险。这个细节处理到位,你的供应商排序跟别人的会有本质区别。
4.3 订购与转运联合优化模型
第二问开始进入运筹优化的主场。首先需要预测未来24周每周的生产需求量,推荐用移动平均、指数平滑或ARIMA这类经典时序方法。需求量预测越准,后面的订购计划越合理,但不要花太多时间追求预测模型的精妙,因为这道题的核心得分点还是在订购优化部分。
订购优化模型的目标函数是总成本最小化,总成本等于原材料采购成本加上转运费用。决策变量包括未来24周每周向每家供应商订购的每类原材料数量,以及是否选用某家转运商的0-1变量。约束条件包括:每周库存不低于安全库存、库存不超过仓储上限、每家供应商每类原材料的供货量不超过其历史供货能力上限、至少选用一定数量的转运商,以及运输损耗要实际计入到货量。
工具选择上,小规模问题用Python的PuLP或SciPy自带混合整数规划接口就能解,规模大了建议上Gurobi或COPT。我在辅导时发现,很多队伍模型建得完全正确,结果却出在不会用求解器上——有人在Excel里手动试着调参,有人写了遗传算法却连收敛条件都没设对。运筹优化的纪律很简单:先建模,再选求解器,最后才考虑要不要上启发式算法。
有个坑必须单独提:不要忘记把损耗率放进约束里。题目给了不同转运商对不同原材料类别的损耗率,实际到货量是发货量乘以1减损耗率。如果模型里只按发货量计算是否满足生产需求,库存计划会乐观得一塌糊涂——损耗部分会被忽略,最终实际库存低于安全线。正确做法是引入“有效到货量”的概念,让配送数量乘上到货率之后再进入库存约束。
第三问一般会加额外的复杂性,比如某些供应商供货不稳定、转运商运力波动等。这时候做蒙特卡洛模拟是很好的选择:对供货量和运力加入随机扰动,模拟1000次,统计缺货概率和库存水平分布。输出几个关键情景下的风险指标,整个模型的完成度就非常高了。
5. 参赛实操经验与避坑指南
5.1 选题策略与时间分配
前面说了,选题要结合队伍能力画像。这里再补充一点:赛前最好每个人都独立读一遍三道题,写下自己理解的“核心难点”,然后碰头对比。如果三个人对同一道题的难点理解完全一致,说明这道题适合你们;如果分歧很大,说明你们还没读透,需要再查资料。
时间分配上,我推荐“1-3-5-1”节奏。第一天完成读题、查文献、搭模型框架;第二天完成核心模型的推导和编程实现,一定要在第二天晚上之前跑出第一版结果;第三天上午做灵敏度分析和结果校验,下午集中写论文;最后一天凌晨打磨排版、画图、校对摘要。注意,国赛虽然表面上有三天,但最后一天上午就要交论文,所以真正可控的只有前面两天多。很多队伍把第一天耗在读题和纠结上,第三天还在改模型,论文只能草草收尾,这就是时间分配的失败。
5.2 论文写作的硬指标
国赛论文的评分权重里,摘要和模型建立占了非常大的比例。摘要要控制在700字以内,开门见山:问题是什么、用了什么模型、关键结果是什么。不要写“本文采用”这种废话开场,更不要罗列所有模型的名字。评委一天看几十篇论文,摘要决定了他愿不愿意继续读下去。
图表质量同样重要。A题要画反射面调节前后对比图和误差分布热力图;B题要画拟合曲线、残差图和优化结果等高线图;C题要画供应商评价排序表、每周订购量堆叠图、库存变化曲线和转运分配图。所有图都要有坐标轴标签、单位、图例,禁止直接截图敷衍。建议赛前就把Python的matplotlib绘图模板准备好,包括配色、字体、尺寸,省得到时候现查现写。
还有一个几乎每年都有人踩的坑:不写模型的局限性。很多队伍写“本文模型完美解决了所有问题”,评委看到这种表述只会觉得不专业。任何模型都有适用范围,你要主动写出它在什么条件下会失效,比如A题模型在偏轴角度大于多少时精度下降,C题模型在供应商突发断供时鲁棒性如何。直面模型的不足,反而会让评委认为你有科研态度。
5.3 常见问题速查表
我把近几年辅导中遇到的高频问题整理成了表格,方便大家自查:
| 常见问题 | 典型表现 | 解决方案 |
|---|---|---|
| 数据不归一化 | 特征量纲差异大,回归系数失真 | 训练前做标准差标准化或最小最大缩放 |
| 优化模型无解 | 求解器报infeasible | 检查约束是否冲突,适当放宽并加惩罚项 |
| 模型过拟合 | 训练集精度高、测试集明显变差 | 交叉验证;减少特征;加L2正则化 |
| 单位不一致 | 论文里米、吨、立方米混用 | 建模前统一单位,全篇复核 |
| 代码与论文不一致 | 论文里的结果重新运行对不上 | 写论文前冻结代码版本,保存结果缓存 |
| 智能算法不收敛 | 每次运行结果差别很大 | 固定随机种子,多次运行取最优并记录分布 |
这张表看着简单,但每年都有队伍在同样的地方栽跟头。尤其是代码与论文不一致这个问题,比赛最后一天大家都在赶工,很容易出现论文里写的结果是用旧版代码算出来的、新版代码已经改过模型的情况。建议每次修改模型后立刻重跑所有关键结果,并同步更新论文数据,做到“代码即真相”。
6. 赛后复盘:从赛题到能力的转化
三道题做完之后,值得花时间复盘一下它们对能力的长期价值。A题让你完整走了一遍从物理原理到数值算法的链路:几何变换、最小二乘、约束优化、误差评估,这套方法论在土木工程、机械设计、机器人控制里都通用。B题训练的是从实验数据到机理推断的科学思维,先探索再建模再解释,每一步都要求你既懂统计又懂领域背景。C题则是最贴近真实商业场景的,供应商管理、库存控制、物流调度,这套方法拿到任何制造型企业都能直接落地。
我在辅导和评审中反复感受到,获奖队伍和普通队伍的差距往往不在模型的高级程度,而在三点:对题目数据的理解深度、对约束条件的敬畏程度、以及把结果讲清楚的能力。2021年的三道题恰好把这三样本事都考到了。
如果现在还在备赛,我强烈建议拿这三道题做一次完整的三天模拟训练。即使不参赛,也动手把A题的反射面调节或C题的订购优化用Python完整实现一遍。跑通一次之后,你会发现自己对“建模”两个字的理解会完全不一样。到了下一次比赛题目下来的那天,你不会再盯着题发呆问“用什么模型”,而是会先问自己三个问题:题目的物理本质是什么,数据边界在哪里,我要交付什么样的结果。这三个问题想清楚,后面的路自然就顺了。