代码整理于《MATLAB优化算法案例分析与应用》-余胜威编著;在此感谢
粒子群算法改进
PSO算法改进研究为两个方面:
1.将各种先进理论引入到PSO算法,研究各种改进和PSO算法;
2.将PSO算法和其他智能优化算法相结合,研究各种混合优化算法,达到取长补短、改善算法某方面性能的效果。
(1)PSO算法的惯性权重模型,通过引入惯性权重,提高算法的全局搜索能力。
(2)带邻域操作的PSO模型,克服了PSO模型在优化搜索后期随迭代次数增加搜索结果无明显改变的缺点。
(3)将拉伸技术用于PSO最小化问题的求解,避免了PSO算法易陷于局部最小值的缺点。
(4)用适应度定标的方法对PSO算法进行改进,在算法收敛的前提下能够提高粒子间适应度的差异;在每次迭代中,依据杂交概率选取指定数量的粒子放入一个池中的粒子随机地两两杂交,产生同样数目的孩子粒子,并用孩子粒子代替父母粒子,以保持种群的粒子数目不变。
(5)协同PSO算法,基本思想是用K个相互独立的粒子群分别在D维的目标搜索空间中的不同维度方向上进行搜索。
总结:PSO算法对于求解极值最优问题应用较为广泛,根据约束范围内的所有可能粒子,计算适应度值,通过迭代,最终得到相应的的极值最优解。PSO算法简单,需要调节的参数不多,其次,算法采用实数编码,可直接取目标函数本身作为适应度函数,根据目标函数值进行迭代搜索。且各粒子具有记忆性,算法搜索速度快。
加快PSO算法效率
由于PSO中粒子向自身历史最佳位置和邻域或群体历史最佳位置聚集,形成粒子种群的快速趋同效应,容易出现陷入局部极值、早熟收敛或停止现象。PSO算法主要依赖粒子个数、惯性权重、学习因子以及添加压缩因子等参数。
带惯性权重的PSO算法
常见:线性递减权重、自适应权重和随机权重算法等
1.自适应惯性权重的PSO算法
一般wmax=0.9;wmin=0.6
function[xm,fv] = SAPSO(fitness,N,c1,c2,wmax,wmin,M,D)
%fitness适应度函数;N种群个数;
%c1、c2学习因子;wmax\wmin最大最小惯性权重
%M迭代次数;D种群中个体个数
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 j = 1:N
fv(j) = fitness(x(j,:));
end
favg = sum(fv)/N;
fmin = min(fv);
for i =1:N
if fv(i) <=favg
w = wmin+(fv(i)-fmin)*(wmax-wmin)/(favg-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
r=[1:1:100];
plot(r,pbest,'r--');
xlabel('迭代次数')
ylabel('适应度值')
title('改进的PSO算法收敛曲线')
legend('权重自适应PSO算法')
hold on
xm = pg';
fv = fitness(pg);
end
2.惯性权重线性递减的PSO算法
一般wmax=0.9;wmin=0.4
function[xm,fv] = SAPSO(fitness,N,c1,c2,wmax,wmin,M,D)
%fitness适应度函数;N种群个数;
%c1、c2学习因子;wmax\wmin最大最小惯性权重
%M迭代次数;D种群中个体个数
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
w = wmax-(t-1)*(wmax-wmin)/(M-1);
v(i,:) = w*v(i,:)+c1*rand*(y(i,