基于改进粒子群算法的微电网多目标优化调度

基于改进粒子群算法的微电网多目标优化调度
参考文献《基于改进粒子群算法的微电网多目标优化调度》
摘要:微电网优化调度作为智能电网优化的重要组成部分,对降低能耗、环境污染具有重要意义。微电网的发展目标既要满足电力供应的基本需求,又要提高经济效益和环境保护。对此,提出了一种综合考虑微电网系统运行成本和环境保护成本的并网模式下微电网多目标优化调度模型。同时采用改进的粒子群算法对优化模型进行求解。仿真结果表明,该模型可以有效降低用户的用电成本和环境污染,促进微电网的优化运行,并验证了改进的粒子群算法的优越性能。
关键词:微电网;多目标;改进粒子群算法;优化调度
1 引言
多目标粒子群算法(MOPSO)是一种用于解决多目标优化问题的进化算法。它基于粒子群算法(PSO),通过模拟鸟群中鸟类的群体行为来寻找最优解。MOPSO算法的目标是找到一组解决方案,这些解决方案能够在多个目标函数下达到最优值,而不是单一目标函数的最优解。在实际应用中,许多问题都涉及到多个相互矛盾的目标,因此MOPSO算法具有广泛的应用前景。
然而,传统的MOPSO算法在处理多目标优化问题时存在一些问题,例如收敛速度慢、局部最优解问题以及对多样性的维护不足。因此,对MOPSO算法进行改进是非常必要的。首先,可以引入多目标优化算法的权衡因子,用于平衡不同目标之间的重要性。这样可以确保算法更好地探索和利用多目标空间,避免过度偏向某个目标而忽视其他目标。其次,设计更有效的粒子更新策略是改进MOPSO算法的关键。通过优化粒子的更新策略,可以提高算法的收敛速度和全局搜索能力,从而更快地找到最优解。另外,引入多样性维持机制也是一种重要的改进方法。多样性维持机制可以避免算法陷入局部最优解,同时保持种群的多样性,从而更好地探索整个解空间。
此外,结合进化算法或遗传算法也是一种改进MOPSO算法的有效途径。通过结合不同的优化算法,可以增加算法的搜索能力和收敛性,从而更好地解决多目标优化问题。另外,引入自适应参数调整机制也是一种重要的改进方法。通过根据问题的特性动态调整算法参数,可以提高算法的适应性和鲁棒性,从而更好地适应不同的多目标优化问题。最后,结合机器学习技术和多种启发式搜索策略,以增加算法的多样性和全局搜索能力,也是改进MOPSO算法的有效途径。通过引入更多的智能技术,可以提高算法的预测能力和决策能力,从而更好地探索和利用多目标空间。
总之,改进多目标粒子群算法是一个非常重要的研究课题,通过引入新的思想和技术,可以提高算法的性能和适用性,从而更好地解决实际的多目标优化问题。希望未来能够有更多的研究者投入到这个领域,共同推动多目标优化算法的发展。
2 微电网多目标优化模型
(1) 微电网的运行成本
在并网模式下的目标是最小化微电网的运行成本。
在这里插入图片描述
(2) 微电网的环境保护成本。
在这里插入图片描述
3 算例
本文的微电网系统包含各种分布式电源,包括 PV、WT、DE、MT 和储能。微网中各个 DG的运行参数与成本见表 1,各个 DG 污染物排放系数及成本见表 2,储能参数见表 3。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4 程序运行结果
1)帕累托前沿
在这里插入图片描述
2)总成本最低时光伏消纳
在这里插入图片描述
3)总成本最低时风机消纳
在这里插入图片描述
4)总成本最低时各机组出力
在这里插入图片描述
5 程序
1)主函数

