基于NSGA-II与SWMM的雨水管网多目标优化

发布时间:2026/9/19 19:46:46
基于NSGA-II与SWMM的雨水管网多目标优化 简介基于NSGA-Ⅱ算法的雨水管网优化模型研究毕业论文PDF面向市政工程、给排水专业的学生与科研人员针对传统雨水管网设计主观性强、单目标优化局限等问题给出完整的优化建模与验证方案。文档以西南交大硕士论文为范本系统介绍快速非支配排序遗传算法原理、Matlab程序编写、SWMM水力模型建立与动态模拟方法可实现管径、坡度、流速、埋深等多参数同步寻优。资源包共1个文件为PDF格式压缩包大小2.81MB便于随时阅读与打印。已有237人浏览学习。整篇论文从理论推导、算法设计到实例验证环环相扣适合作为课程设计、毕业设计或相关课题的参考资料。读者可从中获取目标函数与约束条件设定技巧、Pareto解集分析思路以及眉山彭山区实际案例中溢流量从22993立方米降至6273立方米、路面积水减少73%的优化效果为城市雨水管网改造和内涝防治研究提供方法参考与算法实现借鉴。1. 换一种思路做管网优化多目标与水力模拟的联合寻优城市内涝频发问题最后都指向同一个环节雨水管网排水能力不足。但管网改造最大的难点不是水力计算本身而是“怎么改才划算”。传统做法靠设计人员经验试算改一段管看一段效果方案单一不说还很难回答“多花一千万能多排多少水”这类问题。这篇论文给出的思路是把快速非支配排序遗传算法NSGA-II和SWMM水力模型组合成一个闭环让算法生成管径组合方案SWMM负责模拟每套方案的实际排水表现两个目标造价最低、溢流量最小同时优化最终输出一整条Pareto前沿供决策者选点。案例用了四川省眉山市彭山区旧城西片区优化后管网总溢流量从22993立方米降到6273立方米降幅约73%改造费用约12500万元。对做城市水务信息化、排水管网评估、内涝治理方案比选的工程师来说这套“算法水力模拟”的架构有直接的参考价值下面拆开讲。2. NSGA-II核心机制与Matlab实现2.1 为什么单目标优化在管网场景下不够用雨水管网优化里造价和排水能力天生冲突。管径加大排水能力上升造价也跟着涨管径缩小造价降了但节点溢流量可能失控。如果只优化造价算法会倾向于把所有管道压到最小规格结果就是内涝风险转移。如果只优化排水能力算法会把管径拉到上限投资完全不可控。传统的处理方式是加权求和把两个目标乘上权重系数后合并成一个标量。问题在权重系数的取值缺乏依据而且加权法在Pareto前沿非凸的情况下会漏掉一部分有效解。这篇论文选择NSGA-II是因为它直接处理多个目标函数不需要预先设定权重一次运行就能得到一组互不支配的折中方案。2.2 快速非支配排序解的分层逻辑NSGA-II的思路分三步。第一步做非支配排序如果一个解A在所有目标上都不劣于解B且至少一个目标严格优于B那么A支配B。所有不被任何其他解支配的解构成第一层Pareto前沿去掉它们之后再对剩余解排序得到第二层、第三层……排序的目的是让算法优先保留更接近真实前沿的解。Matlab里实现快速非支配排序核心代码片段如下function [rank, pset] fast_non_dominated_sort(obj_values) % obj_values: 种群的目标函数矩阵每行是一个个体每列是一个目标 % rank: 每个个体所在的非支配层编号 n size(obj_values, 1); np zeros(n, 1); % 被支配次数 sp cell(n, 1); % 被当前个体支配的解集合 front {}; % 各前沿层 for i 1:n for j 1:n if i j continue; end if dominates(obj_values(i,:), obj_values(j,:)) sp{i} [sp{i}, j]; elseif dominates(obj_values(j,:), obj_values(i,:)) np(i) np(i) 1; end end end for i 1:n if np(i) 0 front{1} [front{1}, i]; end end k 1; while ~isempty(front{k}) Q []; for i front{k} for j sp{i} np(j) np(j) - 1; if np(j) 0 Q [Q, j]; end end end k k 1; front{k} Q; end rank zeros(n, 1); for k 1:length(front) rank(front{k}) k; end pset front; end function d dominates(x, y) % x 是否支配 y d all(x y) any(x y); end这段代码里np数组记录每个解被多少个其他解支配sp记录每个解支配了哪些解。每处理完一层前沿就把这一层解对被支配者的计数减一直到所有解完成分层。复杂度从暴力比较的O(MN²)降到了O(MN²)但常数更小对几百个体规模的种群来说运行时损耗完全可以接受。实际在管网优化场景中种群规模一般取50到100目标函数只有两个造价和溢流量这个排序过程耗时占比很小。2.3 拥挤度计算保持解的多样性非支配排序保证了解的收敛性但还不解决多样性问题。如果算法只保留前沿解种群很容易聚集在Pareto前沿的某个局部区域比如清一色低造价低排水能力的方案或者清一色高造价高排水能力的方案。NSGA-II用拥挤度距离来维持解的均匀分布。function dist crowding_distance(obj_values) % obj_values: 同一前沿层内的目标函数值 n size(obj_values, 1); m size(obj_values, 2); dist zeros(n, 1); if n 2 dist(:) inf; return; end for j 1:m [~, idx] sort(obj_values(:, j)); fmin obj_values(idx(1), j); fmax obj_values(idx(end), j); if fmax fmin continue; end dist(idx(1)) inf; dist(idx(end)) inf; for i 2:n-1 dist(idx(i)) dist(idx(i)) ... (obj_values(idx(i1), j) - obj_values(idx(i-1), j)) / (fmax - fmin); end end end拥挤度距离的直观含义是某个解在目标空间里与相邻两个解的平均距离。距离越大说明这个解周围越空旷保留它能维持前沿的均匀性。两边端点解的距离设为无穷大确保算法不会丢掉极端方案。在二元锦标赛选择时先比较非支配层级层级小的胜出层级相同时拥挤度大的胜出。这个策略让算法在收敛和分散之间取得平衡论文里的优化模型也是按这个逻辑实现选择算子的。2.4 精英保留策略与算法主循环精英策略是NSGA-II相对于第一代NSGA的关键改进。每一代产生子代后将父代和子代合并成一个规模为2N的临时种群对这个合并种群做非支配排序和拥挤度计算然后按层级从低到高依次填入下一代直到填满N个个体同一层内按拥挤度降序取用。这段逻辑在Matlab里的主循环结构如下for gen 1:max_gen offspring genetic_operators(pop, rank, dist); combined [pop; offspring]; [rank, ~] fast_non_dominated_sort(combined_obj(combined)); dist crowding_distance(combined_obj(combined)); next_pop []; r 1; while length(next_pop) numel(rank r) pop_size next_pop [next_pop; combined(rank r)]; r r 1; end % 最后一个前沿按拥挤度排序取剩余名额 last_front combined(rank r); last_dist dist(rank r); [~, sort_idx] sort(last_dist, descend); next_pop [next_pop; last_front(sort_idx(1:pop_size-length(next_pop)))]; pop next_pop; end参数设置上这篇论文的模型里种群规模和迭代次数需要根据管网规模调整。管网节点数量少比如几十个时种群取60、迭代300代基本够用如果汇水区细分到几百个子流域管段数上百建议种群取100、迭代500代以上。交叉概率取0.9变异概率按1/决策变量个数计算这样平均每个个体大约只有一个基因发生变异避免变异过于剧烈破坏已收敛的模式。3. SWMM模型建立与Matlab自动调用3.1 SWMM在水力模拟中的角色NSGA-II负责生成管径组合方案但每个方案好不好得靠水力模型来评估。SWMMStorm Water Management Model是EPA开发的暴雨洪水管理模型能模拟降雨-地表径流-管网汇流-节点溢流的完整过程在城市排水领域用得最广。论文中的做法是基于研究区现状管网资料建立SWMM模型先模拟重现期降雨下管网的运行状态获取各节点的溢流量作为优化前的基准数据。随后在优化过程中反复调用SWMM对不同管径组合方案做水力模拟把各节点的溢流量总和作为排水能力目标的输出。这个流程的关键在于Matlab和SWMM之间的数据交互——要改管径要跑模拟要读结果还要保证循环几百次不出错。3.2 编写INP文件与命令行调用SWMM的模型文件是.inp文本格式管道属性在[CONDUITS]和[XSECTIONS]两个数据段里定义。管径修改可以直接用Matlab文本函数完成不需要额外接口。修改完成后通过命令行调用SWMM的可执行文件指定输入输出文件路径等待模拟结束后解析结果。代码如下function [status] run_swmm(inp_path, rpt_path, out_path) % 调用SWMM引擎执行模拟 % swmm_exe: SWMM可执行文件路径如 C:\SWMM\swmm5.exe swmm_exe C:\SWMM\swmm5.exe; cmd sprintf(%s %s %s %s, swmm_exe, inp_path, rpt_path, out_path); % 使用系统调用执行命令-1表示等待进程结束 status system(cmd); if status ~ 0 error(SWMM模拟失败请检查INP文件); end end调用SWMM有两种常见方式需要区分使用场景。第一种就是上面的命令行方式每次模拟都启动一个新的SWMM进程优点是实现简单、调试方便缺点是进程启动有开销几百次迭代跑下来耗时偏长。第二种是通过SWMM的DLL接口swmm5.dll在Matlab进程内直接调用swmm_open、swmm_start、swmm_step、swmm_end等函数省去进程切换计算效率更高适合做上千次迭代的大规模优化。论文使用的是前者原因在于Matlab调用dll需要额外的库文件配置而命令行方式对运行环境的要求更少且每一步都有中间文件可查。修改管径的核心操作是重写[XSECTIONS]段function rewrite_diameter(inp_path, pipe_ids, diameters, out_path) % 读取原始INP文件替换指定管道的管径 % pipe_ids: 管道ID列表 % diameters: 对应的新管径米 fid_in fopen(inp_path, r); fid_out fopen(out_path, w); in_xsec false; while ~feof(fid_in) line fgetl(fid_in); if startsWith(line, [XSECTIONS]) in_xsec true; fprintf(fid_out, %s\n, line); continue; end if in_xsec startsWith(line, [) in_xsec false; end if in_xsec parts strsplit(strtrim(line)); if length(parts) 4 ismember(parts{1}, pipe_ids) idx find(strcmp(parts{1}, pipe_ids)); % 第3列是管径CIRCULAR管道的断面几何参数即直径 line sprintf(%s\t%s\t%.3f\t%s, ... parts{1}, parts{2}, diameters(idx), strjoin(parts(4:end), \t)); end end fprintf(fid_out, %s\n, line); end fclose(fid_in); fclose(fid_out); end这段代码逐行扫描INP文件定位到[XSECTIONS]段后匹配管道ID并替换管径数值。需要注意两点一是SWMM中CIRCULAR断面的第三个参数就是直径单位是米与Matlab中优化变量的单位保持统一二是替换时不要改动同一行的其他字段粗糙度、入流偏移等参数必须原样保留否则模拟结果会有偏差。3.3 溢流量结果解析模拟结束后节点溢流量数据在.rpt报告文件的Node Flooding Summary部分。解析逻辑如下# Windows下可以用findstr定位章节 findstr /N Node Flooding Summary result.rptMatlab里解析这段文本的思路是定位章节标题行然后顺序读取数据行按列提取节点名称和溢流量体积function total_flood parse_flooding(rpt_path) % 从RPT文件中解析节点总溢流量立方米 fid fopen(rpt_path, r); total_flood 0; capture false; while ~feof(fid) line fgetl(fid); if contains(line, Node Flooding Summary) capture true; fgetl(fid); % 跳过一行 fgetl(fid); % 跳过表头 continue; end if capture % 遇到空行或下一章节则停止解析 if isempty(strtrim(line)) || startsWith(line, Analysis begun) break; end parts strsplit(strtrim(line), regexp(strtrim(line), \s)); if length(parts) 7 flood_vol str2double(parts{6}); % 第6列是洪水量10^6升或m^3视单位设置而定 if ~isnan(flood_vol) total_flood total_flood flood_vol; end end end end fclose(fid); end这个解析方法比较脆弱依赖RPT文件的固定格式。更稳的方式是用SWMM的OUT文件读取接口通过DLL直接获取节点溢流量结果但这需要把代码从命令行模式切换到DLL模式。如果是做一次性优化RPT解析够用如果要封装成可复用的优化工具供团队使用建议直接对接DLL接口。3.4 参数率定与雨型设计SWMM模型参数分为水文参数和水力参数两类。水文参数包括不透水率、洼蓄量、曼宁糙率等水力参数包括管道糙率、节点洼蓄量等。论文研究区内以老城区为主下垫面构成复杂参数的取值主要依据土地利用类型和文献经验值参数取值说明不透水率0.6~0.8老城区建筑密度高取偏大值不透水区洼蓄量1.5~2.5 mm路面和屋顶取值不同透水区洼蓄量5~10 mm绿地为主管道曼宁糙率0.013~0.015混凝土管典型值不透水区曼宁糙率0.012~0.015水泥路面取0.013雨型设计采用芝加哥雨型暴雨强度公式需要按当地参数调整。重现期取2年、3年和5年分别模拟论文中用于优化前后对比的基准工况是特定重现期下的设计暴雨。需要强调的是芝加哥雨型是单峰雨型对峰值位置的敏感性较高r参数雨峰系数取0.4左右比较符合国内的短历时暴雨特征。4. 双目标优化模型目标函数、约束处理与决策变量编码4.1 决策变量编码论文把管径作为唯一决策变量。每段管道对应一个基因位基因值是管径的标准规格。国内排水管常用公称直径和实际内径存在差异编码时直接映射到标准序列500、600、700、800、1000、1200、1500、1800、2000毫米对应SWMM中CIRCULAR断面的直径参数。Matlab中把管径组合表示为一个实数向量每个元素在标准序列中的索引值即为整数编码。论文中管径范围在dn500到dn2000之间。优化算法的变异操作如果直接对浮点数做扰动容易生成非标管径。常见做法是维护一个标准管径序列编码用序列下标解码时查表映射。这个查表方式代码实现如下function d decode_diameter(genes, std_diameters) % genes: 决策变量向量每个元素是标准管径在序列中的索引 % std_diameters: 标准管径序列单位米 d std_diameters(genes); end4.2 目标函数设计目标函数一管网建设费用最小化。管道的造价和管径、长度、埋深都有关系论文将其简化为管径和长度的函数$$C \sum_{i1}^{n} \alpha \cdot L_i \cdot f(D_i)$$其中$C$为总造价$L_i$为第i段管道长度$f(D_i)$为单位长度造价函数通常函数形式为$f(D) a \cdot D^b$系数a和b根据当地管材价格和施工定额回归得到。论文中改造费用约12500万元的估算结果就是在这个函数基础上得到的。目标函数二排水能力最大化。排水能力用节点总溢流量来表征溢流量越大说明排水能力越弱。通过SWMM模拟获得每个节点在指定雨型下的溢流量对所有节点求和$$F_{flood} \sum_{j1}^{m} V_j$$目标函数二实际上就是最小化$F_{flood}$。这就是为什么优化主循环里每评估一个个体都要调用一次SWMM模拟的意义所在——造价可以直接算溢流量必须跑水力模型。4.3 约束条件处理约束条件一共有四类分别对应管道设计规范和水力可行性约束类型约束内容处理方式管径约束管径必须从标准序列中取值且下游管径不小于上游编码时限制取值空间解码后校验坡度约束管道坡度在最小设计坡度与最大允许坡度之间惩罚函数流速约束设计流速不大于管道最大允许流速通常5m/s不小于最小不淤流速0.75m/s惩罚函数埋深约束管道埋深满足覆土厚度和最大埋深要求惩罚函数本文用惩罚函数法处理约束。惩罚函数的核心思路是违反约束的方案仍然参与进化但在适应度上受到惩罚从而降低其被选中的概率。惩罚项加到两个目标函数上function [cost_pen, flood_pen] evaluate_individual(genes, pipe_data) % pipe_data: 管道长度、坡度、节点连接关系等静态数据 d decode_diameter(genes, std_diameters); % 检查下游管径不小于上游 if any(d(pipe_data.downstream) d(pipe_data.upstream)) penalty 1e6; % 大惩罚系数 else penalty 0; end % 造价计算 cost_pen sum(pipe_data.length .* cost_per_m(d)) penalty; % 这里需要调用SWMM获取溢流量 flood_pen get_total_flood(genes) penalty; end惩罚系数取1e6的量级远远大于正常目标函数的值域能确保违反约束的个体在非支配排序中处于最底层。论文里同时提到坡度、流速和埋深这些约束有一部分是SWMM自身在模拟时会输出流速结果可以从RPT文件中获取后进行校验不满足则加惩罚。另外论文里约束条件在优化过程中也起着引导搜索方向的作用比如流速约束避免算法选出的管径组合在局部形成超高速流态这在现实工程中会造成管壁磨损甚至气蚀风险。4.4 优化主循环与SWMM联动完整的优化循环是初始化种群随机生成管径组合→ 解码得到具体管径 → 重写INP文件 → 运行SWMM → 解析溢流量 → 计算两个目标函数值 → 非支配排序 拥挤度选择 → 交叉变异产生子代 → 合并父代子代 → 精英选择 → 进入下一代。每一代需要跑N个个体的SWMM模拟100个个体跑300代就是3万次模拟单次模拟两秒的话总时长超过16个小时。论文在彭山区案例中能够完成优化说明该案例的管网规模不大单次模拟速度较快。for gen 1:max_gen for i 1:pop_size % 1. 解码 d decode_diameter(pop(i,:), std_diameters); % 2. 写入INP rewrite_diameter(base.inp, pipe_ids, d, temp.inp); % 3. 运行SWMM run_swmm(temp.inp, temp.rpt, temp.out); % 4. 解析溢流量 flood parse_flooding(temp.rpt); % 5. 计算目标函数 cost calc_cost(d, pipe_data); obj(i,:) [cost, flood]; end % 6. 非支配排序和选择 ... end这笔计算开销在工程上是可接受的。如果后续要把这套流程应用到更大规模的管网建议先把费用最高的SWMM调用部分改成DLL模式再考虑并行计算比较成熟的做法是用MATLAB Parallel Computing Toolbox对种群个体做parfor并行模拟。5. 实例验证与Pareto前沿解析以眉山彭山区为例5.1 研究区管网现状与优化输入研究区是眉山市彭山区旧城西片区范围涉及李密大道、张纲路、彭祖大道等周边地块。这个区域属于典型的老城区管网服役年限长暴雨重现期取值偏低部分管段的设计标准已经无法满足当前的城市排水需求。建模时对研究区汇水区进行了子汇水区划分管网拓扑关系从现状资料提取后录入SWMM。优化前的SWMM模拟结果显示在指定设计暴雨下管网节点总溢流量为22993立方米。论文的优化模型以这个数据为基准目标是通过管径调整把溢流量降下来。但这里有个工程上的细节值得注意优化结果不能简单追求溢流量为零。把溢流量压到零意味着所有管道都要按高重现期标准全面扩容造价会非常夸张。多目标优化的价值就是让决策者看到溢流量每降低一个量级对应的造价成本是多少然后结合片区的重要性选择可接受的方案。5.2 Pareto前沿解读与最佳方案确定模型经过若干代进化后得到的Pareto前沿呈现典型的L形左侧段溢流量大、造价低右侧段溢流量小、造价高。曲线在中间区域出现明显的拐点拐点附近的方案性价比最高。论文最终选定的方案是节点总溢流量为6273立方米时的管径组合对应改造费用约12500万元。优化前后对比数据指标优化前优化后变化节点总溢流量22993 m³6273 m³下降72.7%路面积水量基准值下降约73%显著改善改造费用—约12500万元—这个选型逻辑反映出多目标优化的核心思想不是找唯一最优解而是在Pareto前沿上定位一个“甜点区”。如果片区位置重要或者内涝历史频发可以把选择点右移追加投资换取更低溢流量如果资金有限就取拐点左侧方案牺牲一部分排水能力换造价空间。5.3 复现这套模型的三个实践技巧第一INP文件版本兼容性要先确认。SWMM 5.1和5.2对INP文件里[XSECTIONS]段的格式存在细微差异如果Matlab脚本里做了字符串写入建议在正式优化前先手工改一个INP跑通模拟确认格式无误后再写批量改写逻辑。常见问题包括单位设置CMS与LPS混淆导致流量结果差三个数量级。第二RPT文件解析前先用小案例验证。写一个已知溢流量的简单管网跑完SWMM后检查parse_flooding函数的输出是否与RPT里手工统计的一致。溢流量单位在不同版本的SWMM里显示不一样有的输出的是10⁶升有的直接是立方米不验证直接进优化循环很危险。第三管径序列的粒度直接影响优化质量。标准管径序列如果只给500到2000毫米共8个档位管径过渡可能过粗导致Pareto前沿出现明显的台阶状。如果计算资源允许把300毫米和400毫米的小管也纳入序列前沿的连续性会更好选解时也更灵活。论文末段提到的可靠性分析中指出模型结果对SWMM参数尤其是曼宁糙率和不透水率的取值有一定敏感性。实操时建议在优化完成后对选定的管径组合方案做参数敏感性检验把糙率上下浮动10%重新模拟确认溢流量变化是否在可接受范围内。这一步虽然不改变优化流程本身但能显著提高方案的可信度。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询