function [xm,fv,FEs,ft] = PSO(fitness,popsize,c1,c2,w,M,D,lb,ub)
%待优化的目标函数:fitness
%粒子数目:N
%学习因子1:c1
%学习因子2:c2
%惯性权重:w
%最大迭代次数:M
%自变量个数:D
%目标函数取最小值时的自变量值:xm
%目标函数的最小值:fv
format long;
FEs = 0;
for i = 1:popsize
for j = 1:D
x(i,j) = rand*(ub(j)-lb(j))+lb(j);
v(i,j) = randn;
end
end
pg = x(popsize,:);
fpg = fitness(pg);
FEs=FEs+1;
ft(FEs)=fpg;
for i = 1:popsize
fit = fitness(x(i,:));
p(i) = fit;
FEs = FEs + 1;
if fit<ft(FEs-1)
ft(FEs) = fit;
else
ft(FEs) = ft(FEs-1);
end
if fit<fpg
pg = x(i,:);
fpg=fit;
end
y(i,:) = x(i,:);
end
for t = 1:M
for i = 1:popsize
v(i,:) = w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:) = x(i,:) + v(i,:);
for j = 1:D
if x(i,j)>ub(j)
x(i,j) = ub(j);
elseif x(i,j)<lb(j)
x(i,j) = lb(j);
end
end
FEs = FEs + 1;
fit = fitness(x(i,:));
if fit<ft(FEs-1)
ft(FEs) = fit;
else
ft(FEs) = ft(FEs-1);
end
if fit<p(i)
p(i) = fit;
y(i,:) = x(i,:);
end
if p(i)<fpg
pg = y(i,:);
fpg=p(i);
end
end
end
xm = pg;
fv = fpg;
评论1