Jaya算法在电力系统最优潮流计算中的应用(创新点)【Matlab代码实现】

本文主要是介绍Jaya算法在电力系统最优潮流计算中的应用(创新点)【Matlab代码实现】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

 

1 概述

2 数学模型

2.1 目标函数

2.2 约束条件 

2.3 Jaya 算法

3 仿真结果 

4 Matlab代码实现


1 概述

 最优潮流计算与电力系统的稳定、经济运行密切相关,自20世纪60年代提出最优潮流的概念,大量学者相继提出了各种优化技术来求解电力系统的最优潮流问题。Jaya算法是于2016年提出的一种简单高效的新型优化算法,具有收敛快寻优强的特点。算例在IEEE39节点上实现。

2 数学模型

2.1 目标函数

           

目标函数(Matlab代码实现) 

function [F,Plosses] = ObjectiveFunction(V_o,line_o,Bgen,Theta_o,nbranch,FromNode,ToNode,PQ)
%% 该函数计算目标函数,包含惩罚项因子
for k=1:nbrancha(k)=line_o(k,6);if a(k)==0 % 在这种情况下,我们正在分析线路Zpq(k)=line_o(k,3)+1i*line_o(k,4); % 线路阻抗Ypq(k)=Zpq(k)^-1; % 线路导纳gpq(k)=real(Ypq(k)); % 线路电导%+++++++++++目标函数1,系统网损+++++++++++Llpq(k)=gpq(k)*(V_o(FromNode(k))^2 +V_o(ToNode(k))^2 -2*V_o(FromNode(k))*V_o(ToNode(k))*cos(Theta_o(FromNode(k))-Theta_o(ToNode(k))));end
end
%% 有功总损耗
Plosses=sum(Llpq);
%% 目标函数
KL=1000; % 惩罚因子
for k=1:length(PQ)%% 负载电压偏移(0.95~1.05)if V_o(k+length(Bgen))<0.95   %电压偏移小于0.95DVL(k)=0.95-V_o(k+length(Bgen));  %惩罚项1endif V_o(k+length(Bgen))>1.05    %电压偏移大于1.05DVL(k)=V_o(k+length(Bgen))-1.05;  %惩罚项2endif V_o(k+length(Bgen))>=0.95    %电压偏移如果在0.95~1.05之间if V_o(k+length(Bgen))<=1.05DVL(k)=0;               %电压偏移惩罚项为零endend
end
DVLoads=sum(DVL.*DVL);
Z=Plosses+KL*DVLoads; %目标函数
F=Z; % 目标函数
end

function [F,Plosses] = ObjectiveFunction(V_o,line_o,Bgen,Theta_o,nbranch,FromNode,ToNode,PQ)
%% 该函数计算目标函数,包含惩罚项因子
for k=1:nbranch
    a(k)=line_o(k,6);
    if a(k)==0 % 在这种情况下,我们正在分析线路
        Zpq(k)=line_o(k,3)+1i*line_o(k,4); % 线路阻抗
        Ypq(k)=Zpq(k)^-1; % 线路导纳
        gpq(k)=real(Ypq(k)); % 线路电导
        %+++++++++++目标函数1,系统网损+++++++++++
        Llpq(k)=gpq(k)*(V_o(FromNode(k))^2 +V_o(ToNode(k))^2 -2*V_o(FromNode(k))*V_o(ToNode(k))*cos(Theta_o(FromNode(k))-Theta_o(ToNode(k))));
    end
end
%% 有功总损耗
Plosses=sum(Llpq);
%% 目标函数
KL=1000; % 惩罚因子
for k=1:length(PQ)
    %% 负载电压偏移(0.95~1.05)
    if V_o(k+length(Bgen))<0.95   %电压偏移小于0.95
        DVL(k)=0.95-V_o(k+length(Bgen));  %惩罚项1
    end
    if V_o(k+length(Bgen))>1.05    %电压偏移大于1.05
        DVL(k)=V_o(k+length(Bgen))-1.05;  %惩罚项2
    end
    if V_o(k+length(Bgen))>=0.95    %电压偏移如果在0.95~1.05之间
        if V_o(k+length(Bgen))<=1.05
            DVL(k)=0;               %电压偏移惩罚项为零
        end
    end
end
DVLoads=sum(DVL.*DVL);
Z=Plosses+KL*DVLoads; %目标函数
F=Z; % 目标函数
end

2.2 约束条件 

              

2.3 Jaya 算法

Jaya 算法是 Rao 等提出的一种元启发式算法,它基于持续改进的原理,将个体不断向优秀个体靠拢,同时不断远离差的个体,进而不断提高解的质量。传统 Jaya 算法主要基于迭代公式,每次通过该方程迭代进化获取新的解,因此 Jaya 算法不像其他进化算法需要许多的参数,它只需要针对特定问题调整迭代过程的参数,减少了因为调整过多参数而带来的测试上的麻烦。与其它元启发式算法相比,Jaya 算法更容易理解和实现。该算法的迭代公式如下所示:

 

 Jaya优化算法流程图如下:

            在这里插入图片描述

