%% 粒子羣 PSO
clear
clc
%% 繪製原圖
x1 = -15:1:15;
x2 = -15:1:15;
[x1,x2] = meshgrid(x1,x2); %生成網格點
y = x1.^2 + x2.^2 - x1.*x2 - 10*x1 - 4*x2 + 60;
mesh(x1,x2,y)%繪製曲面
hold on
%% 預設參數
n = 100; %粒子數量
d = 2; %變量個數
c1 = 2; %學習因子
c2 = 2;
w = 0.9;%慣性權重
K = 1000;%迭代次數
%% 分佈粒子
x = -10 + 20*rand(n,d);%初始化粒子
v = -5 + 10*rand(n,d);%初始化例子速度
%% 計算適應度
fit = zeros(n,1); %預分配內存
fit_1=zeros(n,1);
for j = 1:n
a=x(j,1);
b=x(j,2);
fit(j) = a^2 + b^2 - a*b - 10*a - 4*b + 60; %計算每一個粒子的適應度
end
%% 計算極值
pbest = x; %初始位置初始化爲個體極值
abest=pbest(:,1);
bbest=pbest(:,2);
fitbest=abest.^2 + bbest.^2 - abest.*bbest - 10*abest - 4*bbest + 60;%保存初始的適應度個體極值
ind = find(min(fit) == fit);%尋找所有極值適應度最小值所在的位置
gbest = x(ind,:); %將該最小個體極值作爲羣體極值
agbest=gbest(1);
bgbest=gbest(2);
fitgbest=agbest.^2 + bgbest.^2 - agbest.*bgbest - 10*agbest - 4*bgbest + 60;%保存初始的適應度羣體極值
% h = scatter3(x(:,1),x(:,2),fit,'o');
%% 更新速度與位置
fitnessbest=zeros(1,1000);
for i = 1:K
% 更新速度與位置
for m = 1:n %
v(m,:) = w*v(m,:) + c1*rand*(pbest(m,:) - x(m,:)) + c2*rand*(gbest - x(m,:));
v(m,find(v(m,:) < -10)) = -10; %尋找更新後速度小於-10的速度,將其值設置爲-10
v(m,find(v(m,:) > 10)) = 10; %尋找更新後速度大於 10的速度,將其值設置爲 10
x(m,:) = x(m,:) + 0.5*v(m,:); %更新每一個粒子羣的位置
x(m,find(x(m,:) < -10)) = -10; %尋找更新後速度小於-10的位置,將其值設置爲-10
x(m,find(x(m,:) > 10)) = 10; %尋找更新後速度大於 10的位置,將其值設置爲 10
% 重新計算適應度
a=x(m,1);
b=x(m,2);
fit(m) = a.^2 + b.^2 - a.*b - 10*a - 4*b + 60; %計算每一個粒子的適應度
if fit(m) < fitbest(m) %該粒子當前位置適應度是否小於上位置()
pbest(m,:) = x(m,:); %更新個體極值
end
if fit(m) < fitgbest
gbest = pbest(m,:);
end
end
abest=pbest(:,1);
bbest=pbest(:,2);
fitbest=abest.^2 + bbest.^2 - abest.*bbest - 10*abest - 4*bbest + 60;%保存本次的適應度個體極值
agbest=gbest(1);
bgbest=gbest(2);
fitgbest=agbest.^2 + bgbest.^2 - agbest.*bgbest - 10*agbest - 4*bgbest + 60;
%保存本次的適應度羣體極值
fitnessbest(i) = fitgbest;
end
plot(fitnessbest)
xlabel('迭代次數');