凡亿教育-思敏
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | 基于遗传算法的微电网经济运行优化matlab程序
基于遗传算法的微电网经济运行优化matlab程序

摘 要: 微电网作为智能电网的一部分,是分布式电源接入电网的一种有效手段,微电网经济运行是其中一个重要研究方面。考察微电网经济性,通常是从最小运行成本和最小环境污染物排放成本两方面入手进行微电网的多目标优化,通过给适应度函数设置权重系数,将多目标函数转换为单目标函数。结合具体的微电网系统算例进行了仿真研究,结果显示: 运用权重系数法能够使优化目标中经济成本与环境成本达到一个相对平衡的状态,实现了微电网经济运行。

关键词: 微电网; 遗传算法; 多目标优化; 权重系数法


1 微电网电源构成

1.1  微型燃气轮机( MT)

微型燃气轮机利用天然气、沼气等多种燃料提供热能与电能。

20614d7baf69625b5a4a04f70b4473.jpg


1.2 光伏电池( PV)

光伏电池将太阳能转化为直流电能,其是一种非线性电能,电压与电流随着光照强度和温度的改变呈现出非线性。

dce33f6642e7dcf28d65946cc09649.jpg

1.3 风力发电( WT)

风力发电是利用风电机组叶片从风中获得能量转换为机械能,然后传送给发电机,转化为电能,因此风力发电燃料成本和气体排放治理成本为 0。风力发电机组的输出功率与风速有关

bfcba2a718a62eeb067ce01917d818.jpg

1.4 蓄电池储能( SB)

微电网中蓄电池充放电过程交替进行,充电达到额定容量后进入放电过程,放电达到 SOC ( 荷电状态) 为额定容量的 30% 时,停止放电,进入充电。
2 微电网的运行优化
2.1 目标函数

1) 运行成本目标函数为

7a509c4e0787dd7af6622720fa8d41.jpg

2) 环境成本目标函数为

ff3a7c4b746d13003051e77613ff7f.jpg

2.2 约束条件

1) 功率平衡约束:

682d1c3c0e39520ff887afb772f9a6.jpg

2) 微电源出力约束:

0fe3085250f0b6c3603f6cdb1f57d7.jpg

3 算例分析

夏季一天24 h 电负荷、光伏电池和风力发电机的输出功率已知。另外,燃气轮机额定功率为 120kW,蓄电池最大输出功率为20 kW,按照对蓄电池运行策略的控制,并网方式时随时可以放电和充电。


4 算例结果如下

1)迭代结果

cebf83101ed07a2331cc61ab5e9eda.jpg


2)光伏、风电出力

eeb036c1327e1d99b287396020d1f4.jpg


3)微型燃机、蓄电池出力

877ca33087b329a1b2d8c37aabfb44.jpg


5 matlab程序

1)主函数


