算法示例:
粒子一开始调整的幅度大,越往后调整的幅度越小,来提高精度。
以下代码参考别人博客,链接如下(侵删):
添加链接描述
手动模拟算法matlab代码:
function[xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
% c1,c2:学习因子
% w:惯性权重
% M:最大迭代次数
% D:搜索空间维数
% N:初始化群体个体数目
% 初始化种群的个体(可以在这里限定位置和速度的范围)
format long;
for i = 1:N
for j=1:D
x(i,j) = randn; % 随机初始化位置
v(i,j) = randn; % 随机初始化速度
end
end
% 先计算各个粒子的适应度,并初始化pi和pg
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
% 输出结果
disp('目标函数取最小值时的自变量:')
xm=pg';
disp('目标函数的最小值为:')
fv=fitness(pg);
求解下列函数的最小值:
function F=fitness(x)
F = 0;
for i = 1:30
F = F+x(i)^2+x(i)-6;
end
输入:
x = zeros(1,30);
[xm1,fv1] = PSO(@fitness,50,1.5,2.5,0.5,100,30)
自适应权重算法:
function[xm,fv] = PSO_adaptation(fitness,N,c1,c2,wmax,wmin,M,D)
% c1,c2:学习因子
% wmax:惯性权重最大值
% wmin:惯性权重最小值
% M:最大迭代次数
% D:搜索空间维数
% N:初始化群体个体数目
% 初始化种群的个体(可以在这里限定位置和速度的范围)
for i = 1:N
for j=1:D
x(i,j) = randn; % 随机初始化位置
v(i,j) = randn; % 随即初始化速度
end
end
%先计算各个粒子的适应度,并初始化个体最优解pi和整体最优解pg %
%初始化pi %
for i = 1:N
p(i) = fitness(x(i,:)) ;
y(i,:) = x(i,:) ;
end
%初始化pg %
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 j = 1:N
fv(j) = fitness(x(j,:)) ;
end
fvag = sum(fv)/N ;
fmin = min(fv);
for i = 1:N %更新函数,其中v是速度向量,x为位置,i为迭代特征
if fv(i) <= fvag
w = wmin+(fv(i)-fmin)*(wmax-wmin)/(fvag-fmin) ; %依据早熟收敛程度和适应度值进行调整
else
w = wmax ;
end
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) ;
plot(Pbest)
xlabel('进化次数') ;
ylabel('适应度值') ;
function y = AdaptFunc(x)
y = ((sin(x(1)^2+x(2)^2))^2-cos(x(1)^2+x(2)^2)+1)/((1+0.1*(x(1)^2+x(2)^2))^2)-0.7;
end
[xm,fv] = PSO_adaptation(@AdaptFunc,50,2,2,0.8,0.6,100,2)