改进粒子群算法求解电力系统经济调度问题(Matlab实现)

目录

1 相关知识点

2 Matlab完整代码实现 

3 结果及可视化

 

1 相关知识点

                                  这里写图片描述

相关知识点我们前面已经总结过了:梳理如下:

粒子群算法(带约束处理)——Python&Matlab实现

智能优化算法——粒子群算法(Matlab实现)

灰狼算法和粒子群算法比较(附完整Matlab代码)——可应用于电气期刊论文

粒子群算法求解电力系统环境经济调度+微电网调度(风、光、电动车、柴油机、主网)(Python代码实现)

改进的多目标差分进化算法在电力系统环境经济调度中的应用(Python代码实现)【电气期刊论文复现】

风电随机性动态经济调度模型(Python&Matlab代码)

多目标灰太狼算法求解环境经济调度问题(IEEE30)(Matlab实现)

多元宇宙算法求解电力系统多目标优化问题(Matlab实现)【电气期刊论文复现】

求解热电联产经济调度问题的改进遗传与粒子群算法

改进粒子群算法的配电网故障定位(Python&Matlab代码实现)

2 Matlab完整代码实现 

知识点讲解完毕,下面就是Matlab代码:

clc;
clear;
close all;

%% 经济调度问题

extmodel=CreateModel();

CostFunction=@(x) MyCostExt(x,extmodel); % 成本函数(目标函数)

nVar=extmodel.nPlant;             % 发电机台数(决策变量的个数)

VarSize=[1 nVar];   % 决策变量矩阵的大小

VarMin=0;         % 变量下限
VarMax=1;         % 变量上限


%% 粒子群算法相关参数

MaxIt=100;      % 最大迭代次数

nPop=10;        % 总群数量

% w=1;            % 惯性权重
% wdamp=0.99;     % 惯性重量阻尼比
% c1=2;           % 个体学习系数
% c2=2;           % 种群学习系数

%% 约束系数
phi1=2.05;
phi2=2.05;
phi=phi1+phi2;
chi=2/(phi-2+sqrt(phi^2-4*phi));
w=chi;          % 惯性权重
wdamp=1;        % 惯性重量阻尼比
c1=chi*phi1;    % 个体学习系数
c2=chi*phi2;    % 种群学习系数

%% 飞行速度限制
VelMax=0.1*(VarMax-VarMin);
VelMin=-VelMax;

%% 初始化

empty_particle.Position=[];
empty_particle.Cost=[];
empty_particle.Out=[];
empty_particle.Velocity=[];
empty_particle.Best.Position=[];
empty_particle.Best.Cost=[];
empty_particle.Best.Out=[];

particle=repmat(empty_particle,nPop,1);

BestSol.Cost=inf;

for i=1:nPop
    
    %=====初始化粒子群位置===============
    particle(i).Position=unifrnd(VarMin,VarMax,VarSize);
    
    %=====初始化速度======
    particle(i).Velocity=zeros(VarSize);
    
    %=====目标函数计算===========
    [particle(i).Cost, particle(i).Out]=CostFunction(particle(i).Position);
    
    %====更新粒子个体最优=====
    particle(i).Best.Position=particle(i).Position;
    particle(i).Best.Cost=particle(i).Cost;
    particle(i).Best.Out=particle(i).Out;
    
    %====更新粒子群全局最优========
    if particle(i).Best.Cost<BestSol.Cost
        
        BestSol=particle(i).Best;
        
    end
    
end

BestCost=zeros(MaxIt,1);


%% PSO 主循环

