
1. 项目背景与核心挑战中小城市地铁的“精打细算”前两年我带着学生团队参加了数维杯数学建模竞赛碰到的B题就是关于中小城市地铁运营与建设的优化设计。这个题目当时让我眼前一亮因为它戳中了一个非常现实但又常被忽略的痛点大城市的地铁规划经验真的能直接套用在中小城市身上吗答案显然是否定的。对于北上广深这类超大城市地铁的首要任务是解决“运得走”的问题客流巨大线路密集网络效应强即使初期亏损长期看社会效益和土地增值也能覆盖成本。但中小城市完全是另一套逻辑。它们的客流强度可能只有大城市的十分之一甚至更低财政预算也有限不可能像撒胡椒面一样到处建地铁。这就决定了中小城市的地铁从规划、建设到运营每一步都必须“精打细算”追求极致的投入产出比。这道题的核心就是要求我们建立一个数学模型来回答几个关键问题在给定的城市空间结构、人口分布和出行需求预测下地铁线路应该怎么规划走向、站点位置建设时序如何安排先建哪条后建哪条建成后列车运行图怎么排班发车间隔、编组大小票价怎么定最终的目标是在满足一定服务水平比如乘客平均等待时间不超过某个值的前提下实现系统全生命周期包括建设成本和运营成本的总成本最小化或者是在给定投资预算下实现社会效益如减少的交通拥堵时间、降低的污染排放最大化。这听起来像是一个经典的运筹学问题但实际操作起来你会发现它融合了城市规划、交通工程、经济学和数学优化等多个学科。难点在于这些因素相互耦合、相互制约。比如你为了降低建设成本把站点设得稀疏一些但这就增加了乘客的步行距离可能导致客流吸引力下降进而影响运营收入。再比如你为了提高运营效率想用小编组、高密度的列车但这又对信号系统和站台设计提出了更高要求可能增加初期建设投资。所以这不是一个简单的单目标优化而是一个多目标、多阶段、带约束的复杂决策问题。2. 模型框架搭建从宏观战略到微观调度面对这样一个复杂系统我们不可能用一个“超级模型”解决所有问题。合理的做法是分层建模将问题分解为几个相对独立但又相互关联的子模块。我们当时构建的模型框架主要分为三层网络规划层、建设时序层和运营调度层。2.1 网络规划层基于客流OD的骨干网设计这一层要解决的是“线往哪里修站在哪里建”的问题。输入是城市未来若干年比如10-20年的交通需求矩阵OD矩阵即从各个出发地到各个目的地的出行量以及城市的地理空间数据如道路网、功能区划、地形限制等。核心模型我们采用了“客流走廊识别网络拓扑优化”的组合方法。客流走廊提取首先不是盲目地在全市画线。我们利用经典的“四阶段法”中的交通分布和交通分配模型将预测的OD矩阵加载到现有的道路网络上模拟出未来主要的客流流向和流量。那些流量高度集中的虚拟路径就是潜在的“客流走廊”。这里可以用到图论中的最短路径算法如Dijkstra算法和用户均衡分配模型。网络拓扑优化识别出几条主要的客流走廊后如何将它们连接成一个高效的地铁网络我们将其抽象为一个“斯坦纳树”问题的变种。目标是寻找一个连接所有重要客流发生源和吸引点可以视为必须经过的节点的树状或环状网络使得网络的总建设成本与线路长度、地质条件相关最小同时覆盖的潜在客流量最大。这是一个NP-hard问题我们采用了启发式算法如遗传算法GA或模拟退火算法SA来求解。在MATLAB中优化工具箱ga,simulannealbnd或自己编写算法都很方便。注意中小城市特别要注意“覆盖效率”。站点500米半径覆盖的人口和就业岗位数是关键指标。我们当时引入了一个“覆盖效益函数”将覆盖的人口/岗位数进行量化并与线路长度成本一起放入目标函数中进行权衡。2.2 建设时序层动态规划下的投资决策网络规划好了但钱不够一次性建成怎么办这就涉及到建设时序优化。这是一个典型的“多阶段投资决策”问题可以用动态规划DP或整数规划IP来建模。核心思路我们将规划期如20年划分为若干个阶段如每5年一个阶段。在每个阶段决策变量是选择哪条或哪段规划好的线路进行建设。状态变量是当前已建成的地铁网络状态、剩余的预算、已诱发的客流增长情况。目标函数追求整个规划期内总净效益现值最大化。净效益包括每个阶段因新线开通带来的新增客流收入、节省的社会时间成本、减少的污染排放效益减去该阶段的建设投资和新增的运营成本。这里的关键是“现值”因为资金有时间价值未来的收益和成本需要折现到现在来比较。MATLAB的金融工具箱pvvar函数或者自己写一个折现公式就能轻松处理。约束条件除了预算约束还要考虑工程逻辑约束比如某条线路必须在其连接的两条线路都建成后才能发挥最大效益逻辑依赖关系。我们当时用0-1变量来表示每条线路在每个阶段是否被建设然后用线性或非线性约束来描述这些依赖关系最后调用intlinprog整数线性规划或fmincon非线性规划结合启发式算法来求解这个大规模的组合优化问题。2.3 运营调度层基于实时需求的资源调配假设某条线路已经建成接下来就是日常的运营管理。核心问题是在一天的不同时段应该安排多少列车、以多大的间隔运行核心模型这是一个服务能力与运营成本的平衡问题。我们建立了一个以“小时”为单位的精细化调度模型。需求输入需要该线路分时段的客流需求数据通常呈早晚高峰的“驼峰”状。决策变量每个时段的列车发车间隔、列车编组辆数决定单列车运力。目标函数最小化运营总成本主要包括列车运行的能耗成本、车辆磨损成本、司乘人员工资。同时必须满足服务质量约束。关键约束满载率约束高峰时段车厢满载率不能超过安全上限如120%平峰时段也不能太低以保证效率如不低于30%。乘客等待时间平均等待时间通常认为是发车间隔的一半不能超过乘客可接受的范围如早高峰3分钟平峰6分钟。车辆周转约束考虑列车回库检修、司机换班等实际运营要求。这个层级的模型相对线性可以用线性规划linprog来求解最优的发车频率和编组方案。在MATLAB中我们可以很方便地构建目标函数系数向量和约束矩阵。3. 关键算法实现与MATLAB实战技巧理论模型搭建好后真正的挑战在于用MATLAB把它高效、准确地实现出来。下面分享几个核心环节的算法选择和实战中踩过的坑。3.1 客流分配与走廊识别用户均衡模型要预测客流在地铁网络上的分布不能简单用最短路径因为乘客的选择会改变网络的拥堵状况。我们采用了“用户均衡UE”原则即所有被使用的路径上出行者的行程时间相等且最小。实现方法Frank-Wolfe算法是求解静态用户均衡问题的经典方法。在MATLAB中实现其核心迭代步骤并不复杂初始化将所有OD流量按最短路径零流量时间进行一次全有全无分配。迭代 a. 根据当前流量计算各路段的行程时间使用BPR函数等。 b. 基于当前时间再次进行全有全无分配得到辅助流量模式。 c. 通过一维搜索确定最优步长将当前流量向辅助流量方向移动。 d. 检查收敛条件如流量变化范数小于阈值。% 伪代码框架示意 link_flow zeros(num_links, 1); % 初始化路段流量 for iter 1:max_iter link_time BPR_function(link_flow, link_capacity, free_flow_time); % 计算当前时间 [shortest_paths, aux_flow] all_or_nothing_assignment(OD_matrix, link_time); % 全有全无分配 % 一维搜索寻找最优步长 lambda lambda fminbnd((l) objective_func(l, link_flow, aux_flow, link_capacity), 0, 1); link_flow (1 - lambda) * link_flow lambda * aux_flow; % 更新流量 if norm(link_flow - prev_flow) tolerance break; end end踩坑心得BPR函数中的参数如α0.15 β4对结果影响很大。对于中小城市非拥堵的路网可能需要校准这些参数。我们当时的做法是如果有历史交通流量数据可以用fminsearch来反标定这些参数让模型输出更贴合实际。3.2 网络拓扑优化遗传算法的参数调优用遗传算法求解线路网络优化时编码、适应度函数和算子设计是关键。编码我们采用“边基”编码。用一个0-1向量表示所有候选的轨道段两个重要节点之间的连接1表示该段被选中0表示不选。这样一个染色体就代表了一个潜在的地铁网络方案。适应度函数这是算法的指挥棒。我们的适应度是建设成本与覆盖效益的加权和求最小化所以适应度值取负。建设成本简单与总长度成正比。覆盖效益的计算需要一点技巧需要判断每个交通小区是否在站点一定距离如800米范围内。这里涉及大量的空间距离计算。强烈建议使用MATLAB的并行计算工具箱parfor因为评估成千上万个染色体的适应度时这个距离判断是主要耗时环节并行化后速度提升非常明显。参数调优遗传算法容易早熟收敛。我们通过多次试验发现对于这个问题较大的种群规模如200、较高的交叉概率0.8和较低的变异概率0.01配合“精英保留”策略效果比较好。MATLAB的ga函数可以直接设置这些选项。options optimoptions(ga, ... PopulationSize, 200, ... CrossoverFraction, 0.8, ... MutationFcn, {mutationuniform, 0.01}, ... EliteCount, 2, ... UseParallel, true, ... % 开启并行计算 MaxGenerations, 500, ... PlotFcn, gaplotbestf); % 可视化收敛过程 [x, fval] ga(fitnessfcn, nVars, [], [], [], [], lb, ub, [], options);3.3 建设时序优化整数规划的简化技巧直接对20年、几十条备选线路的0-1决策变量进行优化搜索空间巨大。我们采用了“聚类-分解”的策略来简化问题。线路聚类根据线路的地理位置和功能互补性将规划网络中的线路聚合成几个“项目包”。例如连接新老城区的两条线可能打包成一个项目包因为它们共同才能发挥网络效应。包级优化决策变量变为在哪个阶段启动哪个“项目包”。这大大减少了变量数量。我们用整数规划来求解这个简化问题。包内细化确定了项目包的启动时序后再在每个包内部用简单的规则如优先建设客流最大的一段确定具体的年度建设计划。在MATLAB中整数线性规划使用intlinprog。这里最大的坑是约束条件的规范化表述。比如“项目包B必须在项目包A启动后的第二阶段内启动”这种逻辑约束需要转化为线性不等式。我们通常引入一个很大的常数MBig-M法来实现。% 假设 x(A,t)1 表示项目包A在第t阶段启动 % 约束B必须在A启动后两个阶段内启动 % 引入辅助变量 y(t)表示A是否在阶段t及之前启动 % 约束可转化为sum_{s1}^{t} x(B,s) y(t-2) for all t % 这需要仔细地构建约束矩阵A和向量b4. 模型检验、灵敏度分析与论文呈现模型跑出结果不是终点如何验证其合理性并分析其稳健性是论文拿高分的关键。4.1 模型检验历史数据与极端场景对于中小城市可能没有地铁历史数据。我们的检验方法是内部一致性检验检查模型输出是否符合常识。比如客流大的走廊是否被线路覆盖建设时序是否先建设了连接核心区的线路高峰期的发车间隔是否比平峰期短参数灵敏度分析这是重头戏。系统地改变关键输入参数观察输出结果的变化是否在预期之内。客流增长率将预测的客流增长率上下浮动20%看最优网络规划和建设时序是否发生剧烈变化。如果变化很大说明方案风险高需要在论文中提出“弹性规划”的建议比如预留延伸条件。建设成本系数如果成本上涨50%方案是推迟建设还是减少线路规模这能体现模型的经济理性。折现率改变社会折现率分析其对建设时序决策的影响。折现率高会更倾向于推迟那些远期效益大的项目。极端场景测试设计一些极端情况比如某个大型新区的发展远低于预期或者突然增加一个大型交通枢纽。运行模型看原方案是否健壮或者需要怎样的调整。在MATLAB中我们可以写一个循环自动修改参数文件重复运行模型并收集关键输出指标如总成本、网络覆盖率等最后用plot或scatter函数绘制灵敏度分析图直观展示影响趋势。4.2 结果可视化让结论一目了然数学建模论文图表质量直接决定第一印象。我们当时重点做了以下几类图城市基础底图用geoshow或mapshow如果需要地理坐标或简单的scatter、plot画出城市边界、主要道路和人口密度热力图用imagesc或contourf。这是所有分析的基础。最优网络规划图在底图上用醒目的粗线条plot函数设置LineWidth画出优化得到的地铁线路用不同形状的标记scatter表示不同等级的站点。用text函数标注线路和站点编号。建设时序甘特图用barh水平条形图可以很好地表示各条线路或项目包在不同阶段的建设状态。不同颜色代表不同阶段一目了然。运营调度结果图用stairs阶梯图来展示一天内发车间隔的变化用area面积图叠加显示分时段客流需求可以清晰看出运力与需求的匹配情况。灵敏度分析蜘蛛图对于多参数灵敏度分析使用雷达图polarplot或平行坐标图需要自定义或找工具箱来展示多个输出指标随多个输入参数的变化非常专业。% 示例绘制简单的线路图 figure; hold on; plot(city_x, city_y, k-); % 画城市边界 for i 1:length(optimal_lines) % optimal_lines 包含每条线路的节点坐标 plot(optimal_lines(i).x, optimal_lines(i).y, b-o, LineWidth, 2, MarkerSize, 8); end scatter(station_x, station_y, 100, r, filled); % 画站点 xlabel(东向坐标 (km)); ylabel(北向坐标 (km)); title(中小城市地铁网络优化方案); legend(城市边界, 地铁线路, 站点, Location, best); grid on; hold off;4.3 论文写作要点从模型到故事最后模型和程序再好也需要通过论文来呈现。我们的经验是把论文当成一个“解决问题的故事”来写。问题重述要精准不要照抄题目要用自己的话提炼出问题的本质、目标和约束让评委一眼看出你理解了题意。模型假设需合理且明确列出所有重要假设如客流增长率恒定、建设成本与长度线性相关、乘客选择最短路径等并简要说明其合理性。这是模型成立的基础。符号说明要清晰建议使用三线表列出所有主要变量、符号和含义方便查阅。模型建立部分逻辑递进按照我们前面说的三层模型规划、时序、调度来组织每一部分先讲思路再给模型目标函数、约束条件最后说明求解方法。避免堆砌公式要用文字串联。模型求解部分突出工具和算法写明使用了MATLAB的哪些工具箱Optimization Toolbox, Global Optimization Toolbox, Parallel Computing Toolbox以及关键算法的步骤和参数设置。结果分析要深入不要只展示图表要解读图表。比如“从图5可见当客流增长率降低20%时一期建设方案从连接新城的L3线变为改造老城的L1线这说明在需求不确定时优先满足现有高密度区的需求更为稳健。”模型评价与推广实事求是客观说明模型的优点如系统性、可量化和缺点如未考虑土地政策、假设简化等并提出可能的改进方向。推广时可以提到模型框架也适用于其他类型的公共交通网络如BRT或基础设施规划。这次数维杯B题的挑战让我们深刻体会到将复杂的现实问题抽象为可计算的模型不仅需要扎实的数学和编程功底更需要对问题背景的深刻理解和做出合理简化的智慧。对于中小城市地铁这类“钱少事多”的命题任何一个决策都牵一发而动全身而数学建模正是帮助我们在这复杂系统中寻找最优解的有力工具。整个过程下来最大的收获不是那个奖项而是这套从问题拆解到模型实现再到结果分析的完整思维框架这在以后处理任何复杂的系统优化问题时都受益匪浅。