ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【物理应用】基于matlab粒子群配电网重构【含Matlab源码 764期】

2021-07-05 10:03:06  阅读:154  来源: 互联网

标签:index 粒子 PSO 764 算法 pop0 fitness 配电网 源码


一、简介

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有