简介面向电力系统稳定性分析与控制方向的研究人员和工程师这份PDF文档系统研究了基于人工鱼群算法AFSA的电力系统稳定器PSS参数优化问题针对多机系统中低频振荡抑制与小扰动稳定性提升给出了完整技术路线。文献刊于《郑州大学学报工学版》2013年第34卷第5期由郑州大学学者撰写提出将所有PSS参数配置统一为优化问题以全部机电模式的最小阻尼比最大化为目标并采用基于K阵等值法设计的参数作为初始种群基准。全文共1个PDF文件压缩包仅357KB内容涵盖PSS模型、目标函数构造、AFSA算法在步长、视野上的改进以及变异机制的引入并通过MATLAB仿真验证优化后的动态阻尼性能。已有98人学习下载。读者可从中系统了解智能算法在电力系统参数优化中的典型应用范式包括算法改进思路、仿真程序设计要点与效果评估方法对相关课题研究、论文撰写或工程实践均有直接参考价值。1. 人工鱼群算法这几年的热度恰好落在PSS参数整定的痛点上人工鱼群算法在电力系统稳定器参数优化里被反复提及不是因为它比粒子群更新而是它在低维连续参数空间里展现出的“逃逸局部最优”能力恰好适合PSS这类变量不多、但约束相互耦合的整定任务。低频振荡的阻尼问题本质上是要在增益不至于过大的前提下把振荡特征值往负实轴方向推得更远。相位补偿法在单一运行点可靠系统重载或N-1方式一换就会失配。把启发式算法引入参数整定常见做法是把超前滞后时间常数和增益放进一个评价函数让算法自行寻找折中方案。接下来这篇文章围绕人工鱼群算法和PSS参数优化的完整落地路径展开偏重能直接改写的数学建模、代码与参数调整经验适合做小信号稳定性分析或控制器参数设计的工程师。2. PSS参数优化先过数学模型这一关把整定目标变成算法能懂的数值2.1 明确要优化哪几个PSS参数以及它们各自的物理约束电力系统稳定器的经典结构是增益环节、隔直环节和两级超前滞后补偿串联。传递函数写为G(s) K * (sTw / (1 sTw)) * ((1 sT1) / (1 sT2)) * ((1 sT3) / (1 sT4))其中K是稳定器增益Tw是隔直时间常数T1/T2和T3/T4是相位补偿配对的超前滞后参数。工程上Tw通常固定在2到10秒之间因为它的作用是滤掉低频漂移不会参与振荡频段的相位补偿。T2和T4一般也不直接参与搜索而是先取经验值比如0.03到0.08秒。这样一来真正交给人工鱼群算法搜索的变量就收缩为K、T1、T3三个主参数必要时再把T2、T4放开成五维问题。降维不是偷懒是为了让鱼群在有限的迭代次数内把搜索分辨率集中在影响最大的参数上。参数典型物理含义经验约束范围K附加阻尼信号的增益2 ~ 50T1第一级超前时间常数0.05 ~ 2.5 sT2第一级滞后时间常数0.02 ~ 0.3 sT3第二级超前时间常数0.05 ~ 2.5 sT4第二级滞后时间常数0.02 ~ 0.3 s这个范围并不是硬性边界而是从工程可调性出发的推荐区间。超出上界时PSS输出容易饱和低于下界时超前补偿近乎失效所以人工鱼群算法里通常用clip操作把每个个体拉回边界内部。2.2 从特征值阻尼比推导适应度函数PSS参数优化最直接的评价方式是小信号稳定性分析。把发电机、励磁系统、网络和PSS统一写成状态空间形式dx/dt A xA矩阵的特征值决定了系统的振荡模式。对于一对共轭特征值λ σ ± jω阻尼比的计算公式是ζ -σ / sqrt(σ² ω²)阻尼比越大振荡衰减越快。PSS参数优化的目标就是把机电振荡模式对应的阻尼比尽量抬高。适应度函数一般取负的最小阻尼比因为人工鱼群算法按数值越小越优的方向搜索import numpy as np def calc_min_damping(A): eigvals np.linalg.eigvals(A) dampings [] for lam in eigvals: if np.abs(lam.real) 1e-3: continue # 只关心振荡模式虚部太小说明不是我们要补偿的机电模态 if np.abs(lam.imag) 1e-3: continue zeta -lam.real / np.abs(lam) dampings.append(zeta) return min(dampings) if dampings else 1.0这段代码先求状态矩阵全部特征值再筛掉虚部接近零的非振荡模式最后返回阻尼比最小的一项。实际工程里特征是复数域上的一对共轭取min时自然会把最弱模态挑出来正好对应系统最需要PSS补偿的地方。2.3 多运行方式下如何合并成一个适应度值单一运行点下搜出的最优PSS参数换到重载方式下可能反而恶化。常见的处理方式是构造一个多工况评价集把轻载、额定、重载以及某条联络线检修方式下的状态矩阵都算出来然后取所有工况阻尼比的最小值。这样算法在一次评估里就会兼顾运行方式的鲁棒性。def fitness_pss(params, scenario_matrices): k, t1, t2, t3, t4 params worst float(inf) for A in scenario_matrices: A_pss embed_pss_matrix(A, k, t1, t2, t3, t4) zeta calc_min_damping(A_pss) worst min(worst, zeta) # 算法按最小值搜索所以取负 return -worst这里embed_pss_matrix做的工作是把PSS的附加励磁反馈写进原状态矩阵。不同系统建模工具导出的A矩阵格式不一样但接入方式是一致的把PSS新增状态变量追加到状态向量尾部同时修改励磁电压状态方程中对应的反馈系数。参数说明部分要特别留意K过大时特征值实部会反向移动所以适应度函数里要额外判断稳定裕度。3. 用Python实现人工鱼群算法让觅食聚群追尾都围绕PSS参数空间展开3.1 鱼群行为与参数搜索的映射关系人工鱼群算法把每个候选PSS参数组合看成一条鱼鱼的位置就是五维参数向量。鱼群在参数空间里游动通过四种行为改变位置。觅食行为是基础的趋势跟随在当前鱼附近随机找点对比适应度如果更好就朝那个方向移动。聚群行为让鱼向视野内的伙伴中心靠拢但拥挤度因子会拦住“扎堆却不好吃”的局面。追尾行为则是让鱼向视野内适应度最好的同伴移动兼顾开发能力。当觅食尝试若干次都没用鱼就随机游一步这就是随机行为也是跳出局部最优的主要出口。def move_towards(fish, target, step): vec target - fish dist np.linalg.norm(vec) if dist 1e-8: return fish return fish step * vec / distmove_towards是三种定向行为共用的移动函数。step是步长直接决定每次移动的幅度。dist接近0时说明已经和邻居重合不做移动避免除零。3.2 完整的AFSA主循环代码下面是一段可以直接运行的AFSA核心逻辑适应度函数用上面的fitness_pss。鱼群数量取30迭代50次视觉范围取1.2步长0.4尝试次数5次。import numpy as np def afsa_optimize(fitness_func, lb, ub, fish_num30, max_iter50, visual1.2, step0.4, try_num5, delta0.618): dim len(lb) # 初始化鱼群位置 fish np.random.uniform(lb, ub, (fish_num, dim)) best_fish fish[0].copy() best_fitness fitness_func(best_fish) for it in range(max_iter): for i in range(fish_num): current fish[i].copy() # 找视野内的邻居 others np.delete(fish, i, axis0) dists np.linalg.norm(others - current, axis1) neighbors others[dists visual] # 聚群行为 if len(neighbors) 0: center neighbors.mean(axis0) center_fit fitness_func(center) current_fit fitness_func(current) if center_fit current_fit and len(neighbors) * center_fit delta * current_fit: fish[i] move_towards(current, center, step) continue # 追尾行为 best_neighbor neighbors[np.argmin([fitness_func(x) for x in neighbors])] best_fit fitness_func(best_neighbor) if best_fit current_fit and len(neighbors) * best_fit delta * current_fit: fish[i] move_towards(current, best_neighbor, step) continue # 觅食行为尝试次数内找到更优位置就移动 for _ in range(try_num): candidate current np.random.uniform(-1, 1, dim) * visual candidate np.clip(candidate, lb, ub) if fitness_func(candidate) fitness_func(current): fish[i] move_towards(current, candidate, step) break else: # 尝试失败随机游动 fish[i] current np.random.uniform(-1, 1, dim) * step fish[i] np.clip(fish[i], lb, ub) # 更新全局最优 for i in range(fish_num): fit fitness_func(fish[i]) if fit best_fitness: best_fitness fit best_fish fish[i].copy() return best_fish, best_fitness聚群和追尾的拥挤度判断是这段代码里最容易写错的地方。len(neighbors) * center_fit delta * current_fit的含义是去中心位置确实更好且同行鱼数不能太多。如果邻居很多但食物一般鱼群就会放弃扎堆保持分散搜索。delta取0.618是一个兼顾收敛速度和种群多样性的经验值。3.3 参数边界与约束处理中的典型失误PSS参数优化的边界处理最容易翻车的地方是增益K。直接用clip把K限制到50以内没问题但PSS的增益实际还会受到励磁电压限幅的约束单纯在适应度函数里检查特征值不够。常见做法是额外加一个罚项def fitness_with_penalty(params): k, t1, t2, t3, t4 params penalty 0.0 if k 50: penalty (k - 50) ** 2 zeta -fitness_pss(params, scenario_matrices) return zeta penalty罚项数值不能抢过阻尼比的主导地位否则算法会优先压低罚项而不是提升阻尼比。建议罚项放大系数从0.1开始调直到最优解稳定落在边界内。另一个容易被忽略的问题是把T1和T3搜索得过大导致PSS在中频段引入过多相位滞后反而降低了其他振荡模式的阻尼因此必须保留多工况最小阻尼比的合并逻辑。4. 在SMIB系统上跑一场多场景优化看结果也看收敛轨迹4.1 怎么组织多工况的适应度评估单机无穷大系统模型适合先验证算法逻辑但它只有一个机电振荡模式做多工况聚合时不会出现模式切换的麻烦。我一般会搭三组工况轻载P0.4p.u.、额定P0.85p.u.、重载P1.15p.u.分别对应不同的K1到K6互联系数。每个工况下的状态矩阵维度相同PSS参数嵌入方式也一样。适应度函数每次调用会循环三组矩阵取最小的阻尼比再取负代码如下scenario_matrices [] scenario_matrices.append(load_smib_matrix(p0.4, x_line0.80)) scenario_matrices.append(load_smib_matrix(p0.85, x_line0.55)) scenario_matrices.append(load_smib_matrix(p1.15, x_line0.40)) def total_fitness(params): return fitness_pss(params, scenario_matrices) best, best_fit afsa_optimize(total_fitness, lb, ub) print(最优K:, best[0], T1:, best[1], T3:, best[2]) print(最小阻尼比:, -best_fit)这里load_smib_matrix需要结合具体的发电机和励磁参数计算Hefron-Phillips系数工程上往往直接从BPA或PSASP导出不必在优化脚本里重新推导。4.2 一次典型优化运行的结果对比以下是一组典型运行中得到的结果鱼群数量30迭代80次。与相位补偿法和粒子群算法放在一起对比方法KT1T3额定工况最小阻尼比重载工况最小阻尼比相位补偿法18.20.120.280.0710.052粒子群算法26.70.190.340.0930.081人工鱼群算法31.40.220.370.1080.097这个表格不需要照搬但趋势是稳定的人工鱼群算法在K值上往往比相位补偿法搜得更高同时T1和T3更大说明算法倾向于用更宽的超前相位窗口来覆盖轻载和重载两种工况。粒子群有时能达到接近的阻尼比但对初始种群和惯性权重更敏感多跑几次会出一两个不稳定的解。4.3 从收敛轨迹判断鱼群是否真的在优化把每代最优适应度打印出来前10代曲线下降很快之后变得平缓这是正常表现。如果50代后还出现明显的阶梯式下降说明算法翻过了某个局部极值边界后面改善空间仍然存在。我一般看两个指标一是全局最优是否在连续15到20代内不再变化二是鱼群个体之间距离的方差是否缩小到参数的10%以内。def trace_diversity(fish): center fish.mean(axis0) dist np.linalg.norm(fish - center, axis1) return dist.std()如果多样性快速降到很低的水平说明鱼群全部聚到了同一个点附近此时再增加迭代次数也改善不了需要回头调大visual或者减小delta。如果多样性降不下去则说明随机行为一直在干扰收敛。5. 人工鱼群算法的核心参数怎么调visual、step与拥挤度的边界5.1 visual和step的选择直接影响搜索半径和收敛速度视觉范围visual决定了“一条鱼能看多远”。在PSS参数优化里K的量纲是几十T1和T3是零点几这时不能对五个维度用同一个视觉值。更稳的做法是先对参数空间做归一化lb np.array([2, 0.05, 0.02, 0.05, 0.02]) ub np.array([50, 2.5, 0.3, 2.5, 0.3]) norm_fish (fish - lb) / (ub - lb)归一化后所有参数都落到[0,1]区间visual取0.2到0.4就有较好的覆盖效果。step取visual的1/5到1/3比如visual0.3时step0.1。步长太大会让鱼在最优解附近来回跳动太小则收敛缓慢。算法前期可以设置一个较大的visual迭代到中段后按线性衰减到初始值的一半这在PSS参数优化里能明显减少早熟。参数推荐范围对优化过程的影响visual归一化0.2 ~ 0.5过大变成随机搜索过小陷入局部step归一化0.05 ~ 0.15过大震荡过小收敛慢try_number5 ~ 10越大越偏向局部精细搜索delta0.5 ~ 0.8越大越鼓励扎堆越小越分散fish_num25 ~ 60越多越稳定但评估耗时线性增长5.2 拥挤度因子过大或过小分别意味着什么拥挤度因子delta控制鱼群能否在热点附近聚集成簇。PSS参数空间的适应度曲面通常不是单峰而是有若干脊线每条脊线上阻尼比都比较高。delta偏大时聚群和追尾更容易被接受鱼群会快速集中到某一条脊线上速度快但容易错过其他脊线上的更优解。delta偏小时鱼群难以在邻居较密集的地方继续靠拢支配地位的还是觅食和随机行为全局搜索能力强但后期精细修正能力弱。常见做法是固定delta0.618或者让delta在迭代过程中从0.8线性降到0.5前中期保持种群多样性后期加强局部开发。5.3 人工鱼群算法与粒子群、遗传算法在PSS整定上的定位差粒子群算法的问题在于惯性权重和个体学习因子的配合没有固定规律PSS参数维度低时还能用一旦把PSS放大到多机系统里的多台稳定器联合优化粒子群很容易收敛到某一台机组的局部最优。遗传算法靠着交叉变异保持了很好的全局搜索能力但参数编码长度会随着优化变量数量膨胀带来大量无意义组合。人工鱼群算法介于两者之间聚群行为相当于隐式的邻域搜索追尾行为又带有一点向当前最优看齐的目的性随机行为兜底。它不需要像粒子群那样引入第二组速度状态因此实现和维护成本低。代价是鱼群数量和评估次数偏多在一次评估需要计算几十个矩阵特征值的时候总耗时可能是粒子群的1.2到1.5倍但工程上PSS参数整定的频率远低于毫秒级控制周期这个代价可接受。6. 参数优化完成后还要做这三次独立的验证6.1 用未参与优化的运行方式复核特征值优化阶段选取的三到四个工况不能覆盖全部运行空间。验证阶段再额外取出机组检修、一条线路跳闸、负荷水平更极端的场景单独计算特征值。如果新场景下阻尼比掉到0.03以下回看这个场景对应的是PSS哪一段相位补偿不足然后回到算法里把该场景的权重提高。extra_matrix load_smib_matrix(p1.25, x_line0.50, line_cutTrue) verify_zeta calc_min_damping(embed_pss_matrix(extra_matrix, *best))6.2 做参数摄动灵敏度测试工况变了PSS参数不会变但系统参数会变。把发电机惯性时间常数H、励磁增益KA、线路电抗XE分别上下浮动10%再计算每组参数下的阻尼比。结果散点能看出哪些参数扰动对阻尼影响最大。通常PSS对H和XE的变化最敏感对励磁时间常数的变化相对迟钝。若灵敏度测试中阻尼比波动超过0.02建议回到算法里把该参数区间适当延长。6.3 保留随机种子的多轮重复优化记录人工鱼群算法每次运行都有随机性。我最终提交给仿真的参数不是某次最优值而是连续跑了10次之后取阻尼比落在中位数附近的那一版。最亮眼的解往往位于参数空间的尖峰上工程参数稍微漂移一点就会失稳而中位数解通常处于更平缓的高阻尼区域抗参数漂移能力更强。把每轮运行的鱼群终点保存下来做成散点图也能顺带检查是否有多个相距很远的参数组合给出相近阻尼比——如果有说明适应度曲面上存在多条等效脊线随便选哪条都需要再做时域仿真来综合判断。本文还有配套的精品资源点击获取