粒子群优化算法(PSO)求函数最大值(最小值)
一、使用步骤
二、注意
适应度值一般为优化种群目标函数值
更新位置与速度:
三、代码
test.m
%% I. 清空环境%二元函数
clc
clear
%% II. 绘制目标函数曲线图
m=10;
D=2;
x1=linspace(-10,pi,80);
x2=x1;
[X,Y]=meshgrid(x1,x2);
A=sin(X).*(sin(X.^2/pi)).^(2*m);
B=sin(Y).*(sin(2*(Y.^2)/pi)).^(2*m);
Z=-(A+B);
mesh(X,Y,Z);
xlabel('X')
ylabel('Y')
zlabel('Z')
title('Michalewics')
colormap(summer)
grid on;
hold on
%% III. 参数初始化
c1 = 1.49445;%c1和c2:是学习因子,通常c1=c2=2
c2 = 1.49445;
ws=0.9;%w权重
we=0.4;
maxgen = 100; % 进化次数
sizepop = 80; %种群规模
Vmax = 1; %速度的范围,超过则用边界值。
Vmin = -1;
popmax = 3; %个体的变化范围
popmin = -3;
%% IV. 产生初始粒子和速度
for i = 1:sizepop
% 随机产生一个种群
pop(i,:) = 3*rands(1,2); %初始种群粒子位置,rands产生(-1,1)
V(i,:) = rands(1,2); %初始化速度
% 计算适应度
fitness(i) = fun(pop(i,:));
end
%% V. 个体极值和群体极值
[bestfitness,bestindex] = max(fitness);
gbest = pop(bestindex,:); %全局最佳
fitnessgbest = bestfitness; %全局最佳适应度值
pbest = pop; %个体最佳
fitnesspbest = fitness; %个体最佳适应度值
%% VI. 迭代寻优
for i = 1:maxgen
w=ws-(ws-we)*(i/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;
% 适应度值更新
fitness(j) = fun(pop(j,:));
end
for j = 1:sizepop
% 个体最优更新
if fitness(j) > fitnesspbest(j)
pbest(j,:) = pop(j,:);
fitnesspbest(j) = fitness(j);
end
% 群体最优更新
if fitness(j) > fitnessgbest
gbest = pop(j,:);
fitnessgbest = fitness(j);
end
end
Q(i) = fitnessgbest;
end
%% VII. 输出结果并绘图
[gbest fitnessgbest];
plot3(gbest(1),gbest(2),fitnessgbest,'r*')
figure
plot(Q)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
fun.m
%定义适应度函数
function z = fun(x)
A=sin(x(1))*(sin(x(1)^2/pi))^(2*10);
B=sin(x(2))*(sin(2*(x(2)^2)/pi))^(2*10);
z=-(A+B);
end
四.运行结果
##参考文章:
[1]https://blog.csdn.net/fendoubasaonian/article/details/68922583
[2]https://blog.csdn.net/daaikuaichuan/article/details/81382794?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control