微粒群算法(PSO)

一.算法介绍 
    粒子群算法(Particle Swarm Optimization,PSO)的基本思想是模拟鸟群随机搜寻食物的捕食行为,鸟群通过自身经验和种群之间的交流调整自己的搜寻路径,从而找到食物最多的地点。其中每只鸟的位置则为自变量组合,每次到达的地点的食物密度即函数值。每次搜寻都会根据自身经验(自身历史搜寻的最优地点)和种群交流(种群历史搜寻的最优地点)调整自身搜寻方向和速度,这个称为跟踪极值,从而找到最优解。
    粒子群算法和其它演化算法相似,都是根据对环境适应度将群体中的个体移动到好的区域。
①相较于传统算法计算速度非常快,全局搜索能力也很强;
②PSO对于种群大小不十分敏感,所以初始种群设为500-1000,速度影响也不大;
③粒子群算法适用于连续函数极值问题,对于非线性、多峰问题均有较强的全局搜索能力。

    粒子群算法中所涉及到的参数有:种群数量,迭代次数,惯性权重,学习因子,空间维数,位置限制,速度限制。其中核心算法公式为: 

             微粒群算法(PSO)_第1张图片

算法流程图为:

                   微粒群算法(PSO)_第2张图片

二.代码:

(1)PSO.m文件

clc;
clear;
close all;  
f= @(x,y)(sin(x)+cos(y)); % 函数表达式  
figure(1);
ezsurf(f,[-3,3,-3,3]);  
N = 100;                         % 初始种群个数  
d = 2;                            % 空间维数  
ger = 100;                     % 最大迭代次数 
w = 0.8;                         % 惯性权重  
c1 = 0.5;                        % 自我学习因子  
c2 = 0.5;                        % 群体学习因子   
x =  -3+6* rand(N, d);   %初始种群的位置  
v = rand(N, d);               % 初始种群的速度  
xm = x;                          % 每个个体的历史最佳位置  
ym = zeros(1, d);           % 种群的历史最佳位置  
fxm = zeros(N, 1);          % 每个个体的历史最佳适应度  
fym = -inf;                      % 种群历史最佳适应度  
hold on  
title('初始状态图');  
figure(2)  
%% 群体更新  
iter = 1;  
record = zeros(ger, 1);          % 记录器  
while iter <= ger  
     fx = matrixdeal(x) ; % 个体当前适应度     
     for i = 1:N        
        if  fxm(i) < fx(i)  
            fxm(i) = fx(i);    % 更新个体历史最佳适应度  
            xm(i,:) = x(i,:);   % 更新个体历史最佳位置  
        end   
     end  
if fym < max(fxm)  
        [fym, nmax] = max(fxm);   % 更新群体历史最佳适应度  
        ym = xm(nmax, :);      % 更新群体历史最佳位置  
 end  
    v = v * w + c1 * rand * (xm - x) + c2 * rand * (repmat(ym, N, 1) - x);% 速度更新  
     x = x + v;% 位置更新  
    record(iter) = fym;%最大值记录  
      ezsurf(f,[-3,3,-3,3]); 
      plot3(x(:,1),x(:,2),matrixdeal(x),'g*');
      pause(0.1)
    iter = iter+1;  
end  
figure(3);
plot(record);title('收敛过程')  
figure(4);
ezsurf(f,[-3,3,-3,3]); 
hold on;
plot3( x(:,1),x(:,2), matrixdeal(x), 'g *');title('最终状态位置')  
disp(['最大值:',num2str(fym)]);  

disp(['变量取值:',num2str(ym)]); 

(2)matrixdeal.m

function   l=matrixdeal(x)
f= @(x,y)(sin(x)+cos(y));
[m,n]=size(x);
l=zeros(m,1);
for i=1:m
    l(i)=f(x(i,1),x(i,2));
end

end


三.实验结果

      微粒群算法(PSO)_第3张图片    微粒群算法(PSO)_第4张图片

      微粒群算法(PSO)_第5张图片   微粒群算法(PSO)_第6张图片

你可能感兴趣的:(微粒群算法(PSO))