%基于改进粒子群算法的微电网多目标优化调度
clear;
clc;
close all;
%定义全局变量
global P_load; %电负荷
global WT;%风电
global PV;%光伏
global buy_price;
global sell_price;
%数据
data=[52	0	2	0.38	0.36
50	0	2	0.38	0.36
50	0	2	0.38	0.36
51	0	2	0.38	0.36
55	0	2	0.38	0.36
63	0	1	0.38	0.36
70	0	2	0.82	0.36
74	0	1	0.82	0.36
75	4	2	0.82	0.36
78	6	3	1.35	0.36
76	10	8	1.35	0.36
62	12	10	1.35	0.36
60	23	4	1.35	0.36
60	20	3	1.35	0.36
68	6	2	0.82	0.36
78	4	1	0.82	0.36
80	1	2	0.82	0.36
85	0	2	1.35	0.36
90	0	2	1.35	0.36
88	0	3	1.35	0.36
70	0	2.5	1.35	0.36
65	0	2.5	1.35	0.36
63	0	2	0.38	0.36
55	0	1	0.38	0.36
];
P_load=data(:,1);%电负荷(MW)
PV=data(:,2);%光伏(MW)
WT=data(:,3);%风电(MW)
buy_price=data(:,4);%向电网买电价
sell_price=data(:,5);%向电网卖电价
%蓄电池最大放电功率(正表示为电负荷供电,即放电)
BESSMax_dischar=30;
%蓄电池最大充电功率
BESSMax_char=-30;
%柴油机最大发电功率
DEMax=30;
%柴油机最小发电功率
DEMin=6;
%燃气轮机最大发电功率
MTMax=30;
%燃气轮机最小发电功率
MTMin=3;
%主网交互最大功率(正表示为电负荷供电)
GridMax=30;
%主网交互最小功率
GridMin=-30;
%% 调用mopso函数
mm=mopso; %调用mopso函数
nn=length(mm.swarm); %非支配解数目

%% 比较不同目标函数寻优对调度结果的影响
%% 第1种.将两个目标函数值归一化相加,取相加后最小的目标值的粒子,即寻找折衷解并画图
%将非支配解中的运行成本和环境保护成本分别赋值给yyy,xxx
% for i=1:nn
%    yyy(i)= mm.swarm(1,i).cost(1);
%    xxx(i)= mm.swarm(1,i).cost(2);
% end
% m1=max(yyy);
% m2=max(xxx);
% 
% for i=1:nn
%     object(i)= mm.swarm(1,i).cost(1)./m1+ mm.swarm(1,i).cost(2)./m2;
%     f1(i)=mm.swarm(1,i).cost(1)./m1;
%     f2(i)=mm.swarm(1,i).cost(2)./m2;
% end
% [m,p]=min(object); %得到有着最小目标值的微粒所在的行数P
% pg=mm.swarm(1,p).x; %pg为折衷解
% Title = sprintf('折衷解情况下');
%% 第2种寻找总成本最低时的解并画图
for i=1:nn
    object(i)= mm.swarm(1,i).cost(1)+ mm.swarm(1,i).cost(2);
end
[m,p]=min(object); %得到有着最小目标值的微粒所在的行数P
pg=mm.swarm(1,p).x; %pg为总成本最低时的解
Title = sprintf('总成本最低情况下');
%% 第3种寻找运行成本最低时的解并画图
% for i=1:nn
%     object(i)= mm.swarm(1,i).cost(1);
% end
% [m,p]=min(object); %得到有着最小目标值的微粒所在的行数P
% pg=mm.swarm(1,p).x; %pg为运行成本最低时的解
% Title = sprintf('运行成本最低情况下');
%% 第4种寻找环境保护成本最低时的解并画图
% for i=1:nn
%     object(i)= mm.swarm(1,i).cost(2);
% end
% [m,p]=min(object); %得到有着最小目标值的微粒所在的行数P
% pg=mm.swarm(1,p).x; %pg为环境保护成本最低时的解
% Title = sprintf('环境保护成本最低情况下');

%% 不同情况下的解赋值
 for i=1:24
   pg_PV(i)=pg(i);
 end  
 
 for m=25:48
    pg_WT(m-24)=pg(m);
end
for m=49:72
    pg_BESS(m-48)=pg(m);
end
for m=73:96
    pg_DE(m-72)=pg(m);
end
for m=97:120
    pg_MT(m-96)=pg(m);
end
for m=121:144
    pg_grid(m-120)=pg(m);
