之前提到过, 无论遗传算法、蚁群算法以及今天要学习的粒子群算法,本质上都是对穷搜算法的精进版本,即通过参照一些自然界的规律来提高搜索的效率。 粒子群算法则是参考了鸟群寻找栖息地的自然现象,它的中心思想是每只鸟既根据自己的历史经验寻找栖息地的同时,也会参考同伴们的经验进行搜索。
从算法流程可以看出来,粒子群算法和蚁群算法等本质上还是很一致的,就是并行地从NNN个随机可行解开始搜索,基于一些启发式的思想优化搜索效率。比如粒子群算法里区别于穷搜算法的点就在于会不断参考粒子自身经验和整个种群的经验。
仿真实例: 用粒子群算法求解f(x,y)=3cos(xy)+x+y2f(x,y)=3\cos(xy) +x + y^2f(x,y)=3cos(xy)+x+y2, x,y取值范围为[−4,4][-4,4][−4,4]:
%%%%%%%%%%%%%%%%%粒子群算法求函数极值%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
N=100; %群体粒子个数
D=2; %粒子维数
T=200; %最大迭代次数
c1=1.5; %学习因子1
c2=1.5; %学习因子2
Wmax=0.8; %惯性权重最大值
Wmin=0.4; %惯性权重最小值
Xmax=4; %位置最大值
Xmin=-4; %位置最小值
Vmax=1; %速度最大值
Vmin=-1; %速度最小值
%%%%%%%%%%%%%%%%初始化种群个体(限定位置和速度)%%%%%%%%%%%%%%%%
x=rand(N,D) * (Xmax-Xmin)+Xmin;
v=rand(N,D) * (Vmax-Vmin)+Vmin;
%%%%%%%%%%%%%%%%%%初始化个体最优位置和最优值%%%%%%%%%%%%%%%%%%%
p=x;
pbest=ones(N,1);
for i=1:Npbest(i)=func2(x(i,:));
end
%%%%%%%%%%%%%%%%%%%初始化全局最优位置和最优值%%%%%%%%%%%%%%%%%%
g=ones(1,D);
gbest=inf;
for i=1:Nif(pbest(i)Vmax) | (v(j,ii)< Vmin)v(j,ii)=rand * (Vmax-Vmin)+Vmin;endif (x(j,ii)>Xmax) | (x(j,ii)< Xmin)x(j,ii)=rand * (Xmax-Xmin)+Xmin;endendend%%%%%%%%%%%%%%%%%%%%记录历代全局最优值%%%%%%%%%%%%%%%%%%%%%gb(i)=gbest;
end
g; %最优个体
gb(end); %最优值
figure
plot(gb)
xlabel('迭代次数');
ylabel('适应度值');
title('适应度进化曲线')
下一篇:【Redis】事务和锁机制