目标函数: 

%% 基于Jaya算法的电力系统最优潮流%% 有功损耗最小化
clear all;
close all;
clc%% ++++++++++++++++电力系统数据库+++++++++++++++
% 下面的文件包含了母线、线路矩阵等电力系统拓扑信息
data_39;
% 线路类型和发电机
bus_o=bus; line_o=line;
slack=find(bus(:,10)==1); % 松弛节点/平衡节点
PV=find(bus(:,10)==2);   % PV节点
Bgen=vertcat(slack,PV);     %平衡节点和松弛节点【C = vertcat(A,B) 将 B 垂直串联到 A 的末尾。】
PQ=find(bus(:,10)==3);   % PQ节点/负荷节点%% +++++++++++++++ 优化算法的参数 ++++++++++++++++
pop =  210;                                % 种群规模
n_itera = 35;                             % 优化算法迭代次数
Vmin=0.95;                                % 发电机电压的最小值
Vmax=1.05;                                % 发电机电压的最大值
mini_tap = 0.95;                          % TAP的最小值
maxi_tap = 1.05;                          % TAP的最大值
Smin=-0.5;                                % 视在功率最小值
Smax=0.5;                                 % 视在功率最大值
pos_Shunt = find( bus(:,11) ~= 0);        % 母线矩阵中分流点的位置
pos_tap = find( line(:,6) ~= 0);          % TAPs在行矩阵中的位置
tap_o = line(pos_tap,6);                  % TAPs初始值
Shunt_o = bus(pos_Shunt,9);               %分流器的初始值
n_tap = length(pos_tap);                  % TAPs的数量
n_Shunt = length(pos_Shunt);              % 分流器的数量
n_nodos = length(bus(:,1));               % 电力系统的节点数量%% ++++++++++++++++ 第一:运行基本情况下的潮流 ++++++++++++++++
% 存储基本情况的电压和相角
[V_o,Theta_o,~] = PowerFlowClassical(bus_o,line_o);
%% +++++++++++++++++++计算有功功率损耗++++++++++++++++++++++
nbranch=length(line_o(:,1));
FromNode=line_o(:,1);
ToNode=line_o(:,2);
for k=1:nbrancha(k)=line_o(k,6);if a(k)==0 % 在这种情况下,我们正在分析线路Zpq(k)=line_o(k,3)+1i*line_o(k,4); % 线路的阻抗Ypq(k)=Zpq(k)^-1; % 线路导纳gpq(k)=real(Ypq(k)); % 线路电导% 对应线路有功损耗Llpq(k)=gpq(k)*(V_o(FromNode(k))^2 +V_o(ToNode(k))^2 -2*V_o(FromNode(k))*V_o(ToNode(k))*cos(Theta_o(FromNode(k))-Theta_o(ToNode(k))));end
end
% 有功总损耗
Plosses=sum(Llpq);
%% +++++++++++++++++++++++++++ 最优潮流 ++++++++++++++++++++++++++
% 启动种群
for k=1:n_tap % 启动TAP种群x_tap(:,k) = mini_tap +(maxi_tap - mini_tap)*(0.1*floor((10*rand(pop,1))));
end 
for k=1:n_Shunt % 启动分流种群x_shunt(:,k) = Smin +(Smax - Smin)*(0.1*floor((10*rand(pop,1))));
end
for k=1:length(Bgen) % 从发电机启动电压的种群x_vg(:,k) = Vmin +(Vmax - Vmin)*(0.1*floor((10*rand(pop,1))));
end
%% JAYA 算法
for k=1:n_itera% 使用TAP的新值,分流和发电机电压重新计算电压和节点导纳%修改线路和母线矩阵for p=1:popfor q=1:n_tapr=pos_tap(q);line(r,6)=x_tap(p,q); % 根据新的TAP值对线矩阵进行修正end; clear rfor qa=1:n_Shuntr=pos_Shunt(qa);bus(r,9)=x_shunt(p,qa); % 根据新的分流值修改母线矩阵end; clear rfor qb=1:length(Bgen)r=Bgen(qb);bus(r,2)=x_vg(p,qb); %根据新的VG值修改总线矩阵end% 随着新的线路和母线矩阵运行潮流[V_n,Theta_n,~] = PowerFlowClassical(bus,line);% 目标函数[F,~] = ObjectiveFunction(V_n,line_o,Bgen,Theta_n,nbranch,FromNode,ToNode,PQ);Ofun=F; Obfun(k,p)=F;end