%% 清空环境clccleartic;close allglobal Load pv wt%% 24小时负荷,光伏与风力Load=[101.049,79.991,41.862,101.312,67.139,82,85.085,110.875,115.249,120.687,98.786,103.944,121.629,136.151,137.752,118.824,139.221,157.158,101.689,127.4,135.312,96.692,90.243,109.587];%负荷.pv=[0,0,0,0,0,0.6,2.4,10.5,30,69,69.9,95.4,129.9,111,120.9,99,71.4,39.9,12.9,0.9,0,0,0,0];%光伏发电wt=10*[2.67,2.67,2.34,3.12,3.29,4.76,4.77,4.24,3.81,4.59,3.9,4.94,3.55,4.33,3.21,3.29,3.03,3.64,3.73,2.6,3.38,3.12,3.46,3.64];%风力发电%% 遗传算法参数MAXGEN=200;                         %进化代数sizepop=40;                       %种群规模pcross=0.6;                      %交叉概率pmutation=0.01;                  %变异概率lenchrom=ones(1,48);                    %变量字串长度,48个变量bound=[-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  20-20  2030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  12030  120];                 %BS、DE变量范围trace=zeros(1,MAXGEN);%% 个体初始化gen=1;fprintf('%d ',gen);individuals=struct('fitness',zeros(1,sizepop), 'chrom',[],'pgrid',[],'Ebat',[]);  %种群结构体bestfitness=[];                                              %种群最佳适应度bestchrom=[];                                                %适应度最好染色体% 初始化种群for i=1:sizepop    individuals.chrom(i,:)=Code(lenchrom,bound);       %随机产生个体    X=individuals.chrom(i,:);    [money pgrid Ebat]=fun(X);    individuals.fitness(i)=money;                     %个体适应度    individuals.pgrid(i,:)=pgrid;    individuals.Ebat(i,:)=Ebat;end%找最好的染色体[bestfitness bestindex]=min(individuals.fitness);bestchrom=individuals.chrom(bestindex,:);  %最好的染色体bestpgrid=individuals.pgrid(bestindex,:);bestEbat=individuals.Ebat(bestindex,:);
% 记录每一代进化中最好的适应度和平均适应度trace(1)=bestfitness;
%% 进化开始for gen=2:MAXGEN%      fprintf('%d ',gen);     % 选择操作     individuals=Select(individuals,sizepop);      % 交叉操作     individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);     % 变异操作     individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,[gen MAXGEN],bound);        % 计算适应度     for j=1:sizepop        X=individuals.chrom(j,:);        [money pgrid Ebat]=fun(X);        individuals.fitness(j)=money;        individuals.pgrid(j,:)=pgrid;        individuals.Ebat(j,:)=Ebat;     end      %找到最小和最大适应度的染色体及它们在种群中的位置    [newbestfitness,newbestindex]=min(individuals.fitness);        % 代替上一次进化中最好的染色体    if bestfitness>newbestfitness        bestfitness=newbestfitness;        bestchrom=individuals.chrom(newbestindex,:);        bestpgrid=individuals.pgrid(newbestindex,:);        bestEbat=individuals.Ebat(newbestindex,:);    end    trace(gen)=bestfitness; %记录每一代进化中最好的适应度和平均适应度end%进化结束time=toc;%% 结果显示bestfitnessX=X';disp(['运行时间time:',num2str(time)]);
%% 画图figureplot(1:MAXGEN,trace);xlabel('迭代次数');ylabel('适应度');title('目标优化结果')
figureplot(Load ,'-*');xlabel('时间');ylabel('负荷');title('负荷曲线')hold onplot(pv,'-.');xlabel('时间');ylabel('出力');title('光伏出力曲线')hold onplot( wt,'-o');xlabel('时间');ylabel('出力');title('风电光伏出力曲线')legend('负荷','光伏','风电');
figureplot( X(1:24),'-o');xlabel('时间');ylabel('出力');title('蓄电池微型燃机出力曲线')hold onplot( X(25:48),'-d');plot(pgrid,'-s') legend('蓄电池','微型燃机','电网购电');


2)子函数

子函数1


function flag=test(lenchrom,bound,code)% lenchrom   input : 染色体长度% bound      input : 变量的取值范围% code       output: 染色体的编码值
flag=1;[n,m]=size(code);
for i=1:n    if code(i)1) || code(i)>bound(i,2)        flag=0;    endend


子函数2


function ret=Select(individuals,sizepop)% 本函数对每一代种群中的染色体进行选择,以进行后面的交叉和变异% individuals input  : 种群信息% sizepop     input  : 种群规模% opts        input  : 选择方法的选择% ret         output : 经过选择后的种群
individuals.fitness= 1./(individuals.fitness);sumfitness=sum(individuals.fitness);sumf=individuals.fitness./sumfitness;index=[];for i=1:sizepop   %转sizepop次轮盘    pick=rand;    while pick==0        pick=rand;    end    for j=1:sizepop        pick=pick-sumf(j);        if pick<0<>

           index=[index j];            break;  %寻找落入的区间,此次转轮盘选中了染色体i,注意:在转sizepop次轮盘的过程中,有可能会重复选择某些染色体        end    endendindividuals.chrom=individuals.chrom(index,:);individuals.fitness=individuals.fitness(index);ret=individuals;


子函数3