end
%% 画图
figure(2)
plot(pg_PV,'-*')
hold on;
plot(PV,'-r*')
xlim([1 24])
grid
legend('实际消纳光伏功率','预测光伏功率');
xlabel('时间');
ylabel('功率');
title('光伏发电机')


figure(3)
plot(pg_WT,'-*')
hold on;
plot(WT,'-r*')
xlim([1 24])
grid
legend('实际消纳风电功率','预测风电功率');
xlabel('时间');
ylabel('功率');
title('风力发电机')

figure(4)
plot(pg_DE,'-k*')
hold on;
xlim([1 24])
grid
xlabel('时间');
ylabel('功率');
title('柴油发电机')

figure(5)
plot(pg_BESS,'-*')
xlim([1 24])
grid
xlabel('时间');
ylabel('功率');
title('蓄电池')


figure(6)
plot(P_load,'-c*')
xlim([1 24])
grid
xlabel('时间');
ylabel('功率');
title('微电网负荷')

figure(7)
plot(pg_MT,'-m*')
grid
xlabel('时间');
ylabel('功率');
title('燃气轮机出力')

figure(8)
plot(pg_grid,'-g*')
xlim([1 24])
grid
xlabel('时间');
ylabel('功率');
title('主网交互')

figure(9)
plot(pg_BESS);
hold on
plot(pg_PV,'-d')
grid
plot(pg_WT,'-d');
plot( pg_DE,'-d')
plot(pg_grid,'-d')
plot(pg_MT,'-d')
legend('BESS','PV','WT','DE','grid','MT');
xlabel('时间/h')
ylabel('功率/kw')
title(Title)



2)子函数

%求解多目标粒子群的适应度
function [c,result]=fitness(x)
global P_load;
global buy_price;
global sell_price;
%% 约束条件%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% DE爬坡约束处理
DE_sum=0;
for i=73:95
   DE_temp(i)=abs(x(i+1)-x(i));
   DE_sum=DE_sum+DE_temp(i);
end
f_DE=0;
%阶梯式惩罚系数
if(DE_sum<=345)
   f_DE=0;
elseif(DE_sum>345&&DE_sum<=400)
   f_DE=2;%%%%%迭代次数
elseif(DE_sum>445&&DE_sum<=500)
   f_DE=5;
else
   f_DE=20;
end

%% MT爬坡约束处理
MT_sum=0;
for i=97:119
   MT_temp(i)=abs(x(i+1)-x(i));
   MT_sum=MT_sum+MT_temp(i);
end
f_MT=0;
%MT爬坡阶梯惩罚系数(未满足爬坡约束惩罚)
if(MT_sum<=345)
   f_MT=0;
elseif(MT_sum>345&&MT_sum<=400)
   f_MT=2;%%%%%迭代次数
elseif(MT_sum>445&&MT_sum<=500)
   f_MT=5;
else
   f_MT=20;
end
    
%% 储能SOC约束
%储能荷电状态
SOCMax=150;
SOCMin=5;   
SOC_sum=50; %初始容量
SOC_sum_delt=0;
n=0.9;%充放电效率
for i=49:72 
    if x(i)>0 %充放电
       n=-1/0.9; 
    else
        n=0.9; 
    end
      SOC_sum=SOC_sum+n*x(i);
      if  SOC_sum>SOCMax
    SOC_sum_delt= SOC_sum_delt+max(0,SOC_sum-SOCMax); 
      end
      if   SOC_sum<SOCMin
    SOC_sum_delt= SOC_sum_delt+abs(SOC_sum-SOCMin); 
      end
end 
f_SOC=0.05;
%SOC容量阶梯惩罚系数(未满足SOC约束惩罚)
if(SOC_sum_delt<=0)
    f_SOC=0;
elseif(SOC_sum_delt>0&&SOC_sum_delt<=10)
   f_SOC=1;%%%%%迭代次数
elseif(SOC_sum_delt>10&&SOC_sum_delt<50)
    f_SOC=2;
elseif(SOC_sum_delt>50&&SOC_sum_delt<=100)
    f_SOC=5;
else
    f_SOC=20;
end