%% 基于Jaya算法的电力系统最优潮流

%% 有功损耗最小化
clear all;
close all;
clc

%% ++++++++++++++++电力系统数据库+++++++++++++++
% 下面的文件包含了母线、线路矩阵等电力系统拓扑信息
data_39;
% 线路类型和发电机
bus_o=bus; line_o=line;
slack=find(bus(:,10)==1); % 松弛节点/平衡节点
PV=find(bus(:,10)==2);   % PV节点
Bgen=vertcat(slack,PV);     %平衡节点和松弛节点【C = vertcat(A,B) 将 B 垂直串联到 A 的末尾。】
PQ=find(bus(:,10)==3);   % PQ节点/负荷节点

%% +++++++++++++++ 优化算法的参数 ++++++++++++++++
pop =  210;                                % 种群规模
n_itera = 35;                             % 优化算法迭代次数
Vmin=0.95;                                % 发电机电压的最小值
Vmax=1.05;                                % 发电机电压的最大值
mini_tap = 0.95;                          % TAP的最小值
maxi_tap = 1.05;                          % TAP的最大值
Smin=-0.5;                                % 视在功率最小值
Smax=0.5;                                 % 视在功率最大值
pos_Shunt = find( bus(:,11) ~= 0);        % 母线矩阵中分流点的位置
pos_tap = find( line(:,6) ~= 0);          % TAPs在行矩阵中的位置
tap_o = line(pos_tap,6);                  % TAPs初始值
Shunt_o = bus(pos_Shunt,9);               %分流器的初始值
n_tap = length(pos_tap);                  % TAPs的数量
n_Shunt = length(pos_Shunt);              % 分流器的数量
n_nodos = length(bus(:,1));               % 电力系统的节点数量

%% ++++++++++++++++ 第一:运行基本情况下的潮流 ++++++++++++++++
% 存储基本情况的电压和相角
[V_o,Theta_o,~] = PowerFlowClassical(bus_o,line_o);
%% +++++++++++++++++++计算有功功率损耗++++++++++++++++++++++
nbranch=length(line_o(:,1));
FromNode=line_o(:,1);
ToNode=line_o(:,2);
for k=1:nbranch
    a(k)=line_o(k,6);
    if a(k)==0 % 在这种情况下,我们正在分析线路
        Zpq(k)=line_o(k,3)+1i*line_o(k,4); % 线路的阻抗
        Ypq(k)=Zpq(k)^-1; % 线路导纳
        gpq(k)=real(Ypq(k)); % 线路电导
        % 对应线路有功损耗
        Llpq(k)=gpq(k)*(V_o(FromNode(k))^2 +V_o(ToNode(k))^2 -2*V_o(FromNode(k))*V_o(ToNode(k))*cos(Theta_o(FromNode(k))-Theta_o(ToNode(k))));
    end
end


% 有功总损耗
Plosses=sum(Llpq);
%% +++++++++++++++++++++++++++ 最优潮流 ++++++++++++++++++++++++++
% 启动种群
for k=1:n_tap % 启动TAP种群
    x_tap(:,k) = mini_tap +(maxi_tap - mini_tap)*(0.1*floor((10*rand(pop,1))));
end 
for k=1:n_Shunt % 启动分流种群
     x_shunt(:,k) = Smin +(Smax - Smin)*(0.1*floor((10*rand(pop,1))));
end
for k=1:length(Bgen) % 从发电机启动电压的种群
    x_vg(:,k) = Vmin +(Vmax - Vmin)*(0.1*floor((10*rand(pop,1))));
end
%% JAYA 算法
for k=1:n_itera
    % 使用TAP的新值,分流和发电机电压重新计算电压和节点导纳
    %修改线路和母线矩阵
    for p=1:pop
        for q=1:n_tap
            r=pos_tap(q);
            line(r,6)=x_tap(p,q); % 根据新的TAP值对线矩阵进行修正
        end; clear r
        for qa=1:n_Shunt
            r=pos_Shunt(qa);
             bus(r,9)=x_shunt(p,qa); % 根据新的分流值修改母线矩阵
        end; clear r
        for qb=1:length(Bgen)
            r=Bgen(qb);
            bus(r,2)=x_vg(p,qb); %根据新的VG值修改总线矩阵
        end
        % 随着新的线路和母线矩阵运行潮流
        [V_n,Theta_n,~] = PowerFlowClassical(bus,line);
        % 目标函数
        [F,~] = ObjectiveFunction(V_n,line_o,Bgen,Theta_n,nbranch,FromNode,ToNode,PQ);
        Ofun=F; Obfun(k,p)=F;
    end

3 仿真结果 

                      

                     

                       

                  

4 Matlab代码实现

这篇关于Jaya算法在电力系统最优潮流计算中的应用(创新点)【Matlab代码实现】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/580363

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("