目录
前言
个人认为粒子群算法和遗传算法思想都很接近,都是一个通过对比去寻找最优解的过程,如果对比我比你的"好",那么我便取代你的思想。
遗传算法的主要步骤为初始化、编码、通过比叫去选择和交叉以及变异几个过程。
粒子群算法的主要步骤为初始化、粒子速度和位置更新、通过比对极值更新几个过程。
Pi表示个体极值位置更新(所有粒子自己本身在迭代过程中搜索的位置,如:第i个粒子在迭代中的数据为Pi(i,:)),Pg表示群体极值位置(1个粒子),Xi表示当代种群所有粒子的位置。
注:应该先速度更新,再位置更新!
下面我们采用同一个例子对其求最大值和最小值的分析
1.粒子群算法寻优
由于粒子群需要初始化位置和速度,这里暂定位置范围/x自变量取值范围为[pi/2 10],速度[-0.5 0.5],这里采用动态惯性权重,推荐读者先把我的上篇文章进行阅读:
粒子群算法PSO求解最大值和最小值案例(超详细注释)_Mr. 邹的博客-CSDN博客
1.1 求目标函数最大值
适应度函数:
function y = fobj(x)
%x 输入粒子的位置
%y 输出粒子适应度值
y = -5*sin(x(1))*sin(x(2))*sin(x(3))*sin(x(4))*sin(x(5))-...
sin(5*x(1))*sin(5*x(2))*sin(5*x(3))*sin(5*x(4))*sin(5*x(5))+8;
主程序(运行文件):
clear all
clc
%参数
p = struct('popsize',50,'T',500,'c1',2,'c2',2,'w_init',0.9,'w_end',0.4,'vmax',0.5,'vmin',-0.5);
lb = pi/2;ub = 10;%位置范围
dim = 5; %维度/变量个数
N = p.popsize; %种群大小/规模
T = p.T; %迭代/搜索次数
c1 = p.c1; %个体加速度因子
c2 = p.c2; %群体加速度因子
% 初始化
v = rand(N,dim);%定义初始时刻粒子速度为0
% v = p.vmax*rand(N,dim);%不定义为0也可以
x = (ub - lb)*rand(N,dim) + lb;%初始化粒子位置
for i = 1:N
fitness(i) = fobj(x(i,:));%取目标函数为适应度函数
end
[bestf,index] = max(fitness);%求目标函数最小值,也是适应度函数的最小值
gbest = x(index,:);%全局最优的一个粒子位置
pbest = x;%pbest指当代所有粒子的位置
pfitness = fitness;%个体适应度值,即将所有粒子的位置代入适应度函数求得
% 迭代寻优
t = 1;
while t<T
% 计算惯性因子
w = (p.w_init - p.w_end)*(T-t)/T + p.w_end;
for i = 1:N
% 更新速度
v(i,:) = w*v(i,:) + c1*rand*(pbest(i,:) - x(i,:)) + c2*rand*(gbest - x(i,:));
Flagvmax = v(i,:)>p.vmax;
Flagvmin = v(i,:)<p.vmin;
v(i,Flagvmax) = p.vmax;
v(i,Flagvmin) = p.vmin;
% 更新位置
x(i,:) = x(i,:) + v(i,:);
Flagub = x(i,:)>ub;
Flaglb = x(i,:)<lb;
v(i,Flagub) = ub;
v(i,Flaglb) = lb;
end
% 计算适应度值
for i = 1:N
fitness(i) = fobj(x(i,:));
end
% 更新gbest
if bestf < max(fitness)
[bestf,index] = max(fitness);
gbest = x(index,:);
end
% 更新pbest
for i = 1:N
if pfitness(i) < fitness(i)
pfitness(i) = fitness(i);
pbest(i,:) = x(i,:);
end
end
C(t) = bestf;
t = t+1;
end
plot(C)
寻优结果:
1.2 求目标函数最小值
只需将上述程序稍作修改即可:
[bestf,index] = min(fitness);%求目标函数最小值,也是适应度函数的最小值
if bestf > min(fitness)%如果前一代找到的最优解>当前种群中某个最小值,那么当前最优值取为该最小值
[bestf,index] = min(fitness);
if pfitness(i) > fitness(i)
2.遗传算法寻优
在上篇博客上已经介绍,这里不再复述了