%% 电功率平衡约束处理
ele_sum=0;
for i=1:24
   ele_temp(i)=abs(x(i)+x(i+24)+x(i+48)+x(i+72)+x(i+96)+x(i+120)-P_load(i));
   ele_sum=ele_sum+ele_temp(i);
end
f_ele=0;
%电平衡阶梯惩罚系数(未满足电平衡约束惩罚)
if(ele_sum==0)
   f_ele=0.0;
elseif(ele_sum>0&&ele_sum<=100)
   f_ele=1;
elseif(ele_sum>100&&ele_sum<=500)
   f_ele=5;
elseif(ele_sum>500&&ele_sum<=800)
   f_ele=10;
else
   f_ele=50;
end

%% 判断是否为可行解
if ele_sum>4500
    c=1;
else
    c=0;
end
%% 目标函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%目标函数1:运行成本
%% BESS&&DE&&MT (运维成本 && 燃料成本)
C_DE=0;C_BESS=0;C_MT=0;
for i=1:144
    if i>48&&i<73
      C_BESS=C_BESS+(0.026)*abs(x(i));%运维成本
    elseif i>72&&i<97
      C_DE=C_DE+(0.128*x(i))+(0.00011*x(i)^2+0.180*x(i)+6); %运维成本 && 燃料成本
    elseif  i>96&&i<121
     C_MT=C_MT+(0.0293*x(i))+2.55/9.8*x(i)/(0.0753*x(i)^3-0.3095*x(i)^2+0.4174*x(i)+0.1068); %运维成本 && 燃料成本
    end
end
C_OM_F= C_DE+ C_MT+ C_BESS;

%% Grid成本
C_grid=0;
for i=121:144
    if x(i)>0
        C_grid=C_grid+buy_price(i-120)*x(i);
    else
        C_grid=C_grid-sell_price(i-120)*x(i);
    end
end

 
result=C_grid+C_OM_F+f_DE*DE_sum+f_MT*MT_sum+f_SOC*SOC_sum_delt+f_ele*ele_sum;








function [REP]= mopso(c,iw,max_iter,lower_bound,upper_bound,swarm_size,rep_size,grid_size,alpha,beta,gamma,mu,problem)
%mopso 是多目标粒子群优化的实现
% 最小化问题的技术
%% 初始化参数
global PV;
global WT;
%蓄电池最大放电功率(正表示为电负荷供电,即放电)
BESSMax_dischar=30;
%蓄电池最大充电功率
BESSMax_char=-30;
%柴油机最大发电功率
DEMax=30;
%柴油机最小发电功率
DEMin=6;
%燃气轮机最大发电功率
MTMax=30;
%燃气轮机最小发电功率
MTMin=3;
%主网交互最大功率(正表示为电负荷供电)
GridMax=30;
%主网交互最小功率
GridMin=-30;
%% 种群初始化
if nargin==0  %nargin是判断输入变量个数的函数
    c = [0.1,0.2]; % 加速因子
    iw = [0.5 0.001]; % 惯性因子
    max_iter =100; % 最大迭代次数
    %各设备出力约束
    for n=1:144 %粒子长度为144(光伏,风电,储能,柴油,燃气轮机,主网的6*24个小时出力)
         if n<25
            lower_bound(n)=0;
            upper_bound(n) =PV(n);
          end
         if n>24&&n<49
            lower_bound(n)=0;
            upper_bound(n) =WT(n-24);
         end
         if n>48&&n<73
         lower_bound(n)=BESSMax_char;
         upper_bound(n) =BESSMax_dischar;
         end
         if n>72&&n<97
         lower_bound(n)=DEMin;
         upper_bound(n) =DEMax;
         end
          if n>96&&n<121
         lower_bound(n)=MTMin;
         upper_bound(n) =MTMax;
          end
          if n>120
         lower_bound(n)=GridMin;
         upper_bound(n) =GridMax;
         end
    end
    swarm_size=100; % 种群个数
    rep_size=100; % 存档库大小
    grid_size=7; % 每个维度的网格数
    alpha=0.1; % 通货膨胀率
    beta=2; % 领导人选择压力
    gamma=2; % 删除选择压力
    mu=0.1; % 变异速率
    problem=@prob; % 创建函数句柄为problem,函数为pro,可以简单理解为调用
