数学建模实战:从交巡警平台设置看图论与优化模型构建

发布时间:2026/8/17 4:22:30
数学建模实战:从交巡警平台设置看图论与优化模型构建 1. 从一道经典赛题看数学建模实战的“道”与“术”最近在整理历年数学建模竞赛的经典案例准备给团队的新人做一次系统性的复盘。翻到2011年国赛B题——“交巡警服务平台的设置与调度”这道题一下子把我拉回了当年参赛的现场。这道题之所以经典不仅在于它融合了图论、优化、仿真等多个核心建模领域更在于它完美地呈现了数学建模从“问题抽象”到“模型求解”再到“结果分析”的全过程。很多新手同学一上来就急着找代码、套算法往往忽略了最关键的“问题理解”和“模型构建”环节结果就是模型建得花里胡哨却答非所问。今天我想抛开那些复杂的公式推导就用一个现在很多同学都在用的国产科学计算软件——北太天元来重新解构这道题。我的目的不是提供一个“标准答案”建模本身就没有唯一解而是想分享一套完整的、可复现的实战思路如何将一段文字描述的现实问题一步步转化为计算机可以理解和计算的数学模型并利用工具高效求解。你会发现工具只是“术”背后的建模思想才是“道”。掌握了“道”无论题目怎么变你都能从容应对。2. 问题重述与核心矛盾拆解别急着画图2011年B题的题目描述不算短但核心诉求非常明确在一个城市的交通网络与平台上合理设置交巡警服务平台的位置并设计一套在突发警情时的调度方案。题目给出了道路节点数据、平台初始位置以及一系列具体要求比如“尽量在3分钟内到达”、“平台工作量尽量均衡”等。很多同学拿到题第一步就是打开软件开始画图、算最短路径。这恰恰是第一个容易踩的坑。建模的第一步永远是“定义问题”。我们需要把题目中模糊的自然语言翻译成精确的数学语言。2.1 将“要求”转化为“目标”与“约束”我们先来拆解题目中的几个关键要求“服务平台工作量尽量均衡”这是一个优化目标。什么是“工作量”题目暗示是“出警次数”或“负责的节点数”。我们需要将其量化例如定义每个平台的工作量为其管辖范围内所有节点发生警情的期望次数之和或简单理解为管辖节点数。那么“均衡”如何衡量常见的方法是使所有平台工作量的方差最小或者使最大工作量与最小工作量之差最小化。这里就产生了我们的第一个优化目标最小化平台工作量的不均衡度。“一般警情尽量在3分钟内到达”这是一个硬性约束但也可能是一个优化目标。首先“3分钟”需要根据道路长度和车速题目给出转换为最大距离。这定义了每个平台的“有效覆盖范围”。对于平台设置问题我们可以要求每个节点至少被一个平台在3分钟路程内覆盖。对于调度问题这则是一个必须满足的条件。同时“尽量”这个词又给了我们弹性可以将其转化为一个目标例如最大化在3分钟内能被响应的警情比例。“对重大突发事件需调度全区20个平台警力封锁13个交通要道”这是一个独立的子问题本质是一个多起点、多终点的最短路径调度问题目标是所有警力到达指定要道的总时间最短或最晚到达时间最短。看到这里你应该意识到这不是一个单目标问题而是一个多目标优化问题。直接求解非常困难。实战中我们通常采用分层序列法或加权求和法将其转化为单目标问题。例如我们可以优先保证“3分钟覆盖”这个关键约束在此基础上去优化“工作量均衡”。2.2 数据预处理与抽象构建“图”模型题目给出了全市路口节点的坐标和连接关系。这天然就是一个图Graph的模型。节点就是路口边就是道路边的权重就是道路长度或根据车速换算的时间。在北太天元中我们首先需要将这份数据构建成一个图对象。假设数据保存在一个Excel文件node_data.xlsx中第一列是节点编号第二、三列是坐标边的关系保存在另一个文件edge_data.xlsx中。// 北太天元代码示例数据读取与图构建 // 假设数据已准备好 node_table readmatrix(node_data.xlsx); // 读取节点数据 edge_table readmatrix(edge_data.xlsx); // 读取边数据每行 [起点, 终点, 距离] node_ids node_table(:, 1); node_coords node_table(:, 2:3); // 坐标 // 构建图的权重矩阵邻接矩阵 num_nodes length(node_ids); W zeros(num_nodes, num_nodes) inf; // 初始化为无穷大表示不直接连通 for i 1:size(edge_table, 1) from edge_table(i, 1); to edge_table(i, 2); dist edge_table(i, 3); W(from, to) dist; W(to, from) dist; // 无向图对称赋值 end for i 1:num_nodes W(i, i) 0; // 自己到自己的距离为0 end // 此时W就是一个带权重的邻接矩阵它完整描述了交通网络。这一步看似简单但极易出错。要仔细检查数据中节点编号是否连续边是否都有对应的节点避免出现“孤岛”节点除非题目允许。构建好图我们才有了进行分析和计算的“舞台”。3. 模型构建一服务平台设置的“最大覆盖”与“均衡”模型有了图模型我们来解决第一个核心问题如何设置服务平台的位置即从92个节点中选出20个作为平台使得在满足“3分钟覆盖”的前提下平台工作量最均衡3.1 定义决策变量与覆盖关系这是典型的设施选址问题。我们定义二元决策变量x_j 1表示在节点j设置服务平台否则为0。j 1, 2, ..., 92。y_i 1表示节点i被至少一个设置在3分钟路程内的平台覆盖否则为0。i 1, 2, ..., 92。但y_i其实可以由x_j和最短路径距离d(i, j)推导出来。我们先要计算所有节点对之间的最短路径距离。这里就需要用到图论算法。// 北太天元代码示例使用Floyd算法计算所有节点对最短路径 // 假设权重矩阵 W 已定义单位为距离 function D floyd_shortest_path(W) n size(W, 1); D W; // 初始化距离矩阵 for k 1:n for i 1:n for j 1:n if D(i, k) D(k, j) D(i, j) D(i, j) D(i, k) D(k, j); end end end end end D floyd_shortest_path(W); // D(i,j) 即为节点i到节点j的最短距离计算出距离矩阵D后我们可以根据车速假设为60km/h即1km/min将3分钟转换为距离约束L 3 km。那么节点i能被位于节点j的平台覆盖的条件是D(i, j) L。3.2 建立多目标优化模型我们可以建立如下数学模型目标1最大化覆盖最大化被覆盖的节点数。Maximize Z1 sum(y_i)其中y_i 1当且仅当存在j使得x_j 1且D(i, j) L。目标2均衡工作量最小化各平台工作量的差异。首先需要定义每个平台j的工作量w_j。一个简单定义是w_j sum( a_i * z_{ij} )其中a_i是节点i的警情发生权重题目未明确可假设为1或根据节点属性设定z_{ij}1表示节点i由平台j负责每个节点只由一个平台负责。那么目标可以是最小化max(w_j) - min(w_j)或者最小化w_j的方差。Minimize Z2 var(w)或Minimize Z2 max(w) - min(w)约束条件平台总数限制sum(x_j) 20每个节点最多被一个平台“负责”用于计算工作量sum(z_{ij}) 1对所有i。节点i能被平台j负责的前提是平台j覆盖了它z_{ij} c_{ij}其中c_{ij}1如果D(i,j) L否则为0。变量类型x_j, y_i, z_{ij} ∈ {0, 1}这是一个复杂的0-1整数规划问题且是多目标的。直接求解非常困难。3.3 实战求解策略两步法简化在竞赛有限的时间内我们需要聪明的简化。一个行之有效的策略是两步法第一步解决“最大覆盖”问题。暂时忽略工作量均衡只考虑用20个平台覆盖尽可能多的节点。这本身就是一个经典的“最大覆盖选址问题”MCLP。我们可以用贪婪算法来求一个不错的解初始时所有平台未设置所有节点未被覆盖。每次迭代选择一个能覆盖最多当前未被覆盖节点的节点设置平台。重复步骤2直到设置了20个平台。// 北太天元代码示例贪婪算法求解最大覆盖伪代码逻辑 L 3; // 覆盖半径 num_platforms 20; selected_platforms []; // 存储被选为平台的节点编号 covered_nodes false(92, 1); // 标记节点是否被覆盖 for k 1:num_platforms best_gain -1; best_node -1; // 遍历所有尚未被选为平台的节点 for candidate 1:92 if ismember(candidate, selected_platforms) continue; end // 计算选择该候选点能新覆盖多少个节点 new_cover (D(:, candidate) L) (~covered_nodes); gain sum(new_cover); if gain best_gain best_gain gain; best_node candidate; end end if best_node 0 selected_platforms [selected_platforms, best_node]; covered_nodes covered_nodes | (D(:, best_node) L); end end // 输出选中的平台位置 selected_platforms 和总覆盖节点数 sum(covered_nodes)贪婪算法不能保证全局最优但计算快结果通常可接受非常适合竞赛。第二步在覆盖基础上优化“工作量均衡”。上一步我们已经得到了20个平台的位置。现在固定这20个位置我们来解决每个节点具体由哪个平台负责的问题即确定z_{ij}以使得工作量最均衡。这可以建模为一个分配问题将92个节点分配给20个平台每个节点必须分配给一个能覆盖它的平台目标是各平台负责的节点数尽可能平均。这可以用整数规划求解也可以用启发式算法如迭代改进法初始分配将每个节点分配给离它最近且能覆盖它的平台。计算每个平台的工作量节点数。尝试进行调整找到一个工作量最大的平台A和一个工作量最小的平台B检查是否存在一个当前由A负责的节点它可以被B覆盖。如果存在将其分配给B。重复步骤3直到无法改进或达到迭代次数。通过这两步我们就能得到一个在覆盖率和均衡性上都相对合理的平台设置与管辖方案。这个过程体现了建模中“分解”与“降维”的核心思想。4. 模型构建二突发警情调度的“多源多汇”最短路径模型第二个子问题是突发重大事件时需要从20个平台源点调度警力快速封锁13个交通要道汇点。这是一个典型的多源多汇最短路径调度问题更专业的叫法是运输问题或指派问题的变种。4.1 问题转化与模型建立目标是最短总时间或最短完成时间。我们假设每个平台警力充足可以封锁任意一个要道且一个要道只需一个平台封锁。那么问题就转化为将20个平台供给点分配给13个要道需求点每个要道分配一个平台使得所有警力到达各自指定要道的总时间最短或最晚到达时间最短。设t_{ij}为从平台i到要道j的最短时间根据距离和车速计算。定义决策变量u_{ij} 1表示指派平台i去封锁要道j否则为0。模型A最小化总时间Minimize Sum_{i1}^{20} Sum_{j1}^{13} t_{ij} * u_{ij} Subject to: Sum_{i1}^{20} u_{ij} 1, for all j (每个要道有且仅有一个平台负责) Sum_{j1}^{13} u_{ij} 1, for all i (每个平台最多负责一个要道因为只有13个要道) u_{ij} ∈ {0, 1}这是一个标准的指派问题可以用著名的匈牙利算法Hungarian Algorithm高效求解。模型B最小化最晚到达时间Min-Max这个目标更符合“快速封锁”的紧急场景。我们需要最小化所有指派中最大的t_{ij}。这可以通过引入一个辅助变量T表示最晚到达时间来建模Minimize T Subject to: Sum_{i1}^{20} u_{ij} 1, for all j Sum_{j1}^{13} u_{ij} 1, for all i t_{ij} * u_{ij} T, for all i, j (线性化处理当u_{ij}1时t_{ij} T) u_{ij} ∈ {0, 1}, T 0这是一个混合整数线性规划问题。在竞赛中如果追求精确解可以调用优化求解器也可以采用启发式方法如先按模型A求总时间最短的解再在其基础上微调以降低最大时间。4.2 北太天元中的求解实现北太天元提供了优化工具箱。对于指派问题我们可以将其转化为线性规划问题因为系数矩阵是全幺模矩阵其线性松弛的最优解就是整数解或者直接调用整数规划求解器。// 北太天元代码示例使用整数规划求解最小总时间指派问题模型A // 假设 time_matrix 是一个 20x13 的矩阵time_matrix(i,j) t_{ij} [m, n] size(time_matrix); // m20, n13 // 将二维变量 u_{ij} 拉成一维变量 x_k k (i-1)*n j num_vars m * n; f reshape(time_matrix, num_vars, 1); // 目标函数系数 // 约束1每个要道j必须有一个平台。共n个约束。 A_eq1 zeros(n, num_vars); for j 1:n for i 1:m A_eq1(j, (i-1)*n j) 1; end end b_eq1 ones(n, 1); // 约束2每个平台i最多负责一个要道。共m个约束。 A_ub2 zeros(m, num_vars); for i 1:m for j 1:n A_ub2(i, (i-1)*n j) 1; end end b_ub2 ones(m, 1); // 变量边界0 x 1 且为整数 lb zeros(num_vars, 1); ub ones(num_vars, 1); intcon 1:num_vars; // 所有变量都是整数 // 调用整数规划求解器 (假设函数名为 intlinprog具体函数名以北太天元文档为准) // [x, fval] intlinprog(f, intcon, A_ub2, b_ub2, A_eq1, b_eq1, lb, ub); // 注意北太天元的优化工具箱函数名和参数顺序可能不同请查阅官方文档。 // 解出x后再reshape回u矩阵即可得到指派方案。注意以上代码是概念性示例。北太天元的具体优化函数名和调用方式请务必查阅其最新官方文档。在实际竞赛中如果软件内置求解器性能不足或使用不便也可以自己实现匈牙利算法代码量不大且效率极高。4.3 一个重要的实战细节路径回溯求解出指派方案u_{ij}后我们只知道平台i要去要道j。但警力具体走哪条路这就需要我们根据之前计算的全源最短路径距离矩阵D不仅记录最短距离还要记录前驱节点以便回溯出完整路径。在Floyd算法中可以同时维护一个next矩阵next(i, j)表示从i到j的最短路径上i的下一个节点是什么。这样对于任意一对(i, j)我们都能快速生成路径节点序列。这是模型结果可视化在地图上画出调度路线的关键一步也是论文中的加分项。5. 灵敏度分析与方案评估让模型结果“站得住脚”数学建模论文最忌讳的就是“得到一个结果就结束”。评委老师最看重的恰恰是你对模型结果的分析、检验和讨论。这部分往往能区分出优秀论文和普通论文。5.1 参数灵敏度分析我们的模型依赖于几个关键参数覆盖半径L3分钟对应距离、平台总数20个、车速。在现实中这些参数都可能发生变化。覆盖半径变化如果上级要求提高到2分钟或放宽到4分钟响应我们的平台设置方案还最优吗我们可以在模型中改变L的值重新运行第一步的“最大覆盖”模型观察覆盖率的变化情况。通常覆盖率会随着L增大而快速提升但边际效益递减。我们可以绘制“覆盖率-覆盖半径”曲线这能很好地说明当前3分钟要求的合理性或挑战性。平台数量变化如果警力资源增加或减少平台数变为15个或25个方案如何变化同样可以重新求解分析覆盖率和工作量均衡度随平台数量变化的趋势。这能为资源规划提供决策支持。车速变化高峰时段车速下降相当于有效覆盖半径缩小。我们可以分析在车速下降一定比例后现有方案的覆盖率会下降多少哪些区域会首先成为“覆盖盲区”。这体现了模型的鲁棒性和现实意义。在北太天元中我们可以写一个循环改变参数值反复调用前面的模型求解函数收集结果并绘图分析。5.2 方案对比与评价我们通过贪婪算法迭代改进得到的平台设置方案未必是全局最优解。如何评价它的好坏与简单规则对比例如与“随机选择20个节点”、“选择度数最大的20个节点”等简单方案进行对比计算在覆盖率、均衡度等指标上的优势。这能凸显我们模型的优越性。与理论界限对比对于最大覆盖问题可以计算一个简单的理论上界。比如即使每个平台能覆盖所有节点最大覆盖率也就是100%。或者计算每个节点被覆盖至少需要多少个平台这是一个集合覆盖问题的下界。我们的结果与这些理论界限的差距说明了模型的效果和可能的改进空间。可视化呈现将最终的平台位置、管辖范围、调度路径在城市地图节点坐标图上可视化出来。用不同颜色标记不同平台管辖的区域用箭头线表示调度路径。一张清晰直观的图胜过千言万语。北太天元有强大的绘图功能一定要充分利用。// 北太天元代码示例方案可视化示意图 figure; // 1. 绘制所有节点 scatter(node_coords(:,1), node_coords(:,2), 20, k, filled); hold on; // 2. 高亮显示被选为平台的节点 scatter(node_coords(selected_platforms, 1), node_coords(selected_platforms, 2), 100, r, ^, LineWidth, 2); // 3. 绘制每个平台的覆盖范围以圆圈表示 for i 1:length(selected_platforms) center node_coords(selected_platforms(i), :); // 绘制一个半径为L的圆 theta 0:0.01:2*pi; x_circle center(1) L * cos(theta); y_circle center(2) L * sin(theta); plot(x_circle, y_circle, b--, LineWidth, 0.5); end // 4. 绘制调度路径假设已经得到路径节点列表 paths for p 1:length(paths) path_nodes paths{p}; // 第p条路径的节点序列 plot(node_coords(path_nodes, 1), node_coords(path_nodes, 2), g-, LineWidth, 2); end xlabel(X坐标); ylabel(Y坐标); title(交巡警服务平台设置与调度方案示意图); legend(普通路口, 服务平台, 覆盖范围, 调度路径); axis equal; grid on;5.3 模型优缺点与推广最后必须在论文中客观地讨论模型的优缺点。优点模型清晰将复杂问题分解为可求解的子问题使用了图论、优化等经典方法原理可靠通过两步法和启发式算法在有限时间内得到了可行且较好的解进行了详细的灵敏度分析增强了说服力。缺点贪婪算法和迭代改进法不能保证全局最优工作量均衡的定义可能过于简化未考虑警情频率差异模型假设每个平台警力无限且能力相同与现实略有出入调度模型未考虑道路拥堵等动态因素。推广本模型框架可广泛应用于各类公共服务设施选址如消防站、急救中心、共享单车停放点和应急资源调度问题。只需替换图中的节点、边权重以及约束条件即可适配新的场景。6. 从解题到备赛北太天元在数学建模中的实战价值通过完整地拆解2011年B题我们不仅重温了一道经典赛题更重要的是梳理了一条清晰的建模技术路线。在这个过程中北太天元扮演了什么角色它绝不仅仅是一个“MATLAB的替代品”。6.1 一体化工作流降低工具链切换成本以往备赛团队可能要用Excel处理数据用Python的NetworkX画图、用Scipy做优化再用Matplotlib可视化中间还要处理各种数据格式转换。北太天元将数据导入、矩阵计算、图论算法、优化求解、科学绘图集成在一个统一的环境中。就像我们上面演示的从读数据到出结果和图表可以在一个脚本文件中连贯完成。这极大降低了学习成本和调试难度让队员能更专注于建模本身而不是折腾工具。6.2 对国产基础软件生态的深度参与使用北太天元参加国赛本身就是对国产科学计算软件的一次深度实践。你会接触到它自研的语法和函数库。这个过程可能遇到一些与MATLAB的差异或者发现某些工具箱还不完善。但这恰恰是宝贵的经验你学会了查阅国产软件的文档甚至可以为它的生态贡献代码比如自己实现一个匈牙利算法函数库。这种经验在未来面对其他国产工业软件时会显得非常有价值。6.3 针对竞赛的优化与技巧代码效率北太天元底层基于矩阵运算在处理像Floyd算法这种三层循环时如果节点数很大比如上千个纯脚本循环可能会慢。这时可以考虑向量化操作或者利用其并行计算特性如果支持。在竞赛前针对常用算法最短路径、遗传算法、模拟退火等准备一些优化过的函数模板能节省大量时间。结果复现与调试数学建模论文要求结果可复现。北太天元的脚本文件.m或.mfn清晰记录了所有步骤。一定要养成写注释、分章节、妥善保存中间结果的好习惯。调试时可以分段运行代码利用其工作区变量查看功能快速定位问题。与论文写作的衔接北太天元生成的图表可以直接插入到Word或LaTeX编写的论文中。确保图表清晰、标注完整中文字体支持。可以将关键结果如平台编号、指派方案输出为表格格式的文本或Excel文件方便论文中引用。回顾这道2011年的老题其核心价值历久弥新。它考察的从来不是某个刁钻的算法而是面对一个开放的现实问题如何有条理地分析、假设、建模、求解和评估的综合能力。北太天元这类工具为我们提供了实现这一过程的强大助力。但工具再强头脑中的建模思想才是灵魂。我的建议是在备赛时多用北太天元去亲手实现这些经典模型从数据到代码从代码到图表从图表到分析走通整个闭环。当你亲手做过几次这样的全流程再面对新的赛题时那份从容和清晰的思路就是你能带到赛场上的最大优势。