帶收縮因子的PSO優化演演算法

2022-01-01 11:00:09


%--ARPOS
%--帶有收縮因子,並保證種群的多樣性的微粒群演演算法解決有約束的情況--

 

%清除螢幕
clc
clear

%-----------------------------引數設定-------------------------------------
c1 = 2;              % 學習因子1 ,一般在[0,2]
c2 = 2;              % 學習因子2 ,一般在[0,2]
% c1 = 2.04344;              %學習因子1 ,一般在[0,2]
% c2 = 0.94874;              %學習因子2 ,一般在[0,2]
k1  = 0.7298;             % 收縮因子 
Dimension = 2;            % 搜尋空間維數(未知數個數) 
Popsize = 20;             % 初始化群體個體數目 
MaxDT = 100;              % 最大迭代次數 
DivH      =   0.25;       % 最大多樣性係數
DivL      =   0.0005;   % 最小多樣性係數

itera = 1;                % 迭代次數

%--------------初始化種群的個體(可以在這裡限定位置和速度的範圍)--------------- 

% 1)隨機初始化位置
x1 = rand(Popsize,1)*(100-13) + 13;         % x1 = [13,100]
x2 = rand(Popsize,1)*100;                   % x2 = [0, 100]

x1minmax = [13 100];
x2minmax = [0 100];
sumL = sqrt((x1minmax(2)-x1minmax(1))^2 + (x2minmax(2)-x2minmax(1))^2);

% 2)隨機初始化速度
v1max = 0.5*( max(x1) - min(x1));
v2max = 0.5*( max(x2) - min(x2));
v1 = rand(Popsize,1) * v1max;
v2 = rand(Popsize,1) * v2max;

fit = fitness(x1,x2,itera,Popsize);    % 計算各微粒的適應度
Pbest = [x1 x2];           % 初始化個體(微粒)最佳位置
Fbest = fit;               % 初始化個體(微粒)最佳位置時的適應度
[minfit, indfit] = min(Fbest);   % 尋找群體全域性適應度最佳的個體(微粒)[適應度,微粒號]
PGbest = [x1(indfit) x2(indfit)];    % 全域性適應度最佳的個體(微粒)位置
FGbest = minfit;                    % 全域性適應度最佳的個體(微粒)適應度

dir = 1;
%--------------進入主要回圈,按照公式依次迭代,直到滿足精度要求--------------- 
for itera=2:MaxDT
    
     div1 = diversity(Popsize, Dimension, Pbest, sumL);
    if dir > 0 && div1 < DivL
        dir = -1; 
    elseif dir < 0  && div1 > DivH
        dir = 1;
    end
    
    dir1(itera) = dir;

    w = 1.2-1.1*itera/MaxDT;% 慣性權重,一般取[0,1.4],但[0.8,1.2]收斂速度更快 
%-------------更新粒子飛行速度-------------
v1 = k1*(w * v1 + dir*(c1 * rand * (Pbest(:,1) - x1) + c2 * rand * (PGbest(1) - x1)));    % 更新 v1
v2 = k1*(w * v2 + dir*(c1 * rand * (Pbest(:,2) - x2) + c2 * rand * (PGbest(2) - x2)));    % 更新 v2
    
%-------------限制粒子飛行速度-------------    
    v1(find( v1 > v1max)) = v1max;  v1(find( v1 < -v1max)) = -v1max;
    v2(find( v2 > v2max)) = v2max;  v2(find( v2 < -v2max)) = -v2max;
    
%-------------更新粒子位置 -------------       
    x1 = x1 + v1;            % 更新 x1
    x2 = x2 + v2;            % 更新 x2
    
%-------------限制粒子位置-------------       
    x1(find( x1 > 100 ))  = 100; x1(find( x1 < 13 )) = 13;
    x2(find( x2 > 100 ))  = 100; x2(find( x2 < 0 )) =  0;
        
    [new_fit]= fitness(x1, x2, itera, Popsize);     % 計算微粒的適應度
    
%-------------更新個體(微粒)最佳適應度和最佳位置-------------      
    for i = 1 : Popsize
        if  new_fit(i) < Fbest(i)
            Pbest(i,:) = [x1(i) x2(i)];
            Fbest(i) = new_fit(i);
        end
    end

    [minfit(itera), indfit] = min(new_fit);   % 在本次迭代中,尋找最佳適應度值和微粒號

%-------------更新全域性最佳適應度和最佳位置-------------    
    if minfit(itera) < PGbest
        PGbest = [x1(indfit) x2(indfit)];    % updating gworst
        FGbest = minfit(itera);             % updating gworst
    end;
    
%-------------最佳適應度和最佳位置-------------      
    PG_BESTx(itera,:) = [x1(indfit) x2(indfit)];
    FG_BEST(itera) =  opti(PGbest(1),PGbest(2));
end    
 PGbest
%  FGbest
% PG_BESTx
min(FG_BEST)
%-------------繪圖-------------    
figure(1)
grid on
t = 1:MaxDT;

subplot(2,2,1);
plot(t,FG_BEST,'b');
grid on
title('函數最優值與迭代次數的關係')
xlabel('迭代次數 i');
ylabel('函數最優值 FG-BEST');

subplot(2,2,2);
plot(PG_BESTx(t,1),PG_BESTx(t,2),'*b');
hold on
plot(PG_BESTx(MaxDT,1),PG_BESTx(MaxDT,2),'dr','LineWidth',2);
grid on
title('最佳微粒位置')
xlabel('微粒位置x(1)');
ylabel('微粒位置x(2)');

subplot(2,2,3);
plot(t,dir1,'db');
grid on
title('diversity')
xlabel('迭代次數 i');
ylabel('dir值');    
D132