end
%% 初始化粒子
fprintf('初始化种群中\n')
w = @(it) ((max_iter - it) - (iw(1) - iw(2)))/max_iter + iw(2); %更新惯性因子--改进粒子群算法
pm = @(it) (1-(it-1)/(max_iter-1))^(1/mu); %类比遗传算法引入变异操作,更新变异速率,在particle函数的78-84行
swarm(1,swarm_size) = Particle(); %调用Particle函数,从obj中得到swarm_size
for i = 1:swarm_size
    swarm(i)=Particle(lower_bound,upper_bound,problem);%调用Particle函数
    retry = 0;
    while swarm(i).infeasablity > 0 && retry < 100 %循环条件为:无不可行解且次数低于100
        swarm(i)=Particle(lower_bound,upper_bound,problem);%调用Particle函数
        retry = retry + 1;
    end
end
REP = Repository(swarm,rep_size,grid_size,alpha,beta,gamma); %调用Repository函数
%% 算法循环
fprintf('优化算法开始循环中\n')
for it=1:max_iter
    leader = REP.SelectLeader(); %选择领导者
    wc = w(it); %目前的惯性因子
    pc=pm(it); %目前的变异因子
    for i =1:swarm_size %更新种群
        swarm(i)=swarm(i).update(wc,c,pc,leader,problem);
    end
    REP = REP.update(swarm);
    Title = sprintf('迭代第 %d 次 , 存档库内非支配解个数 = %d',it,length(REP.swarm));
    PlotCosts(swarm,REP.swarm,Title) %调用下面的PlotCosts函数
    disp(Title);
end

function PlotCosts(swarm,rep,Title)
    %画出粒子群的动态
figure(1)
feasable_swarm = swarm([swarm.infeasablity]==0); %可行解
infeasable_swarm = swarm([swarm.infeasablity]>0); %非可行解
LEG = {};
if ~isempty(feasable_swarm)
    swarm_costs=vertcat(feasable_swarm.cost);
    plot(swarm_costs(:,1),swarm_costs(:,2),'go')
    hold on
    LEG = {'mospo的可行解'};
    Title = sprintf([Title '\n可行解的个数=%d'],length(feasable_swarm));
end
if ~isempty(infeasable_swarm)
    swarm_costs=vertcat(infeasable_swarm.cost);
    plot(swarm_costs(:,1),swarm_costs(:,2),'ro')
    hold on
    LEG = [LEG, 'mopso的非可行解'];
    if contains(Title,newline)
        Title = sprintf([Title ', 非可行解的个数 =%d'],length(infeasable_swarm));
    else
        Title = sprintf([Title '\n可行解的个数=%d'],length(infeasable_swarm));
    end
end
rep_costs=vertcat(rep.cost);
plot(rep_costs(:,1),rep_costs(:,2),'b*')
xlabel('目标函数1:运行成本')
ylabel('目标函数2:环境保护成本')
grid on
hold off
title(Title)
legend([LEG ,'存档库内非占优解'],'location','best')
drawnow

