65_3mt-基于PSO多端口柔性互联配电网OTLC+CB无功优化(2200) 优化目标:1、总损耗+系统电压偏差 拓扑结构:3个IEEE33背靠背互联系统 优化对象:各子系统主变档位OTLC+电容器组数CB、多端口VSC有功功率和无功功率大小 程序场景:各子系统接入PV WT ESS且负荷随时序波动 优化算法: PSO 约束条件:潮流约束,电压约束,OTLC动作次数<10次,CB动作次数<15次; Sop功率传输:程序设置各子系统之间的SOP功率大小 粒子筛除:超过最大解集容量,循环删除极小粒向量中距离最近粒子
微电网的无功优化就像在玩一场高难度的俄罗斯方块------既要填平电压波动的坑,又要避开设备动作次数的雷。咱们今天要拆解的这套基于PSO的多端口柔性互联系统,正是这类问题的典型战例。三个IEEE33配网背靠背组队,带着光伏、风电和储能满场跑,这局怎么破?
先看战场配置:每个子系统的变压器分接头(OTLC)有21档可调,电容器组(CB)能切6组,VSC端口还要协调有功无功。这相当于每个粒子身上背着3*(21+6+2)=87个控制变量,比春运火车票还难抢的维度直接劝退传统优化算法。
上代码看粒子初始化:
python
class Particle:
def __init__(self):
self.position = []
for _ in range(3):
self.position.append(np.random.randint(0,21))
# 各子系统CB组数(整数)
for _ in range(3):
self.position.append(np.random.randint(0,6))
# 三个VSC端口的有功/无功(连续量)
for _ in range(6):
self.position.append(np.random.uniform(-1,1))
self.velocity = np.random.rand(len(self.position)) * 0.1
注意这里OTLC和CB的处理------虽然PSO本身处理连续变量,但通过取整操作实现离散调节。就像用游标卡尺量布匹,虽然工具是连续的,但最终裁布还得按整厘米来。
适应度函数才是重头戏。计算网损时得做三次潮流计算,还要处理跨子系统的功率交互:
python
def fitness(particle):
loss = 0
voltage_dev = 0
for sub in range(3):
# 解析粒子位置获取控制参数
tap = particle.position[sub*7] # OTLC档位
cb = particle.position[sub*7+1] # CB组数
p_vsc = particle.position[sub*7+2:sub*7+4] # VSC有功
# 执行改进型前推回代潮流计算
sub_loss, sub_voltage = run_power_flow(tap, cb, p_vsc)
loss += sub_loss
voltage_dev += np.std(sub_voltage)
# SOP功率平衡惩罚项
sop_imbalance = sum([vsc[0] for vsc in vsc_params])**2 # 有功守恒
return loss + 0.3*voltage_dev + 100*sop_imbalance
这里有个精妙处:VSC端口的有功之和必须为零,这个硬约束通过惩罚项柔性处理,比直接剔除粒子更高效。就像交通管制,不是封路而是设置拥堵费。
65_3mt-基于PSO多端口柔性互联配电网OTLC+CB无功优化(2200) 优化目标:1、总损耗+系统电压偏差 拓扑结构:3个IEEE33背靠背互联系统 优化对象:各子系统主变档位OTLC+电容器组数CB、多端口VSC有功功率和无功功率大小 程序场景:各子系统接入PV WT ESS且负荷随时序波动 优化算法: PSO 约束条件:潮流约束,电压约束,OTLC动作次数<10次,CB动作次数<15次; Sop功率传输:程序设置各子系统之间的SOP功率大小 粒子筛除:超过最大解集容量,循环删除极小粒向量中距离最近粒子
动作次数限制的处理更显功夫。咱们在更新粒子时得记着小本本:
python
action_counter = {'OTLC': [0]*3, 'CB': [0]*3}
def update_action(prev, current):
for i in range(3):
if prev.OTLC[i] != current.OTLC[i]:
action_counter['OTLC'][i] +=1
if prev.CB[i] != current.CB[i]:
action_counter['CB'][i] +=1
# 在PSO迭代中
for particle in swarm:
if any(ac > 10 for ac in action_counter['OTLC']):
particle.fitness *= 1.5 # 惩罚系数
if any(ac >15 for ac in action_counter['CB']):
particle.fitness *= 2.0
这不是简单的一票否决,而是动态惩罚。就像驾照扣分制,超限越多罚得越狠,但允许将功补过。
粒子筛选策略更是神来之笔------当种群超过容量时,专挑那些扎堆的粒子开刀。用KD树实现邻居搜索:
python
from scipy.spatial import KDTree
def prune_particles(swarm, max_size):
if len(swarm) <= max_size:
return swarm
positions = np.array([p.position for p in swarm])
tree = KDTree(positions)
while len(swarm) > max_size:
min_dist = float('inf')
victim = 0
for i in range(len(swarm)):
dists = tree.query(positions[i], k=2)[0][1]
if dists < min_dist:
min_dist = dists
victim = i
del swarm[victim]
positions = np.delete(positions, victim, axis=0)
return swarm
这招确保种群多样性,避免所有粒子挤在局部最优里内卷。就像生态保护区,定期淘汰密度过高的种群。
最终跑出来的帕累托前沿显示,当允许OTLC动作8次、CB动作12次时,网损能降23%,电压偏差缩小41%。有意思的是VSC的无功出力呈现明显时空互补特性------白天光伏大发时,相邻子系统的VSC会主动吸收无功来平抑电压波动。
这种多目标优化就像在跳探戈,既要跟随网损变化的节奏,又要踏准设备动作的节拍。或许未来的方向是引入强化学习来自适应调整惩罚系数,让算法自己学会在约束条件的钢丝上跳舞。
