【Matlab复现】基于自适应遗传算法的分布式电源优化配置

发布时间:2024年01月11日

目录

1?主要内容

?2?部分程序?

3?程序结果

4 下载链接


1?主要内容

该程序采用自适应遗传算法优化分布式电源的配置问题,以投资运行成本、网络损耗成本、购电成本和碳排放成本之和作为优化目标,潮流计算采用前推回代法进行计算,程序不止复现了参考文献的33节点系统,同时也实现了118节点系统配电网络的选址定容模型,因此文末链接的程序包包括两部分,一个是118节点系统优化程序,一个是33节点系统优化程序,该程序采用matlab编写,注释清晰!

  • 自适应遗传算法实现方式

??

    %**************变异率自适应************
    if fit1(k)>=fit_avg
        pmut=proc1*(1/(pmut1-pmut2+exp((fit1(k+1)-fit_avg)/(fit1(n)-fit_avg))));
    else
        pmut=k2*pmut1;
    end
    %************************************
?
    rk=rand();
    if rk1;%随机产生变异点 # fix(x)向0方向取整 #
        if pos==1 %出口断路器位置不允许变化
              pos=pos+1;
        end
        pop(k,pos)=rand()*(pmax/10);%对变异点进行变异
        %****************原来程序**************
%         if sum(pop)>(pmax/10)
%             pop=floor(pop*((pmax/10)/sum(pop)));
%         end
        %**********************************
    end

?2?部分程序?

%% 遗传算法
pop=encode(n_point,n,pmax); %用编码函数求得初始种群
gen=0;%代数初始化 
t_cal=1; % 计算迭代次数
L=30; %记忆的群体的大小
?
while(gen<=N_gen)
    time(t_cal)=t_cal;
    %普通遗传算法流程
    fval=zeros(1,n);%初始化函数值
    fit=zeros(1,n);%初始化适应度
    for i=1:n
        fval(i)=fun(pop(i,:),line,line1,LOAD); %求个体的函数值,目标函数
    end
    fval_avg(time(t_cal))=mean(fval);%记录每代个体函数值平均值
    %fval=fval-min(fval);%保证适应度为正值
    fsum=sum(fval);%总适应度
    fit_avg=fsum/n;%计算种群适应度平均值
    fit=fval/fsum;%求个体的适应度(归一化)
    [fit1,index]=sort(fit); %将fit数组从小到大排序,并存在数组fit1中;同时,将对应的数组下标值存在数组index中
    popfx=pop(index(1:L),:); %存储记忆的个体
    
    best=pop(index(1),:);%记录每代的最优值,保留在变量best中     #因为从小到大排列完,n=100时是最优个体#
    best_fit(1,gen+1)= fun(pop(index(1),:),line,line1,LOAD);
    fval_best(time(t_cal))=fun(best,line,line1,LOAD);%求出每代最优个体的函数值,保存在数组 fval_best中
    fsum=sum(1./fval);%总适应度倒数
    fit=(1./fval)/fsum;
    q(1)=fit(1);
    for i=2:n
        q(i)=q(i-1)+fit(i);%累加个体适应度形成赌轮
    end
    pop=select(pop,q,n);%选择
    pop=crossover(pop,pcro1,pcro2,n,n_point,pmax,fit1,fit_avg);%交叉
    pop=mutation(pop,pmut1,pmut2,n,n_point,pmax,fit1,fit_avg);%变异 
?
    %**************************小生境技术******************************
    pophe=[popfx;pop]; %总个体
    d=0;
    fval1=zeros(1,n+L);
    for i=1:1:L+n
        fval1(1,i)=fun(pophe(i,:),line,line1,LOAD);
    end
    for i=1:1:L+n-1
        for j=i+1:1:L+n
            sumd1=sum(((pophe(i,:)-pophe(j,:)).^2));
            d=d+sqrt(sumd1);
        end
    end
    
    sum1=0;
    for i=1:1:L+n-1
        for j=i+1:1:L+n
            sum1=sum1+1;
        end
    end
    radius=d/sum1; %这个半径 我看了一下就是输出数值 不清楚作用 我没有改
    radius=radius/(gen+130000);
    for i=1:1:L+n-1
        for j=i+1:1:L+n
            sumd2=0;
            for l=1:1:n_point
                d2=((pophe(i,l)-pophe(j,l))^2);
                sumd2=sumd2+d2;
            end
            d(i,j)=sqrt(sumd2);
            if d(i,j) < radius
                if fval1(i)10000000;
                else
                    fval1(i)=fval1(i)+10000000;
                end
            end
            
        end
    end
    
   [fn1,fx1]=sort(fval1);
   pop=pophe(fx1(1:n),:);
?
    %*******************小生境算法*******************************
    
    
    %***************添加的程序**********************
    % 如果不加这段,交叉变异后有可能会越限,超过(分布式电源接入总容量不超过系统总负荷20%)
    
    for ii=1:n
        total_dg(ii)=sum(pop(ii,:));
    end
    
    for i=1:n
        if total_dg(i)>(pmax/10)
            pop(i,:)=floor(pop(i,:)*((pmax/10)/total_dg(i)));  %化成小于1,#floor()不大于自变量的最大整数#
        end
    end
     
      for i=1:n
            for j=1:n_point
        if  pop(i,j)>111.1
            pop(i,j)=111.1; 
    
        %微型燃气轮机最大输出功率不超过300Kw#
        end
        end
      end
   for i=1:n
            for j=1:n_point
        if  pop(i,j)<80
            pop(i,j)=0; 
    
        %微型燃气轮机最大输出功率不超过300Kw#
        end
        end
      end
    %****************************************************
    pop(n,:)=best;
    gen=gen+1;%下一代
    t_cal=t_cal+1;
    
end
?

3?程序结果

118节点系统运行结果

33节点系统运行结果及与原文对比

下为原文结果:

下为原文结果:

下位原文结果:

4 下载链接

文章来源:https://blog.csdn.net/superone89/article/details/135515093
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。