figure(2)
plot(rep_costs(:,1),rep_costs(:,2),'m*')
xlabel('运行成本')
ylabel('环境保护成本')
grid on
hold off
title('pareto前沿解集')
drawnow
end
end
%多目标粒子这里的程序尽量不要动,直接套用即可
classdef Particle
    properties %定义与obj相关的类变量
        x
        l
        u
        v
        cost
        infeasablity
        pBest
        pBestCost
        pBestinfeasablity
        GridIndex
        isDominated
    end
    methods
        function obj = Particle(lower,upper,problem) %得到粒子
            if nargin > 0
                obj.GridIndex = 0;
                obj.isDominated = false;
                obj.x = unifrnd(lower,upper);
                obj.l = lower;
                obj.u = upper;
                obj.v = zeros(1,max(length(lower),length(upper)));
                [obj.cost, obj.infeasablity] = problem(obj.x);
                obj.pBest = obj.x;
                obj.pBestCost = obj.cost;
                obj.pBestinfeasablity = obj.infeasablity;
            end
        end
        function obj = update(obj,w,c,pm,gBest,problem) %为粒子更新作准备
            obj = obj.updateV(w,c,gBest);
            obj = obj.updateX();
            [obj.cost, obj.infeasablity] = problem(obj.x);
            obj = obj.applyMutatation(pm,problem);
            obj = obj.updatePbest();
        end
        function obj = updateV(obj,w,c,gBest) %更新粒子速度
            obj.v = w.*obj.v + c(1).*rand.*(obj.pBest-obj.x) + c(2).*rand.*(gBest.x-obj.x);
        end
        function obj = updateX(obj) %更新粒子位置
            i=find(or(obj.x+obj.v>obj.u,obj.x+obj.v<obj.l));
            obj.v(i) = -obj.v(i);
            obj.x = max(min(obj.x+obj.v,obj.u),obj.l);
        end
        function obj = updatePbest(obj) %更新个体最优
            if obj.infeasablity == 0
                if obj.pBestinfeasablity > 0
                    obj.pBest = obj.x;
                    obj.pBestCost = obj.cost;
                    obj.pBestinfeasablity = obj.infeasablity;
                elseif all(obj.pBestCost >= obj.cost) && any(obj.pBestCost > obj.cost)
                    obj.pBest = obj.x;
                    obj.pBestCost = obj.cost;
                    obj.pBestinfeasablity = obj.infeasablity;
                end
            else
                if obj.pBestinfeasablity >= obj.infeasablity
                    obj.pBest = obj.x;
                    obj.pBestCost = obj.cost;
                    obj.pBestinfeasablity = obj.infeasablity;
                end
            end
        end
        function obj = applyMutatation(obj,pm,problem) %粒子变异约束
            if rand<pm
                X=obj.Mutate(pm);
                [X.cost,X.infeasablity]=problem(X.x);
                if X.dominates(obj)
                    obj=X;
                elseif ~obj.dominates(X)
                    if rand<0.5
                        obj=X;
                    end
                end
            end
        end
        function obj=Mutate(obj,pm) %粒子变异--改进粒子群算法
            nVar=numel(obj.x);
            j=randi([1 nVar]);
            dx=pm*(obj.u(j)-obj.l(j));
            lb=max(obj.x(j)-dx,obj.l(j));
            ub=min(obj.x(j)+dx,obj.u(j));
            obj.x(j)=unifrnd(lb,ub);
        end
        function d = dominates(obj,obj1) %得到支配个体数
            if obj.infeasablity == 0
                if obj1.infeasablity == 0
                    if all(obj.cost <= obj1.cost) &&  any(obj.cost < obj1.cost)
                        d = true;
                    else
                        d = false;
                    end
                else
                    d = true;
                end
            elseif obj1.infeasablity == 0
                d = false;
            elseif obj.infeasablity < obj1.infeasablity
                d = true;
            else
                d = false;
            end
        end
        function obj=updateGridIndex(obj,Grid) %更新网格数
            nObj=length(obj.cost);
            nGrid=length(Grid(1).LB);
            GridSubIndex=zeros(1,nObj);
            for j=1:nObj
                GridSubIndex(j)=find(obj.cost(j)<Grid(j).UB,1,'first');
            end
            obj.GridIndex=GridSubIndex(1);
            for j=2:nObj
                obj.GridIndex=obj.GridIndex-1;
                obj.GridIndex=nGrid*obj.GridIndex;
                obj.GridIndex=obj.GridIndex+GridSubIndex(j);
            end
        end
    end
    methods (Static)
        function swarm = updateDomination(swarm) %更新支配个体
            for index = 1:length(swarm)
            swarm(index).isDominated = false;
                for i = 1:length(swarm)
                    if i == index
                        continue
                    end
                    if swarm(i).dominates(swarm(index))
                        swarm(index).isDominated = true;
                        break
                    end
                end
            end
        end
    end
end


%得到多目标问题的解
function [y,c] = prob(x)  %c=1则x为非可行解

