function[gbest,M,xmin,fmin]=PSO(fitness,N,c1,c2,w,M,D)
%?待优化的目标函数:fitness?
%?粒子数目:N?
%?学习因子1:c1?
%?学习因子2:c2
%?惯性权重:w?
%?最大迭代次数:M
%?问题的维数:D?
%?目标函数取最小值时的自变量值:xmin
%?目标函数的最小值:fmin?
%?gbest是一存储了所有目标函数的最小值的向量,结合M便于作出收敛图
format long; %设置数据格式
for i=1:N
for j=1:D
x(i,j)=rand; %随机初始化位置
v(i,j)=rand; %随机初始化速度
end
end
for i=1:N %利用循环初始化每个粒子的适应度
fp(i)=fitness(x(i,:));
xp(i,:)=x(i,:); %每个粒子对应的位置
end
xg=x(1,:); %给全局最优函数值的位置xg赋初值
for i=2:N %通过循环比较找出全局最优函数值的位置xg
if fitness(x(i,:))<fitness(xg)
xg=x(i,:);
end
end
for t=1:M
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(xp(i,:)-x(i,:))+c2*rand*(xg-x(i,:)); %更新粒子的速度
x(i,:)=x(i,:)+v(i,:); %更新粒子的位置
if fitness(x(i,:))<fp(i) %通过比较找出个体最优函数值及其位置
fp(i)=fitness(x(i,:));
xp(i,:)=x(i,:);
end
if fp(i)<fitness(xg) %通过比较找出群体最优函数值及其位置
xg=xp(i,:);
end
end
gbest(t)=fitness(xg); %将每个全局最优函数值存储在gbest向量中
end
xmin=xg'; %输出最优位置及函数值
fmin=fitness(xg);