
1. 从赛题到论文一次完整的数模竞赛实战复盘去年带队参加了“华为杯”中国研究生数学建模竞赛我们组选的E题最后拿了个不错的奖。赛后复盘感触最深的一点是竞赛和做科研项目、解决实际工程问题在核心逻辑上是相通的但竞赛有它独特的节奏和“游戏规则”。今天我就以我们处理E题的完整过程为线索拆解一下如何将一道开放的赛题转化为一篇结构严谨、逻辑自洽的优秀论文。这不仅仅是“怎么写”的问题更是“怎么想”和“怎么做”的问题。无论你是即将参赛的研究生还是对用数学工具解决实际问题感兴趣的朋友希望这篇复盘能给你带来一些实实在在的参考。E题通常偏向于数据分析、优化或评价类具有明确的现实背景比如当年的题目可能涉及资源调度、路径规划、系统评估等。这类题目的特点就是“题干描述像一篇小型调查报告”信息多、背景杂但核心要求往往聚焦在一两个关键指标上。我们的目标就是在三天四夜的时间里从这片信息的海洋中精准打捞出问题本质构建数学模型求解分析并用一篇论文把所有工作清晰、有力、令人信服地呈现出来。2. 赛题破译与核心思路构建2.1 第一步不是读题是“翻译”题拿到赛题的第一时间切忌一头扎进细节。我们小组的做法是三个人各自用20分钟快速通读全题A-F不深究只感受。然后集中讨论根据队伍的知识结构比如我们组一个擅长优化算法一个精通统计分析我负责编程和建模衔接和题目风格快速锁定目标。选择E题是因为它的背景我们相对熟悉且问题拆解后能看出清晰的模块化解决路径。选定E题后真正的第一步是“翻译”。把组委会提供的、带有大量背景叙述的题目翻译成我们熟悉的数学语言。这个过程包括识别核心要素找出题目中所有名词性的实体。哪些是“对象”如仓库、车辆、订单哪些是“属性”如成本、时间、容量哪些是“关系”如配送、隶属、约束。用不同颜色的笔在纸质题目或电子文档上标记出来。定义变量与参数将上一步识别的属性和关系用数学符号明确下来。例如设第i个仓库到第j个客户点的运输成本为 ( c_{ij} )第k辆车的载重量上限为 ( Q_k )。这一步要力求清晰、无歧义为后续建模打下坚实基础。明确目标与约束这是最关键的一步。题目中可能用一段话描述目标我们需要将其提炼为一个或一组数学表达式。例如“在满足所有客户需求的前提下使总运输成本最低” - (\min \sum_{i}\sum_{j} c_{ij} x_{ij})。同时把所有“必须满足的条件”列为约束如 (\sum_{j} d_j y_{ij} \le C_i)每个仓库运出量不超过其容量。注意很多题目会包含多个目标可能相互冲突。这时需要立即判断是采用多目标优化方法如帕累托最优、加权求和还是根据题目隐含的优先级将其转化为单目标优化例如将“准时性”作为硬约束在此前提下优化成本。我们当时就遇到了成本和时效的权衡最终选择构建一个包含惩罚项的单目标函数将延迟交付的代价货币化。2.2 第二步模型选型与方案设计“翻译”完成后问题的数学骨架就清晰了。接下来就是为这个骨架选择合适的“血肉”——即数学模型和求解算法。对于常见的优化类E题模型库无外乎几大类线性/整数规划、网络流、动态规划、排队论、仿真模拟等。选型的核心依据是问题的规模和结构特性。线性规划LP如果变量间是线性关系且变量连续这是首选因为有成熟、高效的求解器如Lingo, Gurobi, 或Python的PuLP库。整数规划/混合整数规划IP/MIP如果涉及“是否选择”、“整数数量”等决策如是否开设某个仓库派几辆车就需要引入0-1变量或整数变量。求解难度会指数级上升需要评估问题规模。我们当时的一个关键决策就是将客户点聚类先规划区域中心再细化路线从而将一个大整数规划问题分解为一个聚类问题和一个规模较小的车辆路径问题VRP大大降低了求解复杂度。启发式算法当问题规模太大精确算法如分支定界在有限时间内无法求得最优解时必须转向启发式或元启发式算法如遗传算法GA、模拟退火SA、蚁群算法ACO。这里有一个重要心得不要盲目追求算法的“高级感”。一个设计精巧的贪婪算法局部搜索其表现和可解释性往往优于一个参数调不好的复杂遗传算法。论文中一定要阐述清楚算法设计的逻辑而不仅仅是套用模板。我们为E题设计的方案是“分层优化”策略第一层用聚类分析K-means改进算法划分配送区域第二层在每个区域内构建带时间窗的车辆路径问题VRPTW模型并采用节约算法Clarke-Wright生成初始解再用模拟退火进行优化。这样设计的好处是逻辑清晰模块化且便于并行计算每个区域的路径可以独立优化。3. 数据处理、求解与可视化实战3.1 数据清洗与预处理魔鬼在细节里数学建模竞赛提供的初始数据几乎不可能是“干净”的。E题通常会附有数据集可能包含缺失值、异常值、量纲不统一等问题。这一步处理不好后面所有漂亮模型都是空中楼阁。我们的数据处理流程如下探索性数据分析EDA用Python的Pandas和Matplotlib/Seaborn快速查看数据分布、统计特征、缺失情况。画箱线图找异常值画散点图看变量间关系。缺失值处理根据缺失机制和比例决定策略。对于时间序列数据我们采用了前向填充ffill或线性插值对于分类特征少量缺失用了众数填充对于关键数值特征大量缺失则考虑是否利用其他特征通过简单模型如回归进行预测填充并在论文中说明理由。异常值处理不能简单删除。要区分是“录入错误”还是“业务真实情况”。例如一个订单的重量远大于其他可能是单位错误kg vs. g也可能是真实的大客户订单。我们通过“业务逻辑判断”如结合车辆载重上限和“统计方法”如3σ原则综合识别对于疑似错误且无法修正的予以剔除并记录对于真实异常考虑其合理性并保留。特征工程这是提升模型性能的关键。根据问题背景我们构造了新的特征。例如在路径规划中我们不仅用了经纬度计算直线距离还根据城市道路网络特点构造了“道路拥堵系数”基于时间段和“转弯惩罚因子”将这些因素融入距离成本矩阵中使模型更贴近现实。3.2 求解实现与编程技巧模型建立后求解就是编程实现。我们主要使用Python因其生态丰富SciPy, NumPy, Pandas, Scikit-learn且易于快速原型开发。优化求解器调用对于线性/整数规划部分我们使用了PuLP库作为建模接口调用CBC或Gurobi如果可用求解器。代码结构要清晰将模型构建、求解、结果提取分离。import pulp # 创建问题 prob pulp.LpProblem(Warehouse_Location, pulp.LpMinimize) # 定义变量 x pulp.LpVariable.dicts(x, (warehouses, customers), lowBound0, catBinary) # 设置目标函数 prob pulp.lpSum([cost[i][j] * x[i][j] for i in warehouses for j in customers]) # 添加约束 for j in customers: prob pulp.lpSum([x[i][j] for i in warehouses]) 1 # 每个客户必须被服务 # 求解 prob.solve(pulp.GUROBI_CMD()) # 或 pulp.PULP_CBC_CMD() # 输出结果 for v in prob.variables(): if v.varValue 0: print(v.name, , v.varValue)启发式算法实现自己实现模拟退火算法。核心是控制好“温度”下降计划表、邻域搜索策略和接受劣解的概率。我们采用指数降温邻域操作采用“2-opt”交换路径中两段来生成新解。一个关键技巧将算法的主要循环和核心操作函数化并加入详尽的日志记录记录每一代的最佳解和当前解便于调试和画图展示收敛过程。并行计算加速由于我们采用分层分区优化各个区域的VRP求解是独立的天然并行任务。我们使用Python的multiprocessing库的Pool功能将区域列表分配给多个进程同时计算最终汇总结果。这为我们节省了大量时间在论文中这也是一个亮点。3.3 结果可视化让结论自己说话评委阅读论文时间有限清晰、专业、信息量大的图表能瞬间提升论文档次。我们摒弃了软件默认的丑图表坚持用Matplotlib或Seaborn绘制定制化图表。地理信息可视化使用Basemap或GeoPandas如果数据有shp文件或简单的scatterplot将仓库、客户点、最终优化路径在地图上画出来。用不同颜色和形状区分点类型用线条粗细表示运输频次或货量。收敛曲线图展示模拟退火算法求解过程中目标函数值随迭代次数的下降过程直观证明算法的有效性和收敛性。对比分析图将我们的优化方案与基线方案如最近邻法、随机分配进行对比。使用柱状图对比总成本、平均运输时间等关键指标使用箱线图对比不同方案下各项指标的分布情况体现方案的鲁棒性。敏感性分析图改变关键参数如油价、车辆固定成本、客户需求波动观察目标函数的变化。用折线图展示并分析其经济学或管理学含义体现模型的深度。4. 论文撰写逻辑、表达与呈现的艺术论文是三天工作的最终载体。再好的模型和结果如果表达不清也会大打折扣。4.1 结构搭建八股文也有黄金法则全国赛的论文结构相对固定但每个部分都有讲究摘要这是论文的“脸面”决定评委的第一印象。我们采用“模板化”但内容充实的写法用一段话简述问题背景用两三句话概括你们用的模型、方法和核心步骤紧接着给出最重要的数值结果例如“最终方案使总成本降低了XX%”最后点明模型的特色、优点和推广价值。摘要控制在500-800字必须独立成篇即使不读正文也能了解全部工作。写完摘要后我们小组会互相朗读检查是否流畅、有无歧义。问题重述与分析不是照抄题目要用自己的语言精炼地描述问题并进行分析。这部分要展示你们对问题的理解深度。我们将其分为“问题背景”、“需要解决的问题列表”用1.2.3.条理清晰地列出和“问题分析”分析各问题之间的联系、难点、解决思路。模型假设合理的假设是简化问题、突出核心的关键。假设要基于常识或题目暗示且不宜过多过强。例如“假设各客户点的需求在规划期内确定已知”、“忽略运输途中极端的天气影响”。每一条假设最好能简要说明其合理性。符号说明建议使用三线表列出所有主要变量、参数及其含义、单位。确保全文符号统一。模型建立与求解这是论文的核心。我们按照“分层”的思路来组织先介绍整体框架图可以用Visio或PPT画一个清晰的流程图然后分小节详细介绍每个子模型如聚类模型、路径优化模型包括模型数学公式、算法步骤描述最好配伪代码或流程图。切忌堆砌公式每个重要公式下面都应有简要的文字解释其物理或经济意义。模型求解与结果分析展示运行环境Python 3.9, Intel i7等、参数设置如模拟退火的初始温度、降温系数然后呈现关键结果。结果分析不是简单罗列数据而要解读数据背后的含义。例如“从图5可以看出成本对油价的弹性系数为0.15意味着油价每上涨10%总成本上升约1.5%说明我们的模型对油价波动不敏感方案稳定性较好。”模型评价与推广客观评价自己模型的优点求解高效、贴合实际等和缺点假设较强、未考虑某因素等。推广部分可以适当“拔高”谈谈模型稍作修改后可用于哪些类似场景。参考文献与附录参考文献格式要规范国赛一般要求GB/T 7714。附录放核心代码不要全部、大型中间结果或补充图表。代码部分注意排版整洁关键处加注释。4.2 写作细节与避坑指南语言风格力求准确、简洁、客观。避免“我认为”、“我们觉得”等主观表述改用“模型结果表明”、“数据分析显示”。但可以在“模型评价”部分适当加入主观分析。图表制作图表要有编号和标题如“图1 客户点与仓库分布及聚类结果”标题应是对图表内容的结论性描述。图表中的文字要清晰可辨线型、标记要区分明显。所有图表在正文中都要有引用和解读“如图1所示…”。公式编辑使用MathType或LaTeX格式确保公式美观、统一。重要公式单独成行并编号便于引用。团队协作我们使用OverleafLaTeX在线协作平台进行论文撰写可以实时合并更新避免版本混乱。写作分工要明确一人主笔某部分其他人负责审阅和修改。最后留出至少4小时进行全文统稿检查逻辑连贯性、符号一致性、语法错误和错别字。时间管理这是血的教训。必须制定严格的时间表并预留缓冲。我们的时间轴大致是第一天上午定题、下午完成模型框架和数据处理第二天全天求解与调试第三天上午完成结果分析、下午和晚上全力写作、凌晨统稿。切忌在某个难点上钻牛角尖消耗过多时间必要时果断调整方案或采用简化版本。5. 赛后复盘那些比获奖更重要的收获回过头看这次比赛对我们而言最大的收获不是奖状而是这套从问题定义到方案落地的完整方法论训练。它强迫你在极短时间内面对一个陌生、复杂的问题完成信息搜集、抽象建模、工具选用、编程实现、结果分析和报告撰写的全流程。这其中的很多经验直接迁移到了我后来的科研和项目工作中。有几个点我觉得特别值得分享 第一沟通至上。三人小组必须保持高频、有效的沟通。每天早中晚至少三次集中讨论同步进度、明确障碍、调整方向。很多灵感是在争论中碰撞出来的。 第二工具熟练度就是生产力。平时多积累Python、MATLAB的代码片段熟悉常用库如Pandas, NumPy, Scikit-learn, PuLP的API。比赛时没时间现学。 第三重视“讲故事”的能力。你的模型和算法就是一个“故事”论文就是讲好这个故事。逻辑要层层递进让评委能轻松地跟着你的思路走理解你每一个决策背后的理由。一个逻辑清晰、表达流畅的“好故事”有时比一个复杂但难以解释的“黑箱模型”更能打动评委。 第四保持良好心态和体力。三天四夜是对脑力和体力的双重考验。合理安排休息准备一些零食和咖啡。遇到卡壳时不妨起来走走换换脑子。记住完成比完美更重要在截止时间前提交一份完整、规范的论文是首要目标。