for it=1:MaxIt
    
    for i=1:nPop
        
        %============更新速度(跟着公式写就可以啦)===============
        particle(i).Velocity = w*particle(i).Velocity ...
            +c1*rand(VarSize).*(particle(i).Best.Position-particle(i).Position) ...
            +c2*rand(VarSize).*(BestSol.Position-particle(i).Position);
        
        %============适用速度限制============
        particle(i).Velocity = max(particle(i).Velocity,VelMin);
        particle(i).Velocity = min(particle(i).Velocity,VelMax);
        
        %============更新位置================
        particle(i).Position = particle(i).Position + particle(i).Velocity;
        
        IsOutside=(particle(i).Position<VarMin | particle(i).Position>VarMax);
        particle(i).Velocity(IsOutside)=-particle(i).Velocity(IsOutside);
        
        %============适用位置限制============
        particle(i).Position = max(particle(i).Position,VarMin);
        particle(i).Position = min(particle(i).Position,VarMax);
        
        %============计算目标函数===========
        [particle(i).Cost, particle(i).Out] = CostFunction(particle(i).Position);
        
        %==========更新个体最优==========
        if particle(i).Cost<particle(i).Best.Cost
            
            particle(i).Best.Position=particle(i).Position;
            particle(i).Best.Cost=particle(i).Cost;
            particle(i).Best.Out=particle(i).Out;
            
            %=======更新全局最优============
            if particle(i).Best.Cost<BestSol.Cost
                
                BestSol=particle(i).Best;
                
            end
            
        end
        
    end
    
    BestCost(it)=BestSol.Cost;
    
    disp(['迭代次数' num2str(it) ': 最优解为 = ' num2str(BestCost(it))]);
    
    w=w*wdamp;
    
end

%% 结果

figure;
plot(BestCost,'LineWidth',2);
xlabel('迭代次数');
ylabel('最优解');


function results=RunInternalPSO(intmodel)

    disp('运行粒子群算法 ...');

    %% 本文参数定义

    CostFunction=@(x) MyCost(x,intmodel);        % 目标函数

    nVar=intmodel.nPlant;             %决策变量个数

    VarSize=[1 nVar];   % 决策变量矩阵的大小

    VarMin=0;         %变量下限
    VarMax=1;         %变量上

    %% 粒子群参数

    MaxIt=100;      

    nPop=50;        

    % w=1;           
    % wdamp=0.99;     
    % c1=2;          
    % c2=2;           

    %% 约束系数
    phi1=2.05;
    phi2=2.05;
    phi=phi1+phi2;
    chi=2/(phi-2+sqrt(phi^2-4*phi));
    w=chi;          
    wdamp=1;        
    c1=chi*phi1;    
    c2=chi*phi2;    

    %% 速度限制
    VelMax=0.1*(VarMax-VarMin);
    VelMin=-VelMax;

    %% 初始化

    empty_particle.Position=[];
    empty_particle.Cost=[];
    empty_particle.Out=[];
    empty_particle.Velocity=[];
    empty_particle.Best.Position=[];
    empty_particle.Best.Cost=[];
    empty_particle.Best.Out=[];

    particle=repmat(empty_particle,nPop,1);

    BestSol.Cost=inf;

    for i=1:nPop

        % 初始化位置
        particle(i).Position=unifrnd(VarMin,VarMax,VarSize);

        % 初始化速度
        particle(i).Velocity=zeros(VarSize);

        % 目标函数计算
        [particle(i).Cost, particle(i).Out]=CostFunction(particle(i).Position);

        % 个体最优
        particle(i).Best.Position=particle(i).Position;
        particle(i).Best.Cost=particle(i).Cost;
        particle(i).Best.Out=particle(i).Out;

        % 全局最优
        if particle(i).Best.Cost<BestSol.Cost

            BestSol=particle(i).Best;

        end

    end

    BestCost=zeros(MaxIt,1);


    %% PSO主循环

    for it=1:MaxIt

        for i=1:nPop

            % 更新速度
            particle(i).Velocity = w*particle(i).Velocity ...
                +c1*rand(VarSize).*(particle(i).Best.Position-particle(i).Position) ...
                +c2*rand(VarSize).*(BestSol.Position-particle(i).Position);

            %速度限制
            particle(i).Velocity = max(particle(i).Velocity,VelMin);
            particle(i).Velocity = min(particle(i).Velocity,VelMax);

            % 更新位置
            particle(i).Position = particle(i).Position + particle(i).Velocity;

           
            IsOutside=(particle(i).Position<VarMin | particle(i).Position>VarMax);
            particle(i).Velocity(IsOutside)=-particle(i).Velocity(IsOutside);

            % 位置限制
            particle(i).Position = max(particle(i).Position,VarMin);
            particle(i).Position = min(particle(i).Position,VarMax);

            % 目标函数计算
            [particle(i).Cost, particle(i).Out] = CostFunction(particle(i).Position);

            %更新个体最优
            if particle(i).Cost<particle(i).Best.Cost

                particle(i).Best.Position=particle(i).Position;
                particle(i).Best.Cost=particle(i).Cost;
                particle(i).Best.Out=particle(i).Out;

                % 更新全局最优
                if particle(i).Best.Cost<BestSol.Cost

                    BestSol=particle(i).Best;

                end

            end

        end

        BestCost(it)=BestSol.Cost;

       

        w=w*wdamp;

    end

    %% 结果
    results.BestSol=BestSol;
    results.BestCost=BestCost;

    disp('粒子群结束.');
    