[c,y(1)] = fitness(x);  %得出粒子的适应度  %%运行成本赋值给y(1)
%% 目标函数2:环境保护成本
C_DE_en=0;C_grid_en=0;C_MT_en=0;
for i=1:144
    if i>72&&i<97
      C_DE_en=C_DE_en+(0.023*680+6*0.306+8*10.09)*x(i); 
    elseif  i>96&&i<121
     C_MT_en=C_MT_en+((0.023*889+6*1.8+8*1.6)*6*x(i));
    end  
end
for i=121:144
    if x(i)>0
        C_grid_en=C_grid_en+(0.023*724+6*0.0036+8*0.2)*x(i);
    else
        C_grid_en=C_grid_en+0;
    end
end
C_en= C_DE_en+ C_MT_en+ C_grid_en;
y(2) =C_en; %环境保护成本赋值给y(2)

end
%%存档库(储藏室)作用:存档,用来储存过去产生的非支配解
%这里的程序尽量不要动,直接套用即可
classdef Repository %储藏室
    properties
        swarm
        rep_size
        Grid
        grid_size
        alpha
        beta
        gamma
    end
    
    methods
        function obj = Repository(swarm,rep_size,grid_size,alpha,beta,gamma) %存档库
            if nargin>0
                obj.rep_size = rep_size;
                swarm = Particle.updateDomination(swarm);
                obj.swarm = swarm(~[swarm.isDominated]);
                obj.grid_size=grid_size;
                obj.alpha=alpha;
                obj.beta = beta;
                obj.gamma = gamma;
                obj.Grid=obj.grid();
                for i = 1:length(obj.swarm)
                    obj.swarm(i) = obj.swarm(i).updateGridIndex(obj.Grid);
                end
            end
        end
        function Grid = grid(obj) %更新网格
            C = vertcat(obj.swarm.cost);
            cmin = min(C,[],1);
            cmax = max(C,[],1);
            dc = cmax - cmin;
            cmin = cmin - obj.alpha * dc;
            cmax = cmax + obj.alpha * dc;
            nObj = size(C,2);
            empty_grid.LB = [];
            empty_grid.UB = [];
            Grid = repmat(empty_grid,nObj,1);
            for j = 1:nObj
                cj = linspace(cmin(j),cmax(j),obj.grid_size+1);
                Grid(j).LB = [-inf, cj];
                Grid(j).UB = [cj, +inf];
            end
        end
        function leader = SelectLeader(obj) %选择领导者
            GI = [obj.swarm.GridIndex];
            OC = unique(GI);
            N = zeros(size(OC));
            for k = 1:length(OC)
                N(k) = length(find(GI==OC(k)));
            end
            P = exp(-obj.beta*N);
            P = P/sum(P);
            sci = Repository.RouletteWheelSelection(P);
            sc = OC(sci);
            SCM = find(GI==sc);
            smi = randi([1 length(SCM)]);
            sm = SCM(smi);
            leader = obj.swarm(sm);
        end
        function obj = DeleteOneRepMemebr(obj) %删除一个存档库的成员
            GI=[obj.swarm.GridIndex];
            OC=unique(GI);
            N=zeros(size(OC));
            for k=1:length(OC)
                N(k)=length(find(GI==OC(k)));
            end
            P=exp(obj.gamma*N);
            P=P/sum(P);
            sci=Repository.RouletteWheelSelection(P);
            sc=OC(sci);
            SCM=find(GI==sc);
            smi=randi([1 length(SCM)]);
            sm=SCM(smi);
            obj.swarm(sm)=[];
        end
        function obj = update(obj,swarm)  %更新
            swarm = Particle.updateDomination(swarm);
            obj.swarm = [obj.swarm,swarm(~[swarm.isDominated])];
            obj.swarm = Particle.updateDomination(obj.swarm);
            obj.swarm = obj.swarm(~[obj.swarm.isDominated]);
            obj.Grid=obj.grid();
            for i = 1:length(obj.swarm)
                obj.swarm(i) = obj.swarm(i).updateGridIndex(obj.Grid);
            end
            Extra=length(obj.swarm)-obj.rep_size;
            for e=1:Extra
                obj=obj.DeleteOneRepMemebr();
            end
        end
    end
    methods (Static)
        function i = RouletteWheelSelection(P) %轮盘赌筛选进行删除
            i = find(rand<=cumsum(P),1,'first');
        end
    end
