粒子群算法介绍。粒子动态演示代码

本文介绍了使用Matlab和Python实现的粒子群优化(PSO)算法,并通过动态展示粒子运动,探讨了参数n(粒子数量)、maxgen(迭代次数)和w(惯性权重)对找到全局最优解的影响。通过实例代码,读者可以直观理解算法在复杂函数优化中的应用。
摘要由CSDN通过智能技术生成

粒子群算法介绍04:附Matlab、python代码(PSO)

这次在上述代码中动态演示粒子运动变化
在这里插入图片描述
自己运行代码看动图。通过动态演示你更能发现粒子数量n 迭代次数maxgen,惯性权重w的大小对最优解的影响。如上图就是迭代次数太少加上粒子数量太少还有惯性权重太小,从而陷入局部最优解。

%% 双清空+关闭图形
clc,clear,close all;

%% 绘制函数图像
[x y]=meshgrid(-2:0.02:2,-2:0.05:2);
z=sin( sqrt(x.^2+y.^2) )./sqrt(x.^2+y.^2)+exp((cos(2*pi*x)+cos(2*pi*y))/2)-2.71289;
figure(1)
surf(x,y,z)
hold on %不关闭图形,继续画图

%% PSO参数标定。
maxgen = 300;     %迭代次数
n = 50;           %种群大小
narvs = 2;        %维度
w = 0.9;          %惯性权重
c1 = 1.49445;     %个体学习因子
c2 = 1.49445;     %社会学习因子
Vmax = 0.5;       %速度上下限
Vmin = -0.5;
Xmax = 2;         %位置上下限
Xmin = -2;

%% 初始化粒子群中每个粒子的位置和速度,并计算适应度值
x = 2*rands(n,narvs);    %随机初始化粒子所在的位置
v = 0.5*rands(n,narvs);  %随机初始化粒子的速度

%% 寻找初始个体极值和群体极值  
fit = zeros(n,1);           %初始化这n个粒子的适应度全为0
for i = 1:n                 %循环整个粒子群,计算每一个粒子的适应度
    fit(i) = fun1(x(i,:));  %调用fun1函数来计算适应度
end
pbest = x;                      %个体极值
pbestfitness = fit;             %个体极值适应度值
[gbestfitness index]=max(fit);  %找到群体极值适应度值
gbest = x(index,:);             %群体极值

%% 在图上标上这n个粒子的位置用于演示
h = scatter3(x(:,1),x(:,2),fit,750,'.r');  %scatter3是绘制三维散点图的函数

%% 寻优迭代
for i = 1:maxgen
    %速度更新
    for j = 1:n
        v(j,:)=w*v(j,:)+c1*rand*(pbest(j,:)-x(j,:))+c2*rand*(gbest-x(j,:)); %速度更新公式
        v(j,find(v(j,:)>Vmax)) = Vmax; %find函数这里返回的是索引可以是三种情况1;2;1 2;
        v(j,find(v(j,:)<Vmin)) = Vmin;
     %位置更新   
        x(j,:)=x(j,:)+v(j,:);                                               %位置更新公式   
        x(j,find(x(j,:)>Xmax)) = Xmax;
        x(j,find(x(j,:)<Xmin)) = Xmin;
      %更新适应度值  
        fit(j)=fun1(x(j,:));
    end
      %个体极值更新
    for j = 1:n
        if fit(j)>pbestfitness(j)
            pbest(j,:)=x(j,:);
            pbestfitness(j)=fit(j);
        end
      %群体极值更新 
        if fit(j)>gbestfitness
            gbest=x(j,:);
            gbestfitness=fit(j);
        end
    end
    %每代最优极值记录到result中
    result(i)=gbestfitness;
    pause(0.2);          %暂停0.1s
    h.XData = x(:,1);    %更新散点图句柄的x轴的数据
    h.YData = x(:,2);    %更新散点图句柄的y轴的数据
    h.ZData = fit;       %更新散点图句柄的z轴的数据
end

%% 绘制图像
figure(2)
plot(result)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

gbest
gbestfitness 
       

在matlab中运行上述代码,适应度函数如下:

function y = fun1(x)
%函数用于计算粒子适应度值
%x           input           输入粒子 
%y           output          粒子适应度值 
y=sin( sqrt(x(1).^2+x(2).^2) )./sqrt(x(1).^2+x(2).^2)+exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)-2.71289;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

交通运输怪味张

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

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

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

打赏作者

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

抵扣说明:

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

余额充值