ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于Voronoi图的充电站选址定容:MATLAB实现与配电网规划应用

基于Voronoi图的充电站选址定容:MATLAB实现与配电网规划应用 简介面向配电网电动汽车充电站选址定容问题的一款MATLAB实现项目主要基于V图Voronoi图方法将电网结构、充电需求与站址成本等信息综合可视化服务于科研人员、规划工程师及相关专业学生可快速分析最优站址与容量配置。资源共6个文件核心为5个.m脚本和1个位图示例涵盖主程序入口、Voronoi图生成、配电网区域划分、充电站成本评估等功能模块压缩包整体仅104KB结构简明便于直接运行和二次开发。目前已有101人学习浏览对配电网规划主题具备一定参考价值。通过该资源可以系统梳理V图选址的建模思路了解基于MATLAB的充电站服务范围可视化输出流程结合示例图片可直观比对程序运行效果适合用于课程设计、毕业设计或充电站布局预研。1. 为什么用V图做充电站选址而不是直接画圈很多配电网规划项目在确定充电站位置时最常见的做法是以负荷重心为圆心画几个服务半径圈。节点一多、负荷分布一乱圆与圆之间的重叠区和空洞区就会导致充电负荷重复计入或漏掉。V图Voronoi图按“最近距离”把平面划分给各站点每个充电站对应一个凸多边形服务区数学上天然保证不重叠、不遗漏。用 MATLAB 实现后配合 main.m、VoronoiT.m、VorCostCDEV.m、zhiliupf33.m能在同一套数据上完成选址、定容、潮流校验和可视化比单纯画圆更接近工程决策。这套方法适合配电网规划、充电桩布局评估和研究生仿真课题。2. 从Voronoi图到选址定容模型服务范围与成本怎么落地2.1 Voronoi单元的几何含义与充电站服务区Voronoi图又称泰森多边形。给定一组离散站点后平面被划分为若干个凸多边形每个多边形内任意一点到该多边形对应站点的距离不超过到其他任意站点的距离。在电动汽车充电场景里这个几何性质等价于“用户优先去最近的充电站”因此每个站点所辖的Voronoi单元就是它最自然的服务范围。圆形覆盖模型则完全不同两个圆可能相互重叠重叠区域里的负荷归属说不清楚要么被重复计入两个站要么需要额外制定分配规则圆与圆之间也可能出现空隙空隙里的节点没有任何站覆盖。Voronoi单元彼此沿边界邻接既不重叠也不留缝从源头解决了负荷重复统计和服务盲区两个问题这也是它在选址问题上比画圈更受认可的原因。这里的距离不一定等于欧氏距离。在实际配电网规划里我一般先用欧氏距离生成基础V图再把路网距离、变电站供电半径等作为权重项叠加进去。如果想更贴近用户行为可以提前用 Dijkstra 算法算出每个节点到所有候选站点的最短路径距离再按“最小距离”分配节点归属。这样VoronoiT.m 的输入就不再是简单坐标而是一张节点-站点距离矩阵改动不大但方案的说服力会明显提升。2.2 定容目标建设成本、运维成本与负荷覆盖V图解决了“每个站管哪些节点”的问题定容则要根据这些节点上的充电负荷决定“每个站建多大容量”。设节点 j 的充电负荷为 L_j站点 i 的Voronoi单元覆盖的节点集合为 N_i那么该站的需求量 D_i Σ_{j∈N_i} L_j。容量 S_i 一般取 D_i 再乘一个备用系数避免尖峰充电需求把变压器直接顶满。项目里的 VorCostCDEV.m 就是把需求量、容量和电网成本放进同一个目标函数做评估。核心逻辑可以写成下面的计算公式% 目标函数VorCostCDEV.m 的核心部分示意 cost length(S) * Cfix ... % 固定建设成本每个站一份 Cun * sum(S) ... % 可变建设成本按总容量计 Cope * sum(D) ... % 运行维护成本按服务电量计 Cpower * Ploss ... % 网损成本来自潮流计算 lambda * sum(max(0, D - S)); % 容量不足惩罚逻辑说明length(S) * Cfix表示站一旦建起来不管容量多大都要投入场地、配电设施等固定费用它约束优化算法不能无限制增加站点数量Cun * sum(S)表示充电机、变压器扩容成本与容量成正比lambda * sum(max(0, D - S))在需求量超过容量时产生惩罚防止算法为了让成本好看而把容量配得过小。参数说明Cfix 是单站固定建设成本Cun 是单位容量成本Cope 是单位电量运维成本Cpower 是电价lambda 是惩罚因子。这个函数对选址和定容同时敏感改变站点坐标会改变V图划分进而改变 D_i 和 S_i改变容量则直接体现为建设成本和惩罚项的变化。2.3 与覆盖模型相比V图的优势传统最大覆盖模型需要事先给出服务半径 RR 定小了覆盖不全面定大了建设成本虚高。V图不需要人工指定半径单元边界完全由站点布局决定。两个站点距离近它们之间的边界会自动往中间收缩直观表示“这里再建站会造成服务范围重叠”。这种自适应特性非常契合配电网节点稀疏、负荷不均衡的实际情况。对比项最大覆盖模型V图方法服务半径必须预先指定 R自动生成无半径参数负荷归属可能出现重叠或漏覆盖唯一归属无重叠无空洞对站点数量的自适应差R 需反复试算好单元随站点位置自动调整与电网约束接口需要额外判断覆盖关系单元节点、面积和负荷都能直接传给潮流程序当然标准Voronoi图没有容量上限约束。如果某个站点覆盖的负荷远超容量目标函数里的惩罚项会把方案拉回或者改用加权Voronoi图通过调整站点权重改变单元大小让负荷大的站少管一些区域。实际项目中我习惯先用标准V图做初选再在定容阶段用成本曲线修正。3. MATLAB中V图生成与服务区面积计算3.1 项目文件结构与main.m主流程压缩包里的文件不多但功能边界非常清晰。main.m 是整个程序的入口负责读取参数、调用子函数、输出结果和绘图。VoronoiT.m 负责生成V图拓扑VoronoiArea.m 负责把Voronoi单元与配电网节点关联并计算面积和负荷VorCostCDEV.m 负责成本评估zhiliupf33.m 是配电网潮流计算模块4T.bmp 是可视化用的底图。文件作用关键输入关键输出main.m调度主流程节点坐标、负荷、候选站坐标选址定容结果、可视化图VoronoiT.m生成Voronoi图拓扑stationXY, boundary顶点矩阵 V、单元索引 CVoronoiArea.m计算单元面积与节点负荷V, C, nodeXY, demandarea, assignedIdx, loadSumVorCostCDEV.m成本评估S, D, 成本参数, PlosstotalCost, detailzhiliupf33.m配电网潮流校验网架参数、充电站接入负荷节点电压、网损4T.bmp底图图像文件可视化背景我一般先看 main.m它把整条链路串起来加载底图和节点数据把底图像素坐标映射到实际坐标初始化一组候选充电站坐标调用 VoronoiT.m 生成V图再用 VoronoiArea.m 统计各站服务区覆盖的节点和负荷最后调用 VorCostCDEV.m 和 zhiliupf33.m 完成成本和潮流计算。读入 4T.bmp 之后最关键的步骤是坐标映射。底图是像素坐标系配电网节点坐标是地理或平面坐标系两者不一致时Voronoi图会完全错位。常见的做法是取底图上两个已知地物点做一个仿射变换% 底图像素坐标 - 实际坐标main.m 中常见做法 pixel [x1 y1; x2 y2]; % 底图上两个控制点的像素坐标 geo [X1 Y1; X2 Y2]; % 对应的实际平面坐标 tform fitgeotrans(pixel, geo, nonreflectivesimilarity); nodeXY transformPointsForward(tform, nodePixelXY); % 节点实际坐标逻辑说明fitgeotrans根据至少两个控制点求解平移、旋转和等比缩放参数。transformPointsForward把底图上读取的像素点坐标统一变换到实际坐标后续 VoronoiT.m 和 VoronoiArea.m 都在这套坐标下计算。参数说明两个控制点应尽量选在底图四角附近避免外插误差如果没装 Image Processing Toolbox可以手动写线性方程组求解效果相同。3.2 VoronoiT.m从站点坐标生成V图VoronoiT.m 的命名可以理解为 “Voronoi Topology”。它一般基于 MATLAB 内置的 voronoin 函数生成顶点和单元索引再针对配电网区域做边界裁剪。直接调用 voronoin 得到的结果在外围单元会出现 Inf 或 NaN 顶点必须处理。function [V, C] VoronoiT(stationXY, boundary) % stationXY: Mx2 候选站点坐标 % boundary: [xmin xmax ymin ymax] 实际坐标范围 [V, C] voronoin(stationXY); for k 1:length(C) poly V(C{k}, :); % 去掉非有限顶点 poly poly(isfinite(poly(:,1)) isfinite(poly(:,2)), :); % 生成最小矩形边界并求Voronoi单元与边界的交集 boundPoly polyshape([boundary(1) boundary(1) boundary(2) boundary(2)], ... [boundary(3) boundary(4) boundary(4) boundary(3)]); shape polyshape(poly); clipped intersect(shape, boundPoly); Vc{k} clipped.Vertices; end end逻辑说明voronoin的返回值 C 是一个元胞数组每一行是该单元顶点在 V 矩阵中的行号。外层循环把每个单元的顶点取出来删掉 Inf 和 NaN再用polyshape构造多边形与 boundary 矩形求交集从而把无限单元裁剪到可视化区域内。这样做的好处是后续polyarea不会返回 NaN画图时也不会出现延伸到屏幕外的线。参数说明stationXY 必须是 M×2 的 double 矩阵boundary 的四元素顺序是 x 最小值、x 最大值、y 最小值、y 最大值写错会导致裁剪区域错乱。3.3 VoronoiArea.m裁剪与面积计算V图生成后下一步要回答两个问题每个放电服务区覆盖多大面积哪些配电网节点属于这个充电站VoronoiArea.m 同时完成区域测度和负荷统计。function [area, assignedIdx, loadSum] VoronoiArea(Vc, nodeXY, demand) nStation length(Vc); for i 1:nStation poly Vc{i}; area(i) polyarea(poly(:,1), poly(:,2)); in inpolygon(nodeXY(:,1), nodeXY(:,2), poly(:,1), poly(:,2)); assignedIdx{i} find(in); loadSum(i) sum(demand(assignedIdx{i})); end end逻辑说明polyarea计算多边形面积单位与坐标单位一致如果底图映射到经纬度得到的是度²需要换算。inpolygon判断每个配电网节点坐标是否落在当前Voronoi单元内返回逻辑索引find(in)得到节点编号再累加这些节点上的充电负荷。参数说明assignedIdx 是元胞数组每个元素是该站服务的节点编号列表loadSum 是各站覆盖负荷总和直接作为 VorCostCDEV.m 的 D 输入。需要特别注意边界点可能同时被两个单元判定为内部后续应该按距离最近再次归并否则一个负荷会在两个站里重复计算。4. 成本评估与配电网潮流校验选址定容的闭环4.1 VorCostCDEV.m目标函数参数与设置成本函数是方案评估的裁判它必须同时反映投资方视角和电网运行视角。VorCostCDEV.m 接收各站容量 S、各站需求负荷 D 和一套成本参数返回总成本。下面是一个可运行的函数骨架function [totalCost, detail] VorCostCDEV(S, D, params) Cfix params.Cfix; % 单站固定建设成本 Cun params.Cun; % 单位容量成本 Cope params.Cope; % 单位电量运维成本 Cpower params.Cpower; % 电价 lambda params.lambda; % 容量不足惩罚因子 detail.buildCost length(S) * Cfix Cun * sum(S); detail.operCost Cope * sum(D); detail.penalty lambda * sum(max(0, D - S)); totalCost detail.buildCost detail.operCost ... Cpower * params.Ploss detail.penalty; end参数设置是方案敏感性的主要来源。下表给出一组可用于测试系统的初始值实际工程项目要按当地造价和电价换算。参数初始值说明Cfix200万元单站场地、配电设施固定投入Cun1.2万元/kW充电机、变压器扩容成本Cope0.4元/kWh运营维护与人工分摊Cpower0.6元/kWh购电电价lambda50元/kW容量不足惩罚因子gamma0.15容量备用系数在网格搜索中lambda 直接决定算法是“多建站”还是“多扩容”。lambda 设得太小容量不足也不会受到有效惩罚最终方案会在高峰时段过载设得太大算法会盲目扩大容量导致建设成本偏高。我通常会先跑一轮成本曲线观察惩罚项占比再回调节点。4.2 zhiliupf33.m33节点配电网潮流校验V图几何划分最优点但不一定是电网安全可行点。充电站接入配电网后局部负荷增加可能造成末端电压越限因此需要 zhiliupf33.m 这类潮流程序做校验。zhiliupf33.m 通常对应 IEEE 33 节点辐射配电网测试系统采用前推回代法收敛速度快、编程量小。% zhiliupf33.m 调用示例 % Bus: 节点编号、有功、无功、电压幅值 % Branch: 首端、末端、电阻、电抗 [Bus, Branch] case33(); % 载入33节点系统 Bus(:,3) Bus(:,3) stationLoadInject; % 把充电站负荷叠加到对应节点 [Vm, ~, Ploss] zhabf(Bus, Branch); % 前推回代潮流 minVm min(Vm); % 最低节点电压逻辑说明stationLoadInject 是各充电站容量分摊到接入节点后的有功增量。前推回代法从末端节点向根节点推算支路电流再从根节点向末端更新节点电压迭代到两次电压差小于阈值为止。输出 Vm 为各节点电压幅值Ploss 为系统网损Ploss 会传回 VorCostCDEV.m 参与总成本计算。校验时重点看两个指标最低节点电压不低于 0.95 p.u.各支路电流不超过导线载流量。如果V图方案导致某条分支线路电压过低我会优先调整该站容量转移给相邻站或者增加一个候选站而不是直接在原站无限扩容因为末端扩容对电压提升十分有限。4.3 一个可复用的迭代搜索流程完整选址定容不是一次V图就能完成。我习惯把整个流程做成两层结构外层负责生成候选站坐标内层根据V图划分、成本计算和潮流校验返回适应度值。即使不接遗传算法也可以用手动坐标微调完成一轮搜索。for iter 1:20 stationXY pop(iter).coordinate; % 当前候选站坐标 [V, C] VoronoiT(stationXY, bd); % 生成V图 [~, nodeIdx, D] VoronoiArea(C, nodeXY, demand); % 负荷统计 S ceil((1 gamma) .* D); % 按备用系数定容 Params.Ploss 0; % 暂定网损为0 [cost, detail] VorCostCDEV(S, D, Params); [Vm, Ploss] zhiliupf33(Bus, Branch, stationLoadInject); fitness(iter) cost 1e4 * sum(Vm 0.95); % 电压越限强惩罚 end这份流程里S 从 D 直接推算避免重复寻优固定建设成本会促使算法控制站点数量电压惩罚项会淘汰导致电压越限的方案。跑通之后把pop换成遗传算法种群就能把同样的适应度函数接入优化工具箱候选站数量从 3 个扩到 8 个也不会增加代码复杂度。5. 可视化验证与调参边界效应、坐标对齐和容量搜索5.1 可视化输出的四个图层项目用 4T.bmp 做底图目标是把V图结果直接叠加在地图上。我一般会绘制四层信息底图、节点负荷散点、Voronoi 边界、站址容量。容量可以用不同大小的圈表示让评审一眼看出哪个站投运压力最大。figure; imagesc(img); hold on; axis image; % 底图 scatter(nodeXY(:,1), nodeXY(:,2), 20, demand, filled); % 负荷散点 % 画V图边界 for i 1:length(V) plot(V{i}(:,1), V{i}(:,2), k-, LineWidth, 1.2); end scatter(stationXY(:,1), stationXY(:,2), S/max(S)*300, r, filled);负荷值可以用demand作为颜色映射配合 colorbar 能直接看出高负荷区被哪个站覆盖。V图边界线不要用太粗的线条否则会遮住底图上的道路和节点编号。5.2 常见坑与参数调整可视化过程中最常见的问题是面积出现 NaN、节点归属为空、电压越限集中在末端。下表是踩过坑之后的处理对照。现象原因处理面积出现 NaNVoronoi 顶点包含 Inf裁剪后再调用 polyarea节点没有被任何单元包含节点坐标超出 boundary 范围扩大 boundary 或检查坐标映射末端电压越限末端站覆盖负荷过大增加候选站或限制末端站容量容量搜索震荡lambda 过小提高 lambda 或缩小搜索步长5.3 一个验证思路通过费用曲线确定容量假设站点坐标已经固定要把每个站的容量从 80% 到 150% 按步长扫描每步调用一次 VorCostCDEV.m绘制总成本与容量倍数的关系曲线。曲线最低点对应经济最优容量拐点则说明再增加容量边际收益已经开始下降。把多个候选方案的费用曲线叠在同一张图里未做智能优化也能比较出哪个站址组合更好。这个思路把成本函数从“评估器”变成“寻优器”是复用到其他配电网规划项目里最直接的一步。本文还有配套的精品资源点击获取
返回列表