每年华为杯研赛开题那天,我都能在各大群里看到一片哀嚎——尤其是E题。倒不是说E题难到做不出来,而是它信息量大、问题层层嵌套,往往第一眼看上去根本不知道从哪下手。拿近年题型来说,比如高速公路应急车道启用、脑卒中诊疗分析这类题目,表面上是几个互不相干的问号,实际上背后是一整套“数据处理—特征洞察—模型构建—结果落地”的思维链。
这篇东西不是替你做具体某一道E题的答案,而是把我自己带比赛这些年总结出来的通用打法完整拆给你看。核心思路只有一句话:E题考的不是“谁模型更高级”,而是“谁把问题拆得更清楚、把故事讲得更圆”。只要掌握了判题逻辑、建模套路和写作节奏,哪怕你接触一道全新的E题,也能在三天内拿出一篇不慌不忙的完整论文。适合第一次参加研赛的新手快速入门,也适合已经做过几届但总觉得时间不够用的老手对照复盘。
1. 拿到题目的第一个小时,别急着查资料
很多队伍的习惯是开题后立刻上网搜文献、找数据集,这个动作本身没问题,但顺序错了。E题的信息密度和交互逻辑很强,前一个小时最该做的是“静态读题”,也就是把题目原文、附件说明、数据字段挨个读透,而不是先被外部信息带偏。
1.1 快速判断这题属于哪一类模型题
数学建模题目虽然每年花样翻新,但骨架无非几大类:优化决策类、预测类、评价分级类、机理反演类,以及前几类的组合。E题尤其喜欢出“评价+优化”或“预测+决策”的复合题型,比如应急车道的启用问题,核心是先回答“哪些路段在哪些时段的启用效益最高”,这就是一个典型的评价排序问题;再追问“如何动态启用以实现路网通行效率最大化”,这就滑向了优化问题。
判断类型的技巧是看问题里的动词。出现“评估”“评价”“排名”“优劣”这类词,优先往指标体系和权重方法上靠;出现“如何”“最优”“方案”“策略”,立刻切换到优化模型的框架;出现“预测未来”“估计某时段”“推算趋势”,就该准备时序模型或回归类模型了。如果一道题里三组词都有,别慌,它往往是由浅入深的阶梯式设问,前面的小问是为后面铺垫的,你在第1小问建立的指标,到第3小问还能继续复用。
1.2 把小问拆成可独立推进的模块
读题之后要做的不是马上建模,而是画一张问题结构图(用纸笔或draw.io都行)。把从A到E的每个小问写下来,然后在旁边标注:这个小问的输入是什么、输出是什么、依赖前面哪个小问的结果、可能用到哪类方法。做完这一步,整道题的逻辑链条就清晰了。
以应急车道题目为例,第1问如果要求构建“启用效益评估指标体系”,那输出是一个或几个综合评分值;第2问如果要求建立“动态启用决策模型”,它的输入就来自第1问产生的评分结果,外加交通流数据;第3问如果要求“验证策略有效性”,就需要第2问的决策结果接入仿真或统计检验。这么一拆,你就会发现,所谓“完整做对一道E题”,本质上是把相邻小问之间的接口打通。很多队伍卡在第2问,是因为第1问的指标设计得太粗糙,没有为后面预留扩展空间。
1.3 赛前就把工具链和分工固定下来
历年E题的数据处理量都很大,开赛后再临时商量谁用什么软件、谁负责哪一块,效率极低。我建议开赛前就固定角色:建模手负责核心模型推导与公式设计,编程手负责数据清洗和算法实现,写作手负责把每小问的思路翻译成“评委会认可的语言”。
工具上,Python和MATLAB二选一作为主力就行,不必贪多。Python生态更适合做数据清洗、可视化和机器学习;MATLAB在矩阵运算和传统优化求解上依然强势。我的习惯是数据预处理和画图用Python(pandas、matplotlib、seaborn),优化求解和敏感性分析用MATLAB(linprog、fmincon、ga),最后出图统一用MATLAB的导出功能保证清晰度。写作手第一天不需要写正文,但要同步建好论文模板,把摘要、问题重述、模型假设这些框架性内容先行填充,后面两天只做替换和微调,会省出大量时间。
2. 数据预处理和探索性分析:建模前最容易被低估的环节
E题给的数据往往“看着整齐、实则脏乱”。字段命名随意、时间戳秒级不对齐、缺失值放进Excel里用颜色标灰而不是null值,这类状况我每届都能遇到。数据质量直接决定模型上限,这一环节占总时间的比例最好不要低于20%。
2.1 数据清洗必须手到擒来的五种操作
先说处理顺序,我的固定流程是:去重、对齐时间、填补缺失、剔除或标记异常、统一量纲。
去重这块,E题交通类数据常见“同一时刻多个传感器重复上报”的情况,pandas里用drop_duplicates(subset=['time','location'], keep='first')就能解决。时间对齐是个隐藏大坑,不同检测器的上报频率可能一个是1分钟一个是5分钟,如果直接拼接,会出现大量np.nan。常规做法是以最细粒度时间为基准做重采样(.resample('1min').mean()),重采样后仍有缺失的,先用线性插值df.interpolate(method='linear')填充,插值后依然无法覆盖的,用同路段同时段的均值填充。
异常值的识别,我强烈不建议机械地删掉“超过3倍标准差”的点。交通流量、医院就诊量这类数据天然有周期性,高峰期的数值本来就偏离均值,误删会造成信息损失。更稳的做法是分箱处理,把数据按小时或星期分组后,再在每个箱内用IQR规则筛离群值。统一量纲不多说了,Z-score归一化或MinMax归一化任选,但注意如果你后续用层次分析或熵权法做评价,熵权法输入必须是归一化后的正向指标,且零值要平移处理,否则log运算直接报错。
2.2 画图不是为了放进论文,而是为了逼出建模线索
很多人把可视化当成“交差用的装饰”,其实EDA画图最大的价值是让你快速产生建模假设。我拿到清洗后的数据,第一件事永远是画全时段目标变量的时序图,然后按周、按小时继续切片,观察周期性和突变点。比如应急车道路段,如果某路段在工作日早高峰的通行时间明显高于周末,那后续做“动态启用决策”时,时间片就不能只按小时切,必须区分工作日与节假日。
第二类必画的图是相关性热力图。直接用df.corr()计算Pearson系数再画热力图,能一眼看出哪些指标高度共线。我见过不少队伍把“交通流量”和“车流密度”同时塞进指标模型,这两个变量往往相关系数超过0.9,做评价时等于给某一维度加了两倍权重,评委看灵敏度分析时一定会发现这个漏洞。相关性热力图就是用来提前发现并处理这种冗余的。
第三类图是箱线图,重点关注目标变量在不同类别(比如不同路段、不同车道类型)上的分布差异。箱线图上如果某两个类别的中位数和四分位距明显不同,说明“分组对比”本身就是解题线索,后面建模时按类别分别建模,通常比“一个模型走天下”更准。
2.3 特征工程不比算法次要,但别过度
建模前的特征工程,我的原则是“每一步都能解释为什么”。时间类特征,比如“是否为早高峰”“星期几”“是否节假日”,这是从业务规则出发就能确定的,必须手动构造。空间类特征,比如“上下游路段的流量差”“与最近匝道的距离”,这类特征价值很高,但构造时要注意是否引入了未来信息(即数据泄露)。比如你要预测t+1时刻的状态,就不能用t+1时刻的实际观测值做特征,否则测试集评估时会得到虚假的高分,这一点在数据竞赛里叫leakage,评委一旦在论文里看到这种逻辑漏洞,整篇的可信度都会崩掉。
特征数量上,E题不是Kaggle,不需要上百个特征。我通常控制在10到20个之间,优先保证业务可解释性。如果需要筛选特征,用随机森林的特征重要性做一个初筛,再结合相关性矩阵剔除高相关项,就够了,不需要L1正则或PCA搞得花里胡哨。
3. 核心建模思路构建:从“有数据”到“有答案”的关键一跃
建模阶段是整个比赛真正的分水岭。E题最忌讳的是“为了炫技选了个深度学习模型,结果算力不够、参数调不动、论文里解释不清”。评委更看重模型与问题的贴合度,以及你对自己模型的拆解能力。
3.1 机理优先还是数据优先?标准答案叫“融合”
在老建模人圈子里流行一句话:“机理给骨架,数据给血肉。”E题的很多场景是有明确物理或业务机制的,比如交通流中的流量-密度-速度关系,应急车道的本质是“通过开放额外通行空间来降低单位时间内的拥堵延误”。如果你完全抛开这套机制,直接扔给LSTM去预测通行时间,不是说不行,但你的结果很难让评委信服——因为你讲不出“为什么是这些特征起作用”。
反过来,如果只做机理模型,用几个微分方程跑仿真,又会因为假设太强、参数难标定而显得不接地气。最稳妥的策略是:先用机理或业务逻辑构建基础框架(比如确定目标函数、约束条件和关键场景分类),然后用数据驱动方法在框架内校准参数或修正偏差。比如动态启用决策问题,目标函数定为“全线网总通行时间最小化”,约束条件包括“应急车道启用后主线速度不低于某阈值”,这些由业务规则确定;而“不同路段的拥堵恢复时间”这类机理上很难算的参数,就用历史数据拟合出来。
3.2 评价型问题:指标的“可解释性”比“数学复杂度”重要
当小问要求你“评估效益”“比较方案优劣”时,别急着上神经网络。先列出所有可能的评价指标,然后用可解释性强的赋权方法处理。我在E题里最常用熵权法,其次是层次分析法(AHP),两者可以结合互验。
熵权法的好处是客观,完全从数据离散程度出发定权重,适合评委质疑“你的权重是不是拍脑袋定的”。计算步骤其实不复杂:数据归一化后,先算每个指标第i个样本的占比p_ij,然后算信息熵e_j = -\frac{1}{\ln n}\sum p_{ij}\ln p_{ij}(p_ij为0时需做小幅平移),最后权重w_j = \frac{1-e_j}{\sum (1-e_j)}。实际操作中用Python写不到20行,但需要注意的是,归一化方法会影响熵值,我统一用MinMax归一化,且保证方向一致(效益型指标越高越好,成本型指标越低越好,如果有中性指标要专门处理)。
层次分析法适合处理“有些指标没有直接数据,只能靠专家经验打分”的场景,比如应急车道对“应急救援通行能力”的提升程度,就无法直接从数据里算出来。AHP的关键是判断矩阵的一致性检验,CR = CI/RI必须小于0.1。如果矩阵太不靠谱(比如你打了3、5、7这种互相矛盾的分数),一致性比例会爆掉,这时要回头调整判断矩阵,别硬着头皮继续算。
3.3 优化型问题:目标函数和约束条件怎么设才不踩坑
优化题是全卷最容易失分的地方,因为很多队伍把重点放在“用什么求解器”上,却忽略了“这个问题本身定义清楚没有”。以应急车道启用为例,最朴素的目标函数是“全路网平均通行时间最短”,但光有这个目标不够,因为它会诱导模型把所有应急车道全天开放,这在现实中不合理,还会干扰主线交通。所以必须加入约束:比如应急车道仅在主线速度低于某阈值(如40km/h)时可启用,且启用后主线速度应至少恢复至某水平;再如单个路段每天启用总时长不能超过某个上限。
这类约束的设定要参考题目给的行业规范或实际情况,论文里写清楚约束来源,评委会认为你“懂业务”。求解工具上,变量规模不大时用MATLAB的ga(遗传算法)或fmincon(非线性规划)就能跑,变量一旦多起来,建议转用Python的scipy.optimize或pulp做线性整数规划。我自己常用的套路是:第1问用熵权法算出一个综合评分作为“效益度”,第2问把效益度放进目标函数系数里,而不是作为硬约束,这样既保证了优化方向,又降低了模型的约束复杂度,跑起来很稳。
3.4 预测型问题:时序模型选择的递进思路
E题的预测部分,我的建议是坚持“由简入繁、逐步升级”的路线。先用线性回归或决策树做一个baseline,评估RMSE或MAPE;如果效果不够理想,再升级到随机森林或XGBoost这类集成模型;只有当数据量确实很大且存在明显长程依赖时,才考虑LSTM或GRU。
为什么这么排序?因为E题评委更在乎解释性,线性回归可以算出每个特征对预测目标的边际贡献,XGBoost可以做特征重要性可视化,LSTM则基本是个黑箱,写进论文里很难掰开揉碎讲清楚。而且三天比赛时间,调LSTM的坑你根本踩不完——学习率、滑窗长度、batch size、归一化方式,每一处都够消耗半天时间。
时序建模还有两个细节必须注意:一是划分训练集和测试集时必须按时间顺序切分,不能随机抽样,否则会造成未来信息泄露;二是如果预测目标有强周期性(比如全天24小时流量曲线),可以先用STL分解出趋势项、季节项和残差项,对季节项做周期修正,往往能显著提升精度。这一招在评委眼中是明显的加分项,因为它展示了你对数据结构的理解,而不只是会调包。
4. 论文写作与结果包装:模型做得好,更要让评委看得懂
三天时间,建模和写作几乎各占一半。很多组最后交上去的论文,模型求解结果很漂亮,但摘要写得像“自言自语”,正文公式缺乏上下文,图表堆砌却没有一句解释。这样的论文,评委最多给个二等的分数。写作的核心目的是降低评委的理解成本。
4.1 摘要写法的“黄金四段式”
评委看论文,时间紧任务重,摘要基本决定了初评方向。摘要禁不起啰嗦,我总结了一个黄金四段式:第一段用两三句话复述问题背景和实际需求;第二段说明你针对每个小问分别做了什么,用了什么方法和数据;第三段直接给关键结果(数值、精度或方案较优比例),这部分最重要,评委就是来找结果的;第四段用一句话说明模型的普适性和改进方向。
针对E题,摘要里一定要出现“使用了第几问中的某结果作为第几问的输入”,这能向评委传达你的解题逻辑是连贯的。举个例子:“针对问题2的动态决策模型,以问题1所得各路段综合效益评分为预期收益系数,引入主线速度阈值约束,建立混合整数规划模型,求解得到处于拥堵状态路段的应急车道平均启用时长为xxx分钟,全网通行效率提升xx%。”这段话虽然朴素,但精准踩中了评委的审阅心理。
4.2 图表规范:清晰度比花哨重要
图表是论文的门面,同时也是很多队伍的丢分点。MATLAB默认导出的图片分辨率不高,需要在输出前设置,我的固定设置是set(gcf,'Position',[100 100 900 500])调整画布尺寸,再用exportgraphics(gcf,'figure.png','Resolution',300)导出,确保图片放进Word里不失真。
表格的内容同样要讲究。原始数据表不要直接贴大段Excel截图,应该先做汇总统计(均值、标准差、最值),再用三线表呈现关键参数。涉及到方案对比时,表格建议采用“多行方案名+列指标”的形式,并突出最优方案的所在行(加粗)。模型公式用Word自带的公式编辑器或TeX输入,别用截图,否则出版级别审查时会出现清晰度不足问题。
4.3 模型检验和敏感性分析,必须写但不是凑字数
这一节是很多队伍的短板,也是拉开分差的地方。检验分两层:第一层是模型自身的检验,比如评价模型的排序稳定性、优化模型的最优解是否满足全部约束条件、预测模型在测试集上的误差指标;第二层是结果的稳健性分析,最常见的就是敏感性分析。
敏感性分析的操作不用太复杂,我的经验是:从指标权重、约束阈值、训练数据窗口这三个方向各做一次扰动,扰动幅度设定为±10%和±20%,记录目标值的变化幅度。如果某项参数的扰动导致结果变化剧烈,说明模型对这部分输入过于敏感,那就要在论文里专门解释“该参数在实际场景中可变范围可控,因此模型整体稳定”。这一句话顶得上大段废话,能让评委觉得你的模型经得住拷问。
4.4 附录和代码:规则是“能跑通、能看懂、能复现”
附录不要贴完整代码到正文,评委不会去读几千行的print输出。正确的做法是:正文的“模型求解”部分给出算法伪代码,附录里放核心代码片段和程序文件截图,代码注释用中文写清楚每段的功能。数据文件的说明也要在附录里列一份字段表,标明名称、类型、单位、缺失率。如果你在论文中承诺“代码可复现”,那就必须确保代码里没有绝对路径、没有修改过的依赖库版本,否则复现失败反而留下硬伤。
5. 常见问题与避坑手册(实战版)
比赛过程中真正让你崩溃的往往不是建模本身,而是各种低级失误。我把几年带赛踩过的坑、改过的错,整理成了一份速查清单,希望你能避开。
5.1 组内协作的坑:三个人各做各的,最后一小时发现接口对不上
这是最常见的死法。队友A把第1问的评分结果存成了xlsx,用了保留三位小数;队友B直接读取后建模,精度损失了一部分;队友C写论文时把A和B的图表顺序弄混了。每届我都强调:所有中间结果必须约定好统一的存储格式和命名规则,建议全组共享同一个数据文件夹,每个小问的输出文件统一命名Q1_output.csv、Q2_output.csv,并且使用整数或float的原始精度,不要提前四舍五入。建模手和编程手每天定时对表,写作手每完成一段就发给编程手确认数值截图,防止文不对题。
5.2 时间失控的坑:第一天过于放飞,第三天通宵补摘要
E题三天时间看着宽裕,实际上非常紧凑。第一天下午必须完成读题拆题和数据清洗,晚上完成EDA和特征工程;第二天全天是建模和求解的高强度时间,到了晚上必须出第一版完整结果;第三天上午做模型检验、敏感性分析和查漏补缺,下午全力写摘要、整理附录并排版,最后三小时逐字逐句读三遍——读出明显错误就改,读出逻辑不通就重写。
我见过太多队伍把建模拖到第三天上午,结果下午写论文时发现图表还没画,最后上交前草草截图、公式一堆乱码。记住,建模永远做不完,但论文必须写得完。就算模型稍有瑕疵,只要你把假设和局限讲清楚,得分一定高于“没交全”的漂亮模型。
5.3 数据问题的坑:不好意思问,硬着头皮用垃圾数据
有些题目附件里数据字段含义写得模糊,比如某列写着“V”,没有单位也没说明,很多队伍就默认当成速度直接用。实际上这列可能是“车型系数”或“平均载客数”,用错了整个模型都会跑偏。遇到这种情况,第一时间发邮件或群内提问,比赛答疑环节总有工作人员或出题专家回应。如果答复不明确,就在论文中写明你的假设并说明推导依据,这比“装瞎”要安全得多,评委反而会认可你的严谨。
另外还有一个高频低智商的翻车点:提交前忘记把代码里的调试打印关掉,导致附录代码页有一大堆中文乱码或异常报错日志。交之前压缩文件时,一定用固定命名格式“xxx大学_队伍编号_赛题号”,并在本地解压一遍确认能打开。细节决定生死,最后十分钟别急着交,先把所有文件完整过一遍。
6. 一些个人经验和心态建议
带了几届比赛,我最深的体会是:E题其实是最适合“稳扎稳打型”选手的题目。它的难点不在于某个高不可攀的算法,而在于信息整合和逻辑自洽。只要你把数据理顺、把每个小问之间的接口打通、把论文讲述成一个首尾呼应、有理有据的故事,哪怕用的全是经典方法,分数也绝不会低。相反,那些过度追求“神经网络+强化学习”豪华套餐的队伍,如果不能用大白话解释清楚每一个环节,反而容易败下阵来。
最后分享一个我的私藏技巧:在正式交卷前,找个完全没参加过建模的同学,让他读一遍你的摘要和每个小问的第一段。如果他能在五分钟内说出来“这道题做了什么、用了什么方法、得到了什么结论”,那这篇论文在评委那里的第一印象基本就稳了。建模比赛比的从来不是谁更聪明,而是谁更细致、更懂得沟通。