end
%% 目标函数
function [z, out]=MyCost(x,model)

    P=ParseSolution(x,model);
    
    out=ModelCalculations(P,model);

    z=out.z;

end
%% 约束条件:功率平衡
function out=ModelCalculations(P,model)

    alpha=model.Plants.alpha;
    beta=model.Plants.beta;
    gamma=model.Plants.gamma;
    
    C=alpha+beta.*P+gamma.*P.*P;
    
    CTotal=sum(C);
    
    B=model.B;
    B0=model.B0;
    B00=model.B00;
    
    PL=P*B*P'+B0*P'+B00;
    
    PTotal=sum(P);
    
    PD=model.PD;
    
    PowerBalanceViolation=max(1-(PTotal-PL)/PD,0);
    
    q=1000000;
    z=CTotal+q*PowerBalanceViolation;
    
    out.P=P;
    out.PTotal=PTotal;
    out.C=C;
    out.CTotoal=CTotal;
    out.PL=PL;
    out.PowerBalanceViolation=PowerBalanceViolation;
    out.z=z;

end

function extmodel=CreateModel()

    extmodel.PD=1263;  %总负荷
    %% 机组参数
    extmodel.Plants.F=[50000 35000 40000 28000 32000 22000];
    extmodel.Plants.Pmin=[100 50 80 50 50 50];  %机组下限
    extmodel.Plants.Pmax=[500 200 300 150 200 120]; %机组上限
    extmodel.Plants.alpha=[240 200 220 200 220 190]; %发电机排放特性系数alpha
    extmodel.Plants.beta=[7 10 8.5 11 10.5 12];  %发电机排放特性系数beta
    extmodel.Plants.gamma=[0.007 0.0095 0.009 0.009 0.008 0.0075];  %发电机排放特性系数gamma
    extmodel.Plants.PZ{1}={[210 240],[350 380]};
    extmodel.Plants.PZ{2}={[90 110],[140 160]};
    extmodel.Plants.PZ{3}={[150 170],[210 240]};
    extmodel.Plants.PZ{4}={[80 90],[110 120]};
    extmodel.Plants.PZ{5}={[90 110],[140 150]};
    extmodel.Plants.PZ{6}={[75 85],[100 105]};
    
    extmodel.EmptyPlant.F=0;
    extmodel.EmptyPlant.Pmin=0;
    extmodel.EmptyPlant.Pmax=0;
    extmodel.EmptyPlant.alpha=0;
    extmodel.EmptyPlant.beta=0;
    extmodel.EmptyPlant.gamma=0;
    extmodel.EmptyPlant.PZ={};
    
    extmodel.nPlant=numel(extmodel.Plants.alpha);
    
    %% 发电机网损系数
    extmodel.B=[ 0.0017  0.0012  0.0007 -0.0001 -0.0005 -0.0002
                 0.0012  0.0014  0.0009  0.0001 -0.0006 -0.0001
                 0.0007  0.0009  0.0031  0.0000 -0.0010 -0.0006
                -0.0001  0.0001  0.0000  0.0024 -0.0006 -0.0008
                -0.0005 -0.0006 -0.0010 -0.0006  0.0129 -0.0002
                -0.0002 -0.0001 -0.0006 -0.0008 -0.0002  0.0150]/40;

    extmodel.B0=1e-3*[-0.3908 -0.1279 0.7047 0.0591 0.2161 -0.6635];
    
    extmodel.B00=0.056;

