粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization),缩写为 PSO, 是近年来由J. Kennedy和R. C. Eberhart等开发的一种新的进化算法(Evolutionary Algorithm - EA)。PSO 算法属于进化算法的一种,和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的“交叉”(Crossover) 和“变异”(Mutation) 操作,它通过追随当前搜索到的最优值来寻找全局最优。这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性。粒子群算法是一种并行算法。
算法策略
粒子群算法的目标是使所有粒子在多维超体(multi-dimensional hyper-volume)中找到最优解。首先给空间中的所有粒子分配初始随机位置和初始随机速度。然后根据每个粒子的速度、问题空间中已知的最优全局位置和粒子已知的最优位置依次推进每个粒子的位置。随着计算的推移,通过探索和利用搜索空间中已知的有利位置,粒子围绕一个或多个最优点聚集或聚合。该算法设计玄妙之处在于它保留了最优全局位置和粒子已知的最优位置两个信息。后续的实验发现,保留这两个信息对于较快收敛速度以及避免过早陷入局部最优解都具有较好的效果。这也奠定了后续粒子群算法改进方向的基础。
下面进行代码分析:
clc;
clear
%初始化参数设置
c1 = 1.49445;
c2 = 1.49445;
w = 1;
% c1 和c2一般经验设置为1.5,r1 and r2 的设置不影响程序运行
maxgen = 200;%最大迭代次数
sizepop = 50;%种群大小
nvar = 2;%目标函数的变量数
Vmax = 10;% 速度的范围,一次搜索的距离
Vmin = -10;
popmax = 100;%变量的取值范围
popmin = -100;
%初始化矩阵参数
for i = 1:sizepop
pop(i,:) = (popmax - popmin) *rands(1, nvar)+popmin;%种群初始化,生成一个-100到100的随机数的矩阵
V(i,:) = (Vmax - Vmin ) * rands(1,nvar)+Vmin;%速度初始化
fitnessa(i) = fun(pop(i,:)); %计算得到适应度
end
[bestfitness,bestindex] = min(fitnessa);%最佳适应值及其在种群中的那一只的编号
gbest = pop(bestindex,:);%全局最优
pbest = pop;%个体最优的第一代就是当前位置
fitnesspbest = fitnessa;%个体最优的适应度就是个体计算的适应度 更新位置
fitnessgbest = bestfitness;%全局最优的适应度就是最佳适应度 更新位置
%对参数进行更新循环
for i = 1:maxgen
for j = 1:sizepop
V(j,:) = w .* V(j,:) + c1 *rand * (pbest(j,:) - pop(j,:)) + c2 * rand * (gbest - pop(j,:) );
%上面这个完成了速度的更新
V(j,find( V(j,:) > Vmax )) = Vmax;
V(j,find( V(j,:) < Vmin )) = Vmin; %如果超过边界值就等于边界值 ,这里可以改进
pop(j,:)= pop(j,:) + V(j,:);
pop(j,find( pop(j,:) > popmax )) = popmax ;%如果超过边界值就等于边界值 ,这里可以改进
pop(j,find( pop(j,:) < popmin )) = popmin ;
fitnessa(j) = fun(pop(j,:));
end
%更新全局最优和个体最优值
for j = 1:sizepop
if fitnessa(j) < fitnesspbest(j)
pbest(j,:) = pop(j,:);
fitnesspbest(j) = fitnessa(j);
end
if fitnessa(j) < fitnessgbest
gbest = pop(j,:);
fitnessgbest = fitnessa(j);
end
end
bf (i) = fitnessgbest;
end
plot(bf,'--')
%title('最优个体适应度值');
%xlabel('迭代次数');
%ylabel('函数适应度值');
disp('函数值 变量');
disp([fitnessgbest,gbest]);
legend('PSO')
相关函数自己可以设置