
每年到这个时间点数学建模竞赛的热度就上来了。今年山西省“金地杯”的E题——高速铁路牵引供电系统能耗优化算是近年来这类竞赛里少有的“硬核”题目。说它硬核一方面是因为背景专业——牵引供电、再生制动、能耗计算听着就劝退另一方面这道题的数据处理和优化方法确实能给到参赛者很大的发挥空间。作为连续带过几年国赛、电工杯和各类省赛的老选手我拿到这道题的第一反应是命题组这次确实用心了。先说结论这道题适合对物理过程建模有兴趣、愿意耐心处理真实数据的队伍获奖的关键不在于算法有多新而在于你能否把“列车怎么跑”和“电网怎么用”这两个层面的逻辑打通。泛泛讲模型、堆砌智能算法的论文大概率拿不到高分。这篇文章我会按照完整的竞赛节奏来写从题目拆解开始讲清楚每一问背后的物理逻辑和数学模型然后给出对应的代码框架最后复盘我们队伍在实操过程中踩过的坑。无论你是刚入门的新手还是想冲省一的熟手只要能顺着这个思路把里面的细节吃透至少能在赛区内拿到一个不错的保底奖。1. 题目核心与建模思路的整体拆解1.1 这道题到底在问什么高速铁路牵引供电系统能耗优化本质上是一个“在满足列车运行条件的前提下如何让整个供电系统的能量消耗最小”的问题。不要被“牵引供电系统”这个专业名词吓到它讲的是这样一个场景高速列车从接触网取电牵引电机把电能转化为动能列车才能跑起来。但列车不能一直跑遇到坡道要爬坡消耗更多能量、进站要制动这时候电机会变成发电机把动能转化为电能送回电网这就是再生制动。这个过程中能量的来源、转化和回流就是牵引供电系统能耗的核心。竞赛题目通常会给你几条线路的区间数据、列车参数质量、牵引特性、制动特性、基本阻力系数以及运行时分要求让你回答几个问题列车在不同区间运行时能耗是多少、分别消耗在哪、制动时回馈多少、能否通过调整运行图或操纵策略来降低总能耗。1.2 为什么这道题有区分度我见过太多的队伍拿到这种题就开始堆算法先来一个遗传算法优化再上一个粒子群、模拟退火甚至有人一上来就整神经网络。但这类题目真正的得分点在于你是否建立了正确的物理模型和优化目标。举个例子不知道列车牵引力是怎么随速度变化的或者不清楚惰行coasting时列车不受牵引力只受阻力影响那你后面所有的优化都是在“凭空计算”。所以我的建议是花至少半天时间把列车牵引计算的理论基础吃透这是整个建模的地基。地基不稳后面写再多代码也是空中楼阁。1.3 适合用什么样的参赛策略根据历年这类题目的规律E题的设问通常是递进式的。第一问是基础计算要求你在给定线路和列车参数下准确算出能耗第二问是单列车操纵优化即在运行时分范围内找到最省电的驾驶策略第三问往往是多车协同或者运行图优化会涉及到再生制动能量在“车辆—电网”之间的再利用问题。对应的建模策略是四个字逐级递进。先用确定性的物理模型解决“算得准”的问题再用优化模型解决“用得省”的问题最后用系统级方法解决“整体最优”的问题。不需要一上来就搞特别复杂的智能算法把每一步的物理含义讲清楚比堆算法有价值得多。2. 牵引计算基础模型先把“能耗从哪来”算明白2.1 列车运动的受力方程任何一列高铁在轨道上运动都遵守牛顿第二定律的纵向版本这是整个牵引计算的核心。其中m是列车质量一般题目会给或者让你用动车组参数去查dv/dt是加速度F_traction是牵引力由牵引特性曲线决定F_brake是制动力F_resistance是运行阻力。列车在运行过程中有三种基本工况牵引、惰行和制动。很多人忽略了阻力的组成细节。运行阻力由基本阻力和附加阻力构成基本阻力通常用戴维斯方程表示F_resistance a b·v c·v²其中a、b、c是需要根据车型和线路确定的系数。附加阻力主要考虑坡道阻力坡度千分数乘以列车重量、曲线阻力和隧道阻力。高速铁路上坡道阻力尤其不可忽视——线路纵断面的坡度数据往往是题目附带的重点数据文件。2.2 牵引力和制动力的“曲线”特性电机输出的牵引力并不是一个恒定的值。它通常有“恒力矩区”和“恒功率区”两个阶段列车低速启动时牵引力受最大粘着限制和电机力矩限制基本保持不变速度超过某个转折点以后牵引电机处于恒功率输出状态牵引力随着速度升高而减小。制动力的特性与之类似但再生制动力通常还受电网吸收能力的限制。这个限制条件在第三问多车协同里非常关键——你用再生制动把能量回馈到电网但电网或者相邻列车不一定能全部“吃掉”这些能量这就是题目可以做文章的“优化空间”。2.3 能耗计算的等式与关键指标单列车在某一段运行区间内的能耗可以看作牵引能量减去再生制动回馈能量假设储能系统存在后还需要从电网取用的部分。注意题目里说的“能耗”在不同问题中的口径可能不一样。第一问经常要求计算的是“牵引变电所提供的能量”需要考虑供电效率、动车组辅助系统功耗等因素也可能是“列车实际消耗的能量”需要区分牵引能耗和车载设备待机损耗。建议在论文开头就明确你的能耗计算口径这会避免后面的模型被评委质疑逻辑混乱。我一般会在论文里加一个小节叫“能耗计算边界说明”把哪些项计入、哪些项不计入、为什么这么处理写清楚。3. 第一问常见的两种解法数值积分法与简化公式法3.1 基于时间步长推进的数值积分这是最通用、最稳妥的方法。把线路按距离或时间切成足够小的步长通常取0.1秒或0.5秒距离步长取10米在每个步长内假设力不变或速度线性变化然后迭代推算下一时刻的速度和位置。基本流程是初始化列车起点速度0位置0时间0在每个时间步长内根据当前速度和线路条件判断工况牵引/惰行/制动查询当前速度下的牵引力或制动力计算阻力用受力方程求得加速度更新速度和位置累计牵引能量和再生制动能量直到列车到达终点或运行时分满足要求这个方法的优点是物理直观与真实的列车控制系统行为一致后面接优化算法时也方便遗传算法可以用它来计算适应度函数。缺点是计算量大如果步长取小了跑一次仿真可能要几秒甚至几十秒优化算法迭代几千次就会很磨人。这里分享一个我常用的技巧在精度要求不高的第一问可以用变步长的自适应方法。即速度变化快的时候比如出站加速段、进站制动段用较短的步长匀速巡航或惰行段用较长的步长。实测下来计算时间能缩短三分之二而能耗误差控制在1%以内。3.2 基于运动学公式的简化计算如果你时间不够或者手头没有完整的牵引特性曲线数据可以考虑简化方法。把运行过程分成“加速—巡航—惰行—制动”四个阶段用运动学公式估算各阶段的时间和距离。例如加速阶段假设牵引力为恒定平均值通过末速度和时间直接算距离惰行阶段只受阻力减速。这种方法的精度低但计算速度快得多适合用来做全局搜索的初筛。你可以先用简化模型快速找出几个较优的操纵方案再对候选方案用数值积分模型精细计算。这也是竞赛中的一个经典技巧——先粗后细保证搜索效率的同时不牺牲最终精度。3.3 数据处理上的注意事项这一问最容易被忽视的是数据预处理。题目给的线路数据通常有里程、坡度、曲线半径、隧道长度等运行图数据可能有站间距离、运行时分、停站时间。这些数据在Excel里看是规整的但导入到Python里经常发现坡道千分数的正负号方向理解错了——坡度千分数的正负决定是上坡还是下坡搞反了能耗误差能到百分之二三十。另外列车参数可能不完整。我当时做类似题目时遇到过给了一组“部分动车组参数”的情况缺的系数只能从公开资料里找。这里要注意引用数据来源并做敏感性分析——如果某个参数的取值变化会导致结果显著变化论文里一定要写清楚这是评委比较认可的科学态度。4. 第二问核心单列车操纵策略优化4.1 操纵策略为什么能省电同样是从A站跑到B站、同样的运行时分列车驾驶员脚踏板的踩法不一样耗电差距能有多大实测数据告诉我们节电驾驶和激进驾驶相比能耗差距可以达到15%到25%。原因并不玄妙牵引的功率大越高的速度牵引损耗越大而惰行可以“免费”滑行一段距离把速度利用起来制动阶段则把高速度的动能通过摩擦力或再生方式消耗掉——所以高速运行后“急刹车”是最费电的操作模式。优化操纵策略的核心就是合理安排牵引、惰行、制动三种工况的切换点。通俗地讲就是把“多余的加速度”转化成“恰到好处的速度保持”把制动的需求降到最低。4.2 用遗传算法求解“最优工况切换点”操纵策略优化的一个标准建模方式是把运行区间分成若干个子区间每个子区间上定义一种工况或者目标速度然后优化这些子区间的边界位置和取值。例如把A站到B站分成20段每段用“牵引—匀速—惰行”三种模式之一来标记然后编码成一个个体用遗传算法去搜索。适应度函数显然是区间总能耗从能耗模型计算出来约束条件是总运行时间等于规定值停车位置准确。我可以给你一个参考的Python代码骨架import numpy as np def simulate(speed, traction_force, brake_force, resistance_coeff, gradient, mass, time_step, distance, control_profile): 简单时间步长法仿真列车运行 Args: speed: 初始速度 traction_force: 当前速度可用的最大牵引力 brake_force: 最大制动力 resistance_coeff: 基本阻力系数 gradient: 坡度千分数序列 mass: 列车质量 time_step: 仿真时间步长 distance: 总运行距离 control_profile: 控制策略序列取值-1制动/0惰行/1牵引 position 0 time 0 energy_consumption 0 positions [] speeds [] while position distance: idx min(int(position // 100), len(gradient) - 1) base_resistance (resistance_coeff[0] resistance_coeff[1] * speed resistance_coeff[2] * speed ** 2) grad_resistance 9.8 * gradient[idx] * mass / 1000 total_resistance base_resistance grad_resistance if control_profile[idx] 1: force min(traction_force, mass * 0.5) energy_consumption force * speed * time_step / 3.6e6 elif control_profile[idx] -1: force -min(brake_force, mass * 0.5) energy_consumption force * speed * time_step / 3.6e6 else: force 0 accel (force - total_resistance) / mass speed max(0, speed accel * time_step) position speed * time_step time time_step positions.append(position) speeds.append(speed) return time, energy_consumption, positions, speeds这个代码只是一个框架实际使用时牵引力要做限幅速度不能超过线路限速到站时速度必须为0运行时分误差要在2%以内等这些约束缺一不可。4.3 为什么智能算法的“参数设置”决定成败很多队伍都会用遗传算法但真正用好的却不多。关键不在GA本身而在编码设计和约束处理。比如运行时间的约束如果不满意你是直接淘汰个体还是做惩罚函数直接把约束变成罚项公式里加一个1000倍的大数很容易导致群体过早收敛到不可行解附近。建议的处理方法是约束条件分两类硬约束必须在仿真环节就拦截比如越限速就强制截断到站速度不为0直接判不适生存软约束比如运行时分偏差用动态罚函数。这种设计下的遗传算法收敛速度快、解的质量也高。5. 第三问进阶多车协同与再生制动能量利用5.1 共生能量的逻辑你刹车我用你刹车的电第三问通常会引入一个更精彩的情节一趟车进站制动时产生的再生电能如果能被同一条供电臂下正在启动加速的另一趟车直接利用就相当于把“刹车浪费的能量”转移给了“启动需要的能量”。这种列车间的能量交互是牵引供电系统节能的重要方向也是近些年的研究热点。要实现这种协同核心就是调整列车运行图或发车间隔让“需要牵引的车”和“正在制动的车”在时间上重叠在电气距离上处在同一个供电分区内。建模时需要把每个列车的位置、速度、牵引/制动功率在时间轴上展开然后计算每个供电分区的净功率曲线。5.2 协同优化模型怎么建这一步建议建立一个混合整数规划或者用智能算法搜索发车间隔和停站时分。目标函数是在满足全线运营要求发车间隔、正点率、站间运行时分的上下限的前提下使得总牵引能耗减去被利用的再生能量之后的净值最低。约束条件包括每列车运行时分约束、到发时刻的追踪间隔约束、供电分区的功率平衡约束供电容量限制、再生能量可利用率。这里有一个容易出问题的地方再生能量的利用率到底取多少。你写0.9显得不合理写0.3又太保守最好在仿真模型里根据功率重叠情况动态计算这样论文的完整性和说服力会强很多。我另外建议加一个敏感度分析如果把再生能量利用率设置为0到100%的均匀区间系统能耗如何变化。画一条曲线往往比堆一堆表格更能让评委眼前一亮。6. 代码框架与工具选型建议6.1 用什么语言和工具我的推荐Python NumPy Matplotlib scipy再加一个pandas处理数据。Python在数学建模里的生态最丰富遗传算法直接用DEAP库就好如果不允许用第三方库自己写一个基础GA也不难。许多人纠结该不该用MATLAB。我的观点是如果你本来更熟Python就坚持Python如果队友MATLAB熟练第一问的数值仿真用MATLAB其实更方便因为矩阵运算和绘图都很顺手。重点是别在赛程中频繁切换语言很拖节奏。6.2 一份建议的代码目录结构竞赛期间熬夜赶工代码混乱是常态但如果你稍微有点结构后面写论文和做可视化的时候会轻松很多project/ ├── data/ # 原始数据 │ ├── line_profile.csv │ └── train_params.xlsx ├── models/ # 仿真核心 │ ├── train_sim.py │ ├── energy_calc.py │ └── optimization.py ├── plots/ # 输出图形 └── main.py # 主程序一定要写注释哪怕只是简单的“# 这里是牵引力限制”三天后你再看代码时真的能救命。竞赛第三天的中午人已经很疲惫了能让你快速定位逻辑的就是注释和函数名。6.3 可视化让评委看懂你的“能耗去哪了”图在建模论文里的重要性怎么强调都不为过。至少做三张图运行速度—距离曲线v-s曲线显示列车的运行工况切换牵引/制动功率—时间曲线反映能耗和回馈时刻供电分区净功率—时间曲线第三问用直观展示协同节能效果线条要粗、图例要清、横纵轴要有单位标注。别小看这些细节竞赛阅卷时间有限一张清晰的图往往比一大段文字更能留下好印象。这也是所谓的“优秀论文”和普通论文拉开差距的地方——不是模型复杂而是图文表达的扎实。7. 常见问题与避坑指南7.1 线路数据处理中的“坑”第一个大坑里程坐标不连续。给的表格里可能每隔几十米一个坡度点但里程坐标在中途有跳跃或者重复最好先做差分检查。第二个大坑上坡下坡的正负号在不同资料里可能定义不同统一换算成“上坡为正”再进模型。第三个大坑曲线阻力和隧道阻力在高铁线路里不能随便忽略尤其在山区的线路附加阻力带来的能耗占比可达10%到15%缺了这部分第一问的能耗数据就明显偏低。7.2 优化算法常见问题早熟、慢收敛、约束不满足遗传算法在每一代里表现不好很正常但如果你发现群体在二十代以内就全部聚集到一起而且适应度不再变化大概率是选择压力太大了可以考虑换锦标赛选择、提高变异率。如果发现算一个个体要好几秒整体的迭代次数根本不够用那就缩减种群规模和代数或者先用简化模型筛选候选方案。另外一个特别容易被忽视的问题是随机种子。优化算法每次跑出来的结果可能都不同但是论文里必须保证结果是可复现的所以主程序开头一定要设置np.random.seed(42)这类固定的随机种子。这一点评委问起来的时候能体现你的专业素养。7.3 论文写作的时间分配与节奏三天赛程我的建议安排是第一天上午到下午做数据检查和第一问的仿真计算第二天上午完成第二问优化第二天下午到晚上解决第三问和灵敏度分析第三天全天写论文、画图、做摘要。一定要给论文留出至少一整天的时间很多队伍在前面计算的泥潭里陷得太久最后摘要和结论草草几行这是最可惜的。8. 从参赛到省一的实操总结回到这道2025年“金地杯”E题如果把整道题比作一顿正餐那么牵引计算是主食操纵优化是主菜多车协同是餐后甜品而论文就是你端上桌的摆盘。你不能只有小菜没有主菜也不能主菜好吃但根本没有摆盘。我个人在实际带队过程中最大的体会是拿到这类工程优化题目先抓住物理过程再用优化方法去寻找更好的操作方案永远比直接套一个黑箱模型要可靠得多。竞赛比的不是谁用了更“高级”的算法而是谁把问题本身剖析得更透彻谁的解决方案在合理的假设下更接近工程实际。最后再分享一个小技巧赛前把“列车牵引计算”相关的经典公式和单位换算关系抄在一张A4纸上放在手边。比赛第三天队友眼睛都快睁不开的时候一张整理好的公式纸比什么都有用。祝大家在今年的E题里都能拿到自己满意的成绩。