end

function k=ParseSolutionExt(x,M)

    k=min(floor((M+1)*x),M);

end

function P=ParseSolution(x,model)

    Pmin=model.Plants.Pmin;
    Pmax=model.Plants.Pmax;
    P=Pmin+(Pmax-Pmin).*x;
    
    PZ=model.Plants.PZ;
    
    nPlant=model.nPlant;
    for i=1:nPlant
        for j=1:numel(PZ{i})
            if P(i)>PZ{i}{j}(1) && P(i)<PZ{i}{j}(2)
                % 校正
                if P(i)<(PZ{i}{j}(1)+PZ{i}{j}(2))/2
                    P(i)=PZ{i}{j}(1);
                else
                    P(i)=PZ{i}{j}(2);
                end
            end
        end
    end

end


function [z, out]=MyCostExt(x,extmodel)

    M=extmodel.nPlant;

    k=ParseSolutionExt(x,M);
    
    F=zeros(1,M);
    for i=1:M
        ki=k(i);
        if ki==0
            F(i)=extmodel.EmptyPlant.F;
        else
            F(i)=extmodel.Plants.F(ki);
        end
    end
    
    FTotal=sum(F);
    
    intmodel=CreateInternalModel(k,extmodel);
    results=RunInternalPSO(intmodel);
    
    BestEconomicDispatchCost=results.BestSol.Cost;
    
    wext=1;
    wint=1;
    z = wext*FTotal + wint*BestEconomicDispatchCost;
    
    out.k=k;
    out.F=F;
    out.FTotal=FTotal;
    out.ED.model=intmodel;
    out.ED.BestSol=results.BestSol;
    out.ED.BestCost=results.BestCost;
    out.z=z;

end

function intmodel=CreateInternalModel(k,extmodel)

    intmodel.PD=extmodel.PD;

    nPlant=numel(k);
    
    intmodel.nPlant=nPlant;
    
    Plants=extmodel.Plants;
    EmptyPlant=extmodel.EmptyPlant;
    
    intmodel.Plants.Pmin=zeros(1,nPlant);
    intmodel.Plants.Pmax=zeros(1,nPlant);
    intmodel.Plants.alpha=zeros(1,nPlant);
    intmodel.Plants.beta=zeros(1,nPlant);
    intmodel.Plants.gamma=zeros(1,nPlant);
    intmodel.Plants.PZ=cell(1,nPlant);

    for i=1:nPlant
        ki=k(i);
        if ki==0
            % Set Plant #i to be Empty
            intmodel.Plants.Pmin(i)=EmptyPlant.Pmin;
            intmodel.Plants.Pmax(i)=EmptyPlant.Pmax;
            intmodel.Plants.alpha(i)=EmptyPlant.alpha;
            intmodel.Plants.beta(i)=EmptyPlant.beta;
            intmodel.Plants.gamma(i)=EmptyPlant.gamma;
            intmodel.Plants.PZ{i}=EmptyPlant.PZ;
        else
            
            intmodel.Plants.Pmin(i)=Plants.Pmin(ki);
            intmodel.Plants.Pmax(i)=Plants.Pmax(ki);
            intmodel.Plants.alpha(i)=Plants.alpha(ki);
            intmodel.Plants.beta(i)=Plants.beta(ki);
            intmodel.Plants.gamma(i)=Plants.gamma(ki);
            intmodel.Plants.PZ{i}=Plants.PZ{ki};
        end
    end
    
    intmodel.B=extmodel.B;
    intmodel.B0=extmodel.B0;
    intmodel.B00=extmodel.B00;
    
end

3 结果及可视化

 

猜你喜欢

转载自blog.csdn.net/weixin_46039719/article/details/125286232