【物理应用】基于matlab粒子群配电网重构【含Matlab源码 764期】
作者:互联网
一、简介
1 粒子群算法的概念
粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.
PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。
2 粒子群算法分析
2.1基本思想
粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。下面的动图很形象地展示了PSO算法的过程:
2 更新规则
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
公式(1)的第一部分称为【记忆项】,表示上次速度大小和方向的影响;公式(1)的第二部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;公式(1)的第三部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。
公式(2)和 公式(3)被视为标准PSO算法。
3 PSO算法的流程和伪代码
二、源代码
%主函数
clear
clc
warning off
N=10;%节点总数(包括电源节点)
R=16;%支路总数
sizepop=10;%粒子群种群规模
maxgen=200;%算法最大迭代次数
pop=pop_initial(sizepop,N,R);%种群初始化
Vmax=4;Vmin=-Vmax;%粒子速度的上限与下限
Sigmoid=@(x) 1./(1+exp(-x));
Utility=FAPSO_LDNP(N,pop,Vmax,Vmin,maxgen,sizepop);%调用FAPSO算法求解LDNP问题
%结果显示
figure(4)
plot(Utility)
grid on
xlabel('迭代次数','fontsize',12)
ylabel('投资效益比','fontsize',12)
title('FAPSO迭代收敛图','fontsize',12)
function Utility=FAPSO_LDNP(D,pop,Vmax,Vmin,maxgen,popsize)
vmax=Vmax/4;
vmin=-Vmin/-4;
popmax=5;
popmin=-5;
c1=2;
c2=2;
w=0.8;%固定惯性权重
wmin=0.4;
k1=1.5;%惯性权重调整参数
k2=0.3;
% 产生初始粒子和速度
for i=1:popsize
%随机产生一个种群
pop0(i,:)=5*rands(1,D); %初始种群
V(i,:)=rands(1,D); %初始化速度
%计算适应度
fitness(i)=fun_LDNP(pop0(i,:)); %染色体的适应度
end
% 个体极值和群体极值
[bestfitness,bestindex]=max(fitness);
zbest=pop0(bestindex,:); %全局最佳
gbest=pop0; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值
%加FA改进 分组
Fav=sum(fitness)/popsize;%F_{av}
C_index=find(fitness>=Fav);%C组,第三组,适应值最差的一组 地址变量
lc=length(C_index);
b_index=find(fitness<Fav);%准B组,其中一部分更优的粒子将会被分到A组,剩下的才是真正的B组
lb=length(b_index);
Fav_=0;
for i=1:lb
Fav_=Fav_+fitness(b_index(i));
end
Fav_=Fav_/lb;%F_{av}^'
A_index=find(fitness<Fav_);%A组
la=length(A_index);
B_index=find(fitness>=Fav_&fitness<Fav);%B组
lb=length(B_index);
%算权重
W=zeros(popsize,1);%开辟惯性权重存储空间
for i=1:popsize
if sum(i==A_index)
W(i)=w-(w-wmin)*abs(fitness(i)-Fav_)/(fitnesszbest-Fav_);
elseif sum(i==B_index)
W(i)=w;
elseif sum(i==C_index)
W(i)=1.5-1/(1+k1*exp(-k2*abs(fitnesszbest-Fav_)));
end
end
for i=1:10
[~,~,~]=jiedian(pop(:,:,i));
end
% 迭代寻优
for i=1:maxgen
for j=1:popsize
%速度更新
V(j,:) = W(j)*V(j,:) + c1*rand*(gbest(j,:) - pop0(j,:)) + c2*rand*(zbest - pop0(j,:));
V(j,V(j,:)>vmax)=vmax;
V(j,V(j,:)<vmin)=vmin;
%种群更新
pop0(j,:)=pop0(j,:)+0.1*V(j,:);
pop0(j,pop0(j,:)>popmax)=popmax;
pop0(j,pop0(j,:)<popmin)=popmin;
%适应度值
fitness(j)=fun_LDNP(pop0(j,:));
end
for j=1:popsize
%个体最优更新
if fitness(j) > fitnessgbest(j)
gbest(j,:) = pop0(j,:);
fitnessgbest(j) = fitness(j);
end
%群体最优更新
if fitness(j) > fitnesszbest
zbest = pop0(j,:);
fitnesszbest = fitness(j);
end
end
yy(i)=fitnesszbest;
%惯性权重更新
%加FA改进 分组
Fav=sum(fitness)/popsize;%F_{av}
C_index=find(fitness>=Fav);%C组,第三组,适应值最差的一组 地址变量
lc=length(C_index);
b_index=find(fitness<Fav);%准B组,其中一部分更优的粒子将会被分到A组,剩下的才是真正的B组
lb=length(b_index);
Fav_=0;
for ii=1:lb
Fav_=Fav_+fitness(b_index(ii));
end
Fav_=Fav_/lb;%F_{av}^'
A_index=find(fitness<Fav_);%A组
la=length(A_index);
B_index=find(fitness>=Fav_&fitness<Fav);%B组
lb=length(B_index);
%算权重
W=zeros(popsize,1);%开辟惯性权重存储空间
for ii=1:popsize
if sum(ii==A_index)
W(ii)=w-(w-wmin)*abs(fitness(ii)-Fav_)/(fitnesszbest-Fav_);
elseif sum(ii==B_index)
W(ii)=w;
elseif sum(ii==C_index)
W(ii)=1.5-1/(1+k1*exp(-k2*abs(fitnesszbest-Fav_)));
end
end
end
三、运行结果
四、备注
版本:2014a
标签:index,粒子,PSO,764,算法,pop0,fitness,配电网,源码 来源: https://blog.51cto.com/u_15287606/2976084