function ret=Mutation(pmutation,lenchrom,chrom,sizepop,pop,bound)% 本函数完成变异操作% pcorss                input  : 变异概率% lenchrom              input  : 染色体长度% chrom                 input  : 染色体群% sizepop               input  : 种群规模% pop                   input  : 当前种群的进化代数和最大的进化代数信息% ret                   output : 变异后的染色体
for i=1:sizepop      % 随机选择一个染色体进行变异    pick=rand;    while pick==0        pick=rand;    end    index=ceil(pick*sizepop);    % 变异概率决定该轮循环是否进行变异    pick=rand;    if pick>pmutation        continue;    end    flag=0;    while flag==0        % 变异位置        pick=rand;        while pick==0            pick=rand;        end        pos=ceil(pick*sum(lenchrom));  %随机选择了染色体变异的位置,即选择了第pos个变量进行变异        v=chrom(i,pos);        v1=v-bound(pos,1);        v2=bound(pos,2)-v;        pick=rand; %变异开始        if pick>0.5            delta=v2*(1-pick^((1-pop(1)/pop(2))^2));            chrom(i,pos)=v delta;        else            delta=v1*(1-pick^((1-pop(1)/pop(2))^2));            chrom(i,pos)=v-delta;        end   %变异结束        flag=test(lenchrom,bound,chrom(i,:));     %检验染色体的可行性    endendret=chrom;


子函数4


function [y pgrid Ebat]=fun(X)%% 目标函数global Load pv wt% 输入     x:二进制编码%   lenchrom:各变量的二进制位数% 输出     Y:目标值%          X:十进制数%X(1-24)为蓄电池出力;X(25-48)为柴油机%% 计算适应度-函数值prem=Load-(pv wt);price=[0.2452,0.1839,0.1226,0.1226,0.0613,0.1839,0.3065,0.4291,0.5517,0.5517,0.8582,1.0421,1.0421,1.5325,1.0421,0.7969,0.4291,0.3678,0.3678,0.4291,0.4291,0.3678,0.3065,0.2452];%电价pgrid=zeros(1,24);$小时电网交互功率cgrid=zeros(1,24);%电网交互费用cde=zeros(1,24);%柴油机费用Ebat=zeros(1,24);y1=zeros(1,24);Ebatmax=551.8;Ebatmin=0.4*Ebatmax;Ebat0=0.8*Ebatmax;for i=1:24    if i==1        Ebat(1)=Ebat0*(1-0.0001) X(1)*1*0.9;    else        Ebat(i)=Ebat(i-1)*(1-0.0001) X(i)*1*0.9;    end    cde(i)=7.36*(0.08*120 X(i 24)*0.25) 0.088*X(i 24) 0.7621*X(i 24);%柴油机燃料 运维 环境    pgrid(i)=prem(i)-X(i)-X(i 24);    cgrid(i)=price(i)*pgrid(i);%电网交互成本    y1(i)=cde(i) cgrid(i) pv(i)*0.0096 wt(i)*0.0296 10000*abs(max(0,Ebat(i)-Ebatmax)) 10000*abs(min(0,Ebat(i)-Ebatmin));endy=sum(y1);


子函数5


function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)%本函数完成交叉操作% pcorss                input  : 交叉概率% lenchrom              input  : 染色体的长度% chrom                 input  : 染色体群% sizepop               input  : 种群规模% ret                   output : 交叉后的染色体
for i=1:sizepop         % 随机选择两个染色体进行交叉    pick=rand(1,2);    while prod(pick)==0        pick=rand(1,2);    end    index=ceil(pick.*sizepop);    % 交叉概率决定是否进行交叉    pick=rand;    while pick==0        pick=rand;    end    if pick>pcross        continue;    end    flag=0;    while flag==0        % 随机选择交叉位置        pick=rand;        while pick==0            pick=rand;        end        pos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同        pick=rand; %交叉开始        v1=chrom(index(1),pos);        v2=chrom(index(2),pos);        chrom(index(1),pos)=pick*v2 (1-pick)*v1;        chrom(index(2),pos)=pick*v1 (1-pick)*v2; %交叉结束        flag1=test(lenchrom,bound,chrom(index(1),:));  %检验染色体1的可行性        flag2=test(lenchrom,bound,chrom(index(2),:));  %检验染色体2的可行性        if   flag1*flag2==0            flag=0;        else flag=1;        end    %如果两个染色体不是都可行,则重新交叉    endendret=chrom;


子函数6


function ret=Code(lenchrom,bound)%本函数将变量编码成染色体,用于随机初始化一个种群% lenchrom   input : 染色体长度% bound      input : 变量的取值范围% ret        output: 染色体的编码值
flag=0;while flag==0    pick=rand(1,length(lenchrom));    ret=bound(:,1)' (bound(:,2)-bound(:,1))'.*pick; %线性插值    flag=test(lenchrom,bound,ret);             %检验染色体的可行性end

感谢阅读,欢迎关注‘电磁MATLAB’

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论