拓冰建站拓冰建站
首页 / 资讯中心 / 正文

改进磷虾群算法在配电网三相时序潮流多目标优化中的应用

配电网三相时序潮流加多目标优化这个方向在当下新型配电系统研究里算是相当热门的一个切入点。尤其当接入的光伏、风电、储能越来越多电网不再是一个简单的单向送电网络而是变成了多电源、多时段、多目标耦合的复杂系统。传统的单时刻潮流计算和单目标优化已经很难满足实际工程分析的需求。这篇博文就围绕一个典型的项目展开基于改进磷虾群算法的配电网三相时序潮流多目标优化并用matlab实现。我会从问题建模、算法原理、优化策略、代码结构到踩坑记录把整个实现思路完整拆开讲一遍。文章面向正在做配电网优化方向课题的研究生、刚接触智能优化算法的工程师以及想系统了解多目标时序潮流计算流程的读者力求讲清楚每个关键步骤的来龙去脉。1. 配电网三相时序潮流多目标优化问题到底怎么拆1.1 为什么必须做“时序”潮流而不是单一时刻很多刚开始接触配电网优化的人会有一个疑问传统的潮流计算都是针对某个固定运行状态比如最大负荷时刻或者最小负荷时刻取一个典型工况去分析。这在过去电网结构简单、负荷变化规律的年代基本够用但现在不行了。原因在于分布式电源的出力和负荷需求都是随时间变化的。光伏出力白天高、晚上为零风电出力随风速波动电动汽车充电负荷集中在傍晚到夜间储能则在峰谷电价引导下频繁充放电。只算单个时刻的潮流根本抓不住这些设备一天之内的动态耦合关系。时序潮流的核心思路是把一个完整周期通常取24小时按照一定步长离散成多个时段每个时段分别建立负荷模型和分布式电源出力模型然后依次计算各时段的潮流状态并且把时段之间的时序约束也考虑进去。比如储能SOC的连续性——前一时段充了多少电会直接影响后一时段的可用容量再比如变压器有载调压分接头的动作次数限制——今天总共只能动作多少次这个约束跨越多个时段单时刻模型根本表达不了。这个项目里采用的“三相时序潮流”对配电系统而言尤其重要。中低压配电网普遍存在三相不平衡问题单相负荷接入、单相分布式电源接入、线路参数不对称都会导致三相电压和电流的不平衡。用等效单相模型去算三相不平衡带来的中性线电流、变压器额外损耗、末端电压偏移这些问题都会被掩盖。所以要做准确的配电网分析必须建立三相模型把A、B、C三相分别建模、分别计算。1.2 三相不平衡带来的计算复杂度提升三相建模的代价是计算复杂度成倍上升。以配电网常用的前推回代法为例单相模型中每个节点只需要处理一个复数电压、一个复数功率而三相模型中每个节点要处理三个复数电压、三个复数功率并且支路阻抗要用3×3的相阻抗矩阵来表示。相阻抗矩阵里不仅有自阻抗还有相间互阻抗。架空线路和电缆线路的相间耦合程度不同接地方式不同对应的矩阵结构和数值也完全不同。这一下就把潮流计算的变量规模扩大了三倍而且节点编号和支路编号都需要按照三相的结构重新编排。很多刚上手的人在这里会踩一个大坑直接用Matlab写三相潮流时把三相简单当成三个独立的单相系统去算忽略相间耦合出来的结果根本不对。尤其是低压配电网相间互感对零序和负序分量的影响不可忽略必须把三相节点电压作为一组变量整体参与迭代计算。1.3 多目标优化到底在优化什么配电网时序潮流多目标优化典型的优化目标包括下面几个维度。网络损耗最小化这是最基础的目标。三相不平衡会增加线路损耗和变压器损耗分布式电源接入位置和容量安排得当可以在一定程度上降低网损但如果安排不合理反而可能造成潮流倒送、局部过载网损不降反升。电压偏移最小化分布式电源接入后馈线沿线的电压分布会发生明显变化。光伏大发的中午时段可能出现局部电压越上限的风险而负荷高峰的傍晚时段又可能出现末端电压越下限的风险。电压偏移目标就是要让全天各时段、各节点的电压都尽可能靠近额定值。分布式电源消纳率最大化简单说就是尽量让光伏、风电发出的电被就地消纳减少弃光弃风。这涉及到分布式电源的出力调度和储能充放电策略的配合。开关操作次数最少化配电网重构中联络开关和分段开关的投切次数直接影响设备寿命和运行可靠性。频繁操作代价很高这个目标在时序优化里尤其重要因为它天然地跨越多个时段。这些目标之间往往存在冲突。比如说为了最大化消纳光伏可能要让储能集中在中午充电但这会推高午间负荷增加网损为了降低网损又可能要牺牲一部分电压质量。多目标优化的价值就在于它不是找一个“唯一最优解”而是找出一组Pareto最优解集让决策者根据实际偏好从多个可行方案里挑选。2. 磷虾群算法与它的改进从生物觅食到组合寻优2.1 磷虾群算法的生物学隐喻和基本流程磷虾群算法Krill Herd, KH是Gandomi和Alavi在2012年提出的一种元启发式优化算法它模拟的是南极磷虾在海洋中群聚觅食的行为。你可能觉得磷虾这种生物太简单了但它的群聚行为背后有一套非常清晰的机制每只磷虾个体的运动由三个分量共同决定。第一个分量是诱导运动即个体受到群体中其他磷虾影响而产生的移动。磷虾会感知周围同伴的密度和方向倾向于向种群密集的区域靠近。这个机制相当于利用了群体的信息共享让搜索不盲目。第二个分量是觅食运动即磷虾向食物浓度高的方向移动。每只磷虾都知道当前位置的食物浓度梯度会沿着梯度方向前进这相当于利用了解空间的局部信息。第三个分量是随机扩散即在运动过程中加入一定的随机扰动防止群体过早陷入局部最优。这个机制保证了算法的全局探索能力。算法开始时在解空间内随机初始化一群磷虾个体每个个体对应决策变量的一组取值。迭代过程中每只磷虾根据上述三个运动分量的加权组合更新自己的位置。随着迭代进行群体逐渐向高质量解的区域聚集最终收敛到最优解附近。在标准的KH算法里位置更新公式可以写成[ X_i(t1) X_i(t) \Delta t \cdot \left( N_i F_i D_i \right) ]其中 (N_i) 是诱导运动矢量(F_i) 是觅食运动矢量(D_i) 是随机扩散项(\Delta t) 是位置更新的步长缩放因子。整个迭代过程维持到满足终止条件为止。这个算法相比粒子群PSO、遗传算法GA等经典算法一个突出的特点是三个运动项的物理意义明确参数调整空间较大在多峰函数优化问题上的表现往往不错。2.2 原版算法在配电网多目标场景下的三个短板不过直接把标准KH算法用到配电网时序潮流多目标优化上效果并不理想。我在实际测试中总结出三个明显的短板。第一个短板是收敛速度偏慢。标准KH算法的步长因子和搜索方向在整个迭代过程中基本保持不变前期探索充分但后期精细化搜索的能力不足。配电网优化问题的决策变量多、约束条件复杂比如控制变量可能包括储能充放电功率、分布式电源无功出力、联络开关状态等随便一个24时段优化问题就是几十维甚至上百维的搜索空间标准KH在后期很容易出现收敛缓慢的情况。第二个短板是容易陷入局部最优。配电网潮流目标函数通常是非凸、非线性的而且目标函数往往不够光滑有很多局部极值点。标准KH算法的随机扩散项幅度固定搜索越到后期群体越集中跳出局部最优的能力越弱。我做过对比实验在33节点系统上跑标准KH10次有4次收敛到的解明显偏离已知的较优区间。第三个短板是对多目标问题的适应性不足。标准KH算法本质上是一个单目标优化器直接套用到多目标场景时需要引入非支配排序和拥挤距离机制但如果只是简单叠加很容易导致种群多样性流失。特别在目标数量较多时种群会快速聚集到某个目标占优的区域丢掉其他目标的均衡解。2.3 我采用的三种改进策略针对上面的问题这个项目里采用了三种改进策略实测下来效果比较明显。改进一自适应惯性权重与步长调节。在迭代初期希望磷虾个体有较强的全局探索能力步长大一些在迭代后期希望搜索集中在优质解附近步长小一些。所以引入了一个随迭代进度衰减的惯性权重系数同时根据种群当前最优解的变化情况动态调节步长。如果连续多代最优解没有改善就适当增大步长帮助跳出局部区域如果最优解持续改善就减小步长加强局部精搜索。改进二引入差分进化DE的交叉变异机制。为了让种群保持多样性在每次磷虾位置更新之后增加一个交叉变异操作。具体做法是对每个个体按照一定概率从种群中随机选取另外两个个体做差分加权生成试验个体再与当前个体进行比较保留更优的一个。这个操作借鉴了DE算法的思想可以显著增强算法的全局搜索能力避免早熟收敛。我对比过加了交叉变异之后同样的迭代代数下解的质量能提升10%到20%。改进三非支配排序加上拥挤距离构建Pareto前沿。在多目标处理上采用NSGA-II中成熟的非支配排序框架和磷虾群算法的种群更新机制结合。每次迭代后把父代和子代合并先做快速非支配排序把个体划分到不同的Pareto前沿层级在同一层级内用拥挤距离来衡量个体的分布密度优先保留拥挤距离大的个体保证Pareto前沿的均匀性。这样做的好处是同时兼顾了收敛性和分布性。这套组合改进策略在IEEE 33节点系统和IEEE 123节点系统上都做了验证相比标准KH算法和未改进的NSGA-II在收敛速度和解集覆盖度上都有明显提升。3. 三相时序潮流计算与配电网建模的实操细节3.1 三相节点模型和支路模型怎么建做三相潮流之前建模是最基础也是最重要的一步。配电网的三相模型包括节点模型、支路模型、负荷模型和分布式电源模型。节点模型在Matlab里每个节点的三相电压用一个3×1的复数向量表示比如节点i的电压是 ([V_a, V_b, V_c]^T)。对于中性点接地系统还需要考虑中性点电压的约束。在低压配电网常见的三相四线制系统中通常采用四线制模型但简化分析时也可以忽略中性线阻抗按三相三线制加上接地处理。具体的建模深度取决于具体研究目标如果主要关心相电压和相功率分布三相三线模型配合合理的接地等效精度已经足够。支路模型每条支路用3×3的相阻抗矩阵 (Z_{abc}) 表示。这个矩阵最核心的计算方法是采用Carson方程和Kron降阶。先根据导线的几何位置、直径、电阻率计算包括大地回流路径的原始阻抗矩阵然后再通过Kron约简把大地导线消去得到最终的相阻抗矩阵。这个推导过程比较繁琐但在Matlab里可以写成函数输入导线参数和几何排布输出相阻抗矩阵方便重复调用。在实际代码里我习惯把IEEE标准测试系统的数据整理成结构体数组每个元素包含线路编号、首端节点、末端节点和相阻抗矩阵。这样在后续前推回代计算中只需要循环遍历支路数组就能完成整个网络的潮流迭代。3.2 前推回代法如何扩展到三相场景前推回代法是配电网潮流计算的主流方法它利用了配电网辐射状结构的特点计算效率高收敛性好。三相扩展后的基本思路是从末端节点向首端节点回推支路电流或功率再从首端节点向末端节点前推节点电压反复迭代直到收敛。具体步骤如下初始化所有节点三相电压为额定电压。根据负荷电压特性计算每个节点的注入电流或功率。回推过程从馈线末端开始根据支路末端电流累加得到支路首端电流逐层向电源节点推进。这一阶段计算的是各支路电流的分布。前推过程从电源节点开始根据支路首端电压和支路电流利用相阻抗矩阵计算支路末端电压逐层向末端推进。这一阶段更新的是各节点电压。检查两次迭代之间的电压偏差是否满足收敛条件通常取电压幅值偏差小于1e-6 p.u.。如果不满足返回步骤2继续迭代。这里有一个细节值得注意在三相场景中支路电流和电压都是三维复数向量相间耦合体现在相阻抗矩阵的非对角元素上。在回推过程中每一段支路的电压降落都要同时考虑三相电流的相互影响不能把三相分开独立计算否则就失去了三相建模的意义。另外对于含分布式电源的节点需要在注入电流中增加电源的贡献项。光伏和储能通常通过逆变器并网可以建模为PQ节点或者PV节点。PQ节点比较简单给定额定功率即可PV节点则需要考虑无功功率的调节能力在潮流迭代中要增加无功修正环节。3.3 时序耦合约束的处理方法时序潮流的难点在于各个时段之间不是孤立的。我总结下来至少有下面三类跨时段约束需要在优化过程中处理。储能SOC连续性约束这是最典型的时序耦合约束。储能设备在t时段的SOC等于t-1时段末的SOC加上本时段的充电量或者减去放电量。优化变量里包含储能充放电功率那么这些功率之间就通过SOC公式耦合在一起。处理办法是在目标函数和约束条件中显式引入SOC状态方程让优化算法在搜索时直接面对完整的时序变量集合。设备动作次数约束比如有载调压变压器分接头、并联电容器组的投切次数在一天之内不能超过某个上限。这个约束的处理方式是增加一个累计动作次数计数器把全天各时段的动作次数之和纳入约束条件。电压越限的跨时段累积不是每个时段的电压单独满足上下限就够了还要考虑某些节点的电压在全天范围内的偏移累计量。这个可以通过建立全天电压偏移指数来实现本质上这是一个时序累积指标。在Matlab实现中我把24时段的决策变量打包成一个大的向量每个时段是一个子块。这样潮流计算函数可以按顺序对每个时段做三相潮流计算但目标函数计算和约束检查都要从整个时间窗口的角度去评价。优化算法操作的对象始终是完整解向量而不是单时段的解这样才能保证时序约束得到满足。3.4 分布式电源与负荷的时序特性设置时序特性数据的准备直接影响优化结果的可靠性。光伏出力曲线典型的光伏出力曲线呈钟形中午12点到14点达到峰值早晚为零。实际项目中可以用标准气象年的太阳辐照度数据按小时平均得到24点出力曲线再乘以光伏装机容量得到各时段出力上限。如果考虑云层遮挡的随机性可以在基础曲线上叠加一定的扰动但这会增加优化问题的随机性需要结合鲁棒优化或随机规划的方法来处理。风电出力曲线风速波动性更大典型日曲线没有光伏那么规律通常采用Weibull分布来模拟风速的概率特性再通过风力机的功率特性曲线转换成出力。在时序优化里如果以确定性场景为主就取某一典型日的实测风速数据作为输入。负荷曲线工业和居民负荷的日特性差异很大。居民负荷通常在早晚两个高峰工业负荷相对平稳。做研究时可以直接采用IEEE RTS系统提供的典型日负荷曲线按比例缩放到测试系统的总负荷水平。储能模型储能的充放电效率、容量上下限、SOC初值和终值都要提前设定。一般设定SOC初值为50%一天运行结束后SOC回到50%附近这样储能具有日循环特性方便对比不同调度策略的效果。4. matlab实现从算法框架到代码落地的完整解析4.1 主程序的整体架构整个Matlab程序我设计成模块化结构包含以下几个核心模块主脚本main.m负责全局参数设置、数据读取、调用优化算法、输出结果。配电网数据模块case33.m / case123.m定义测试系统的节点、支路、负荷、分布式电源和储能参数。三相潮流计算模块threePhasePowerFlow.m输入网络参数和各时段注入功率输出各时段三相电压、支路电流、网损等结果。目标函数模块objectiveFunction.m基于潮流结果计算网损、电压偏移、DG消纳率等多个目标值。改进磷虾群算法模块modifiedKH.m包含种群初始化、三个运动分量更新、差分交叉变异、非支配排序、拥挤距离计算和档案维护。结果输出模块plotResults.m绘制Pareto前沿、电压分布曲线、各时段网损曲线、SOC变化曲线等。主程序的关键参数设置可以参考下面的表格参数取值说明时段数24步长1小时种群规模100磷虾个体数量最大迭代次数200终止条件之一磷虾诱导速度常数0.5控制诱导运动权重觅食速度常数0.3控制觅食运动权重最大扩散速度0.005控制随机扩散幅度交叉概率0.8DE交叉变异概率变异概率0.1差分变异缩放因子基础值档案容量50Pareto解集的最大容量我的经验是不需要盲目追求过大的种群规模100个个体配合200代迭代在33节点系统上大约几分钟就能算出不错的结果。如果算例是123节点甚至更大规模可以适当增加到150到200个个体。4.2 改进磷虾群算法的程序逻辑片段这里给出改进磷虾群算法的核心迭代框架用伪代码风格展示方便理解整体流程。% 初始化种群 population initializePopulation(N, dim, lb, ub); % 迭代主循环 for gen 1 : maxGen % 计算每个个体的运动分量 for i 1 : N % 1. 诱导运动 neighborEffect computeInducedMotion(population, i); % 2. 觅食运动 foodAttraction computeForagingMotion(population, i, bestFood); % 3. 随机扩散 randomDiffusion computeRandomDiffusion(gen, maxGen); % 根据改进的自适应步长更新位置 deltaT adaptiveStep(gen, maxGen, bestFitnessHistory); newPos population(i).position deltaT * ... (neighborEffect foodAttraction randomDiffusion); % 边界处理 newPos boundCheck(newPos, lb, ub); % 计算新位置的潮流与目标函数 [f1, f2, f3] objectiveFunction(newPos); offspring(i) struct(position, newPos, objective, [f1, f2, f3]); end % 差分进化交叉变异 offspring differentialEvolution(offspring, population, F, CR); % 父代与子代合并非支配排序 combined [population, offspring]; [fronts, crowding] nonDominatedSort(combined); % 环境选择按非支配层级和拥挤距离选择下一代 population environmentalSelection(combined, fronts, crowding, N); % 更新外部档案 archive updateArchive(archive, population, archiveSize); end4.3 三相潮流计算函数的关键实现三相前推回代的核心代码关键是处理好节点编号映射和相阻抗矩阵的存储。function [V, branchCurrent, loss] threePhasePowerFlow(network, loadProfile) % network: 配电网结构体 % loadProfile: 各节点三相注入功率 nNode network.numNodes; V ones(3, nNode); % 三相电压初始化为额定值 for iter 1 : 50 V_old V; % 计算节点注入电流 Iinj zeros(3, nNode); for k 1 : nNode s loadProfile(:, k) ./ 1000; % 转成标幺值 Iinj(:, k) conj(s ./ V(:, k)); end % 回推过程从末端向根节点推进 Ibranch zeros(3, network.numBranch); branchOrder network.topologicalOrder; % 按拓扑排序的支路序列 for b branchOrder(end : -1 : 1) nodeEnd network.branch(b).endNode; nodeStart network.branch(b).startNode; % 末端节点所有下级支路电流累加再加上本节点注入电流 aggregateCurrent Iinj(:, nodeEnd); % 找到所有以nodeEnd为首端的下级支路 childIdx find([network.branch.startNode] nodeEnd); for c childIdx aggregateCurrent aggregateCurrent Ibranch(:, c); end Ibranch(:, b) aggregateCurrent; end % 前推过程从根节点向末端推进 for b branchOrder(1 : end) nodeStart network.branch(b).startNode; nodeEnd network.branch(b).endNode; Zabc network.branch(b).impedanceMatrix; V(:, nodeEnd) V(:, nodeStart) - Zabc * Ibranch(:, b); end % 判断收敛 if max(abs(abs(V) - abs(V_old))) 1e-6 break; end end % 计算线路损耗 loss computeLineLoss(network, V, Ibranch); end这段代码在Matlab里跑起来效率不错但有一个地方需要特别注意拓扑排序不能遗漏。前推回代法要求严格按照从根节点到末端节点的顺序递推所以在主程序初始化阶段需要对配电网结构做一次拓扑遍历生成节点和支路的顺序索引。如果网络结构复杂比如带有联络开关的闭环结构需要先做解环处理把网络转成辐射状才能使用前推回代法。4.4 目标函数的定义与计算多目标优化中目标函数的质量直接决定了优化效果。我在项目中定义了三个目标函数。第一个目标是全天总网损最小化公式为[ f_1 \sum_{t1}^{24} P_{loss}^{(t)} ]其中 (P_{loss}^{(t)}) 是第t时段三相总线路损耗由潮流计算结果直接得到。第二个目标是全天电压偏移最小化采用均方根误差形式[ f_2 \sqrt{\frac{1}{24 \times N} \sum_{t1}^{24} \sum_{i1}^{N} \left(1 - \min(|V_{i,a}^{(t)}|, |V_{i,b}^{(t)}|, |V_{i,c}^{(t)}|)\right)^2} ]这里取三相电压的最小值作为评判依据是因为三相不平衡时只要有一相电压越限整个节点就处于不合格状态。第三个目标是分布式电源消纳率最大化等价于弃光弃风量最小化[ f_3 \frac{\sum_{t1}^{24} \sum_{g \in G} P_{actual}^{(t,g)}}{\sum_{t1}^{24} \sum_{g \in G} P_{max}^{(t,g)}} ](P_{actual}) 是实际消纳的有功功率(P_{max}) 是DG在t时段的最大可用出力。在Matlab中这三个目标的计算都集成在objectiveFunction.m里输入一个解向量首先通过解码得到储能、DG无功、开关状态等控制变量的取值然后调用三相潮流函数计算全天各时段结果最后整理成目标函数向量返回。这个函数的执行效率很关键因为优化算法每次迭代要调用几百次所以要尽量减少重复计算比如把线路参数、节点编号这些不变量预先算好并缓存。4.5 结果可视化与导出优化运行结束后结果的呈现方式也很重要。我通常会输出四类图表Pareto前沿散点图三个目标函数两两组合绘制散点图或者用三维散点展示整个解集的分布直观看出目标之间的权衡关系。最佳折中解的24时段电压分布图把每个时段的各节点电压三相分别或取最小相绘制成三维曲面图横轴是节点编号纵轴是时段颜色表示电压幅值。这类图非常直观一眼就能看出电压偏低的时段和节点位置。储能SOC变化曲线展示储能一天内的充放电策略检查SOC是否在上下限之内末值是否回到初始值附近。各时段网损柱状图对比优化前后的全天网损变化趋势量化优化效果。Matlab的绘图命令比较成熟直接使用plot3、surf、scatter等函数即可记得在输出前设置好坐标轴标签和图例图片质量适合直接放在论文里使用。5. 常见问题与排查技巧实录5.1 三相潮流不收敛这个问题出现频率最高。我的排查经验是先缩小问题的范围把三相模型退化为单相模型试试如果单相可以收敛而三相不收敛重点关注相阻抗矩阵的数值是否正确。相间互阻抗数值过大或过小都会影响迭代稳定性。另外节点注入电流的计算公式里存在除法运算如果某个节点的电压幅值在迭代过程中逼近零会导致电流趋于无穷大计算崩溃。这种情况通常发生在完全空载或者孤立节点上检查网络的拓扑连通性确保所有节点都能通过支路连接到电源节点。还有一个容易忽略的问题是负荷模型——如果负荷功率和电压相关恒阻抗、恒电流混合模型在潮流迭代过程中需要根据当前电压更新负荷功率这个更新频率会影响收敛性。建议先用恒功率负荷跑通流程再逐步加入电压静态特性。5.2 粒子磷虾位置越界导致目标函数报错优化过程中新生成的位置可能超出决策变量的取值范围比如储能充电功率变成了负值、开关状态解码出了整数3而定义只有0和1。这类问题通过边界检查可以解决但边界处理策略有两种一种是简单截断把超出边界的值拉回到边界上另一种是反射处理把超出边界的值按边界镜像反射回解空间内。对于连续变量反射处理通常效果更好对于离散变量比如开关状态直接四舍五入到最近的合法值即可。我遇到过一种隐蔽的情况决策变量本身在合法范围内但解码之后计算出的潮流不收敛导致目标函数返回无穷大。比如储能SOC初值和末值约束设置不当导致全天能量守恒无法满足潮流矩阵奇异。这种问题光靠边界检查解决不了必须在解码环节增加物理可行性校验把明显不可行的解直接淘汰或者给予惩罚。5.3 算法早熟Pareto前沿覆盖度差如果优化跑了几轮之后发现所有个体都聚在一个很小的区域Pareto前沿只有寥寥几个点大概率是早熟收敛了。这种情况的调试方向有几个。先检查非支配排序和拥挤距离的实现是否正确。这是最容易出错的地方。非支配排序的层级划分不能有遗漏拥挤距离要按每个目标维度分别计算然后求和而且边界个体的拥挤距离要设为无穷大以保证Pareto前沿两端点能保留下来。然后检查档案更新策略。外部档案维护时如果发现新解支配了档案中的解要移除被支配的解如果档案已满但新解和档案里的解互不支配则根据拥挤距离选择替换最拥挤区域的解。如果这一步实现得过松档案会被大量相似解占据多样性就会丢失。最后还可以调整参数。把差分变异的交叉概率调高一点或者把随机扩散的最大速度在迭代后半段适度提升都有助于保持种群活力。5.4 计算时间太长性能优化怎么做时序潮流的计算量本身就大24个时段每个时段都要做一次三相潮流而优化算法一次迭代要对100个个体做完整计算整体计算量是非常可观的。如果网络规模再大一些单次仿真可能长达几十分钟甚至几小时。我的优化思路是第一给潮流计算函数做预分配所有中间变量在循环前就用zeros或ones预分配好内存避免循环里动态扩展数组。Matlab的数组扩容开销很大这一条能带来明显提速。第二把不随解向量变化的量提取到循环外。比如网络拓扑结构、相阻抗矩阵、基态负荷数据等在优化迭代中是不变的不需要重复读取和计算。把它们定义为全局常量或者作为参数传递能省下大量时间。第三考虑并行化。Matlab的Parallel Computing Toolbox可以支持parfor并行计算种群中每个个体的目标函数计算是相互独立的天然适合并行。我实测过四核并行的情况下计算速度能提升两到三倍。如果你的机器配置允许这是性价比最高的加速手段。当然使用parfor时要注意循环内不能有共享变量依赖所有变量要按循环索引独立传递。5.5 结果与文献对不上这是一个比较尴尬但常见的情况用同一个测试系统算出来的结果和已发表文献里的结果不一致。先不用急着怀疑算法不行仔细比对下面几个环节负荷基准值是否一致。不同文献用的基准容量可能不同有些案例把总负荷标成100kVA有些标成1MVA结果数值差一个量级很正常的。分布式电源接入位置和容量是否一致。同一个33节点系统DG接入在节点18和节点33效果完全不同。储能初始SOC和效率参数是否一致。不同的充放电效率会造成不同时段的最优策略差异。目标函数的定义细节是否一致。比如电压偏移目标中是用最大偏差还是均方根误差是取三相最小相还是平均值这些细节都会影响最终数值。建议在复现任何文献结果之前先把对方的参数定义一项一项列出来和自己的程序逐一比对。很多时候差异并不来自算法而是来自建模细节。6. 个人经验总结与可扩展方向整个项目做下来我最想强调的一点是智能优化算法的效果好不好七分在建模三分在算法。很多初学者把精力全花在改进搜索策略上但配电网三相时序潮流多目标优化的真正难点往往在于把物理模型建准、把约束条件列全、把目标函数定义清楚。模型如果粗糙再花哨的算法也救不回来。反过来只要模型和约束合理即便用标准算法也能得到可用的解改进算法只是锦上添花。这个项目后续的扩展方向不少。比如可以引入不确定性规划把光伏出力和负荷的随机波动建模为概率场景用机会约束规划或者鲁棒优化来求解也可以把重构和调度联合优化在时序优化的同时让网络拓扑也随运行状态动态调整不过这会让问题复杂度再上一个台阶对算法性能的要求也更高。再比如结合人工智能代理模型用神经网络学习潮流计算的输入输出映射替代部分重复的潮流计算从根上缓解计算速度的问题。最后给你一个实用的建议跑这类优化程序时尽量在代码里加一个“断点续算”的机制也就是每次迭代后把种群状态保存到mat文件中。因为配电网时序多目标优化的计算时间往往很长中途程序崩溃或者电脑重启如果没有任何存档几个小时的计算就白费了。这个习惯帮我省下了很多重复劳动。如果大家在实现过程中遇到其他问题欢迎在评论区留言交流。我自己踩过的坑、调试过的Bug一定毫无保留地分享出来。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门