%--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