end


  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 电网是指由可再生能源和传统能源组成,具备一定的独立电力调节能力的小型电网系统。优化调度电网运行的关键环节之一,可有效提高电网能量利用率和经济效益,促进能源的可持续发展。 改进粒子群算法是一种基于模拟智能的优化算法,通过模拟群体的智能行为,逐步迭代寻找最优解。改进粒子群算法具有收敛速度快、全局搜索能力强的特点,因此被广泛应用于各种优化问题中,包括电网优化调度问题。 在电网优化调度中,改进粒子群算法可以用于优化电网的能量分配、经济运行和环境污染等问题,从而实现电网的高效、稳定和环保运行。具体而言,可通过编写matlab代码实现以下步骤: 1. 确定优化目标和约束条件,例如最小化电网总成本、最大化电网能量利用效率、最小化污染排放等。 2. 设计适应度函数,用于评估每个粒子的优化质量,例如采用电网的总负荷、可再生能源供应比例、污染排放量等指标。 3. 初始化粒子群,包括每个粒子的初始位置、速度和适应度值。 4. 根据粒子的个体和社会信息,更新每个粒子的位置和速度,并计算新的适应度值。 5. 根据设定的停止迭代条件,判断算法是否收敛,如果达到停止条件,则输出最优解;否则,返回第4步继续迭代。 通过以上步骤,可以实现基于改进粒子群算法电网优化调度,优化电力系统的能源利用,提高运行效率,减少环境和经济成本。 ### 回答2: 电网是一种分布式能源系统,由多种能源设备组成,如太阳能、风能、燃气等,通常有多种负载,如家庭、商业、工业等。电网优化调度意在通过合理的设备组合和负载优化,达到电网系统的最优性能。改进粒子群算法是一种优化算法,通过模拟鸟群调整个体位置和速度的方式,找到最优解。 基于改进粒子群算法电网优化调度问题,可以先构建目标函数。电网目标函数包括多个方面,如能源损失、供电可靠性、负荷满足率、成本等。通过运用多目标遗传算法等技术,将目标函数综合考虑,得出最优方案。 在实现中,可以利用MATLAB编程语言实现改进粒子群算法。具体过程包括构建目标函数、定义适应度函数、初始化个体位置和速度、设定最大迭代次数等。算法运行完后,得到的最优解便是电网调度的解决方案。 总之,基于改进粒子群算法电网优化调度问题,需要综合考虑多个目标函数,通过建立适合问题的算法模型,得到最优解。具体实践中,MATLAB编程语言能够有效地帮助实现该算法模型。 ### 回答3: 电网是指拥有独立发电能力、储能能力和负荷供应能力的小型电力系统,具有独立性、可靠性、灵活性和节能性等特点。电网优化调度是指通过合理配置和控制电网中各种资源的使用,实现能源的优化分配和经济利用。 目前,粒子群算法是一种十分有效的求解电网优化调度问题的算法。但是,传统的粒子群算法存在着收敛速度慢、精度不高等缺陷。因此,改进粒子群算法被广泛应用于电网优化调度中。 改进粒子群算法主要是基于传统粒子群算法算法模型进行改进,通过引入新的算子、优化权重因子等措施,来提高算法收敛速度和求解精度。在电网优化调度中,改进粒子群算法可以配合优化储能器容量、控制燃料电池运行模式、降低网络损耗和优化电网供电等方案,从而实现电网能源的优化分配和经济利用。 Matlab是一种十分强大的计算软件,可以通过编写程序实现改进粒子群算法电网优化调度。具体的实现方法如下:首先,编写Matlab程序,通过读取电网关键组件的数据,定义适应度函数、求解算法、搜索范围等相关信息。然后,通过改进粒子群算法进行优化求解,并输出优化后的电网能源供应方案。 总之,改进粒子群算法是一种适用于电网优化调度的高效算法,可以通过Matlab等编程软件来实现。通过该算法,可以有效提高电网的能源利用效率,实现电网的可靠、节能供电。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电磁MATLAB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值