function F=fitness(x)
F=0.5-((sin(sqrt(x(1)^2+x(2)^2)))^2-0.5)/(1+0.001*(x(1)^2)+x(2)^2)^2;
function [xm,fv]=PSO(fitness,N,c1,c2,w,M,D)
% fitness:待优化的目标函数;
% N:粒子数目;
% c1:学习因子1;
% c2:学习因子2;
% w:惯性权重;
% M:最大迭代次数;
% D:自变量的个数;
% xm:目标函数取最小值时的自变量值;
% fv:目标函数的最小值。
format long;
for i=1:N
for j=1:D
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
end
end
for i=1:N
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
pg=x(N,:); %pg为全局最优
for i=1:(N-1)
if fitness(x(i,:))<fitness(pg)
pg=x(i,:);
end
end
for t=1:M
for i=1:N %速度、位移更新
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:))<p(i)
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
if p(i)<fitness(pg)
pg=y(i,:);
end
end
pbest(t)=fitness(pg);
end
xm=pg';
fv=fitness(pg);