Matlab粒子群优化算法(PSO)求函数最大值(最小值)

粒子群优化算法(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

  • 9
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟雨金城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值