目录
[1 主要内容](#1 主要内容)
[2 部分程序](#2 部分程序)
[3 程序结果](#3 程序结果)
[4 下载链接](#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节点系统运行结果及与原文对比
下为原文结果:
下为原文结果:
下位原文结果: