带收缩因子的PSO优化算法
%--ARPOS
%--帶有收縮因子,并保證種群的多樣性的微粒群算法解決有約束的情況--
?
%清除屏幕
clc
clear
%-----------------------------參數(shù)設(shè)置-------------------------------------
c1 = 2; ? ? ? ? ? ? ?% 學(xué)習(xí)因子1 ,一般在[0,2]
c2 = 2; ? ? ? ? ? ? ?% 學(xué)習(xí)因子2 ,一般在[0,2]
% c1 = 2.04344; ? ? ? ? ? ? ?%學(xué)習(xí)因子1 ,一般在[0,2]
% c2 = 0.94874; ? ? ? ? ? ? ?%學(xué)習(xí)因子2 ,一般在[0,2]
k1 ?= 0.7298; ? ? ? ? ? ? % 收縮因子?
Dimension = 2; ? ? ? ? ? ?% 搜索空間維數(shù)(未知數(shù)個(gè)數(shù))?
Popsize = 20; ? ? ? ? ? ? % 初始化群體個(gè)體數(shù)目?
MaxDT = 100; ? ? ? ? ? ? ?% 最大迭代次數(shù)?
DivH ? ? ?= ? 0.25; ? ? ? % 最大多樣性系數(shù)
DivL ? ? ?= ? 0.0005; ? % 最小多樣性系數(shù)
itera = 1; ? ? ? ? ? ? ? ?% 迭代次數(shù)
%--------------初始化種群的個(gè)體(可以在這里限定位置和速度的范圍)---------------?
% 1)隨機(jī)初始化位置
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)隨機(jī)初始化速度
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); ? ?% 計(jì)算各微粒的適應(yīng)度
Pbest = [x1 x2]; ? ? ? ? ? % 初始化個(gè)體(微粒)最佳位置
Fbest = fit; ? ? ? ? ? ? ? % 初始化個(gè)體(微粒)最佳位置時(shí)的適應(yīng)度
[minfit, indfit] = min(Fbest); ? % 尋找群體全局適應(yīng)度最佳的個(gè)體(微粒)[適應(yīng)度,微粒號(hào)]
PGbest = [x1(indfit) x2(indfit)];?? ?% 全局適應(yīng)度最佳的個(gè)體(微粒)位置
FGbest = minfit; ? ? ? ? ? ? ? ? ? ?% 全局適應(yīng)度最佳的個(gè)體(微粒)適應(yīng)度
dir = 1;
%--------------進(jìn)入主要循環(huán),按照公式依次迭代,直到滿足精度要求---------------?
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;% 慣性權(quán)重,一般取[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); ? ? % 計(jì)算微粒的適應(yīng)度
? ??
%-------------更新個(gè)體(微粒)最佳適應(yīng)度和最佳位置------------- ? ? ?
? ? 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); ? % 在本次迭代中,尋找最佳適應(yīng)度值和微粒號(hào)
%-------------更新全局最佳適應(yīng)度和最佳位置-------------?? ?
? ? if minfit(itera) < PGbest
?? ??? ?PGbest = [x1(indfit) x2(indfit)];?? ?% updating gworst
? ? ? ? FGbest = minfit(itera); ? ? ? ? ? ? % updating gworst
?? ?end;
? ??
%-------------最佳適應(yīng)度和最佳位置-------------?? ? ?
? ? 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('函數(shù)最優(yōu)值與迭代次數(shù)的關(guān)系')
xlabel('迭代次數(shù) i');
ylabel('函數(shù)最優(yōu)值 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('迭代次數(shù) i');
ylabel('dir值'); ? ?
D132?
? ??
? ??
?
總結(jié)
以上是生活随笔為你收集整理的带收缩因子的PSO优化算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通过PSO实现不同函数的目标值计算和搜索
- 下一篇: PSO求解梯级水库优化调度