PSO算法、MATLAB代码实现以及测试效果

文章详细介绍了粒子群优化(PSO)算法的原理,包括粒子的进化操作、速度更新公式以及惯性权重的作用。同时,提供了Matlab代码实现,包括main函数、适应度函数和PSO算法主体。文章还展示了不同测试问题(F1~F6)的适应度函数和算法测试结果。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


PSO算法原理

粒子群优化( Particle Swarm Optimization,PSO) 算法是 Kennedy 和 Eberhart〔1〕在 1995 年首次提出一种 模拟鸟群和鱼群等动物寻找食物的社会行为的群智能优化算法。
在粒子群算法中,每个粒子拥有两个特征:速度和位置,如下:
在这里插入图片描述

进化操作

粒子的位置变化公式:
在这里插入图片描述
其中:
c1 和 c2是学习因子,本文定义c1=1.6,c2=1.8
在这里插入图片描述
第一个公式是速度更新的公式:
该公式的第一项是惯性部分、第二项是认知部分、第三项是社会部分
认知部分即:向着自身在历史中所处的最好位置的方向移动。
社会部分即:向着群体中最好的位置的方向移动。

为了改善PSO的性能,Shi和Eberhart引入了惯性权重omiga。速度更新公式即为:
在这里插入图片描述
引入omiga的目的是为了较好地平衡PSO算法的全局搜索能力和局部搜索能力,这样的PSO算法也被称为标准PSO算法
本文定义omiga的取值范围为
①:权重向量线性递减,Shi和Eberhart将omiga的取值范围定义为[0.4,0.9]
在这里插入图片描述
②:也有些研究将权重向量线性递增,公式如下,本文验证部分
测试集的时候效果不如权重向量线性递减策略

在这里插入图片描述

算法流程图

在这里插入图片描述

matlab代码实现

main函数部分

clear all;
close all;
clc;
N=300;
Dim=30;
ub=100;
lb=-100;
T=500;
% 学习因子
c1=1.6;
c2=1.8;
% 速度系数
vel=0.01;
[P_gbest,G_best]=PSO(Dim,ub,lb,vel,N,T,c1,c2);
figure,
plot(G_best,'Color','red');
xlim([1,500]);

适应度函数部分

function my_fitness=my_function(X)
%F1测试问题[-100,100] min=0
% o=sum(X.^2);
% my_fitness=o;

%F2测试问题[-10,10] min=0;
% o=sum(abs(X))+prod(abs(X));
% my_fitness=o;


%F3测试问题——结果极差 min=0
% dim=size(X,2);
% o=0;
% for i=1:dim
%     o=o+sum(X(1:i))^2;
% end
% my_fitness=o;

%F4测试问题——结果极差[-100,100] min=0
% o=max(abs(X));
% my_fitness=o;

%F5测试问题[-30,30] min=0
% dim=size(X,2);
% my_fitness=sum(100*(X(2:dim)-(X(1:dim-1).^2)).^2+(X(1:dim-1)-1).^2);

%F6测试问题[-100,100] min=0
o=sum(abs((X+.5)).^2);
my_fitness=o;
end

PSO算法主体

function [P_gbest,G_best]=PSO(Dim,ub,lb,vel,N,T,c1,c2)
%% 初始化种群
Pop=zeros(N,Dim);
Pop_vel=zeros(N,Dim);
for i=1:N
    for j=1:Dim
        Pop(i,j)=lb+rand().*(ub-lb);%初始化个体
        Pop_vel(i,j)=vel*(lb+rand().*(ub-lb));%初始化个体速度
    end
end
% 计算个体的适应度值
for i=1:N
    fitness(i)=my_function(Pop(i,:));      
end
[fit_gbest,fit_gbest_index]=min(fitness);
P_gbest=Pop(fit_gbest_index,:);%全局中最好的个体
% 初始时 每个个体当前位置即历史中最好的位置
P_pbest=Pop;
%% 进化部分
for t=1:T
    %omiga=2-(2-0.4)*(t/T);%定义范围为[0.4,2],随着迭代次数线性减少
    omiga=(0.9-0.4)*(1-(t/T))+0.4;%惯性权重线性递减策略
    %omiga=(0.4-0.9)*(1-(t/T))+0.9;%惯性权重递增策略——效果不佳
    % 遍历所有个体,更新所有个体的位置
    for i=1:N
        for j=1:Dim
            r1=rand();
            r2=rand();
            Pop_vel(i,j)=omiga*Pop_vel(i,j)+c1*r1*(P_pbest(i,j)-Pop(i,j))+c2*r2*(P_gbest(j)-Pop(i,j));
            Pop(i,j)=Pop(i,j)+Pop_vel(i,j);
        end
    end
    % 遍历个体计算适应度值
    for i=1:N
        Flag4Up=Pop(i,:)>ub;
        Flag4Lp=Pop(i,:)<lb;
        Pop(i,:)=(Pop(i,:).*(~(Flag4Up+Flag4Lp)))+Flag4Up.*ub+Flag4Lp.*lb;%修正粒子群的位置

        FlagUp=Pop_vel(i,:)>vel*ub;
        FlagLp=Pop_vel(i,:)<vel*lb;
        Pop_vel(i,:)=(Pop_vel(i,:).*(~(FlagUp+FlagLp)))+FlagUp.*vel.*ub+FlagLp.*lb.*vel;%修正粒子群的速度

        y=my_function(Pop(i,:));
        if y<fitness(i)
            P_pbest(i,:)=Pop(i,:);%更新在历史中每个粒子最好的位置
            fitness(i)=y;
        end
    end
    % 更新最好个体的位置
    [fit_best,fit_best_index]=min(fitness);
    G_best(t)=fit_best;
    P_gbest=Pop(fit_best_index,:);
end
end

测试结果 (F1~F6)

F1
在这里插入图片描述
F2
在这里插入图片描述

F3
在这里插入图片描述
F4
在这里插入图片描述
F5
在这里插入图片描述
F6
在这里插入图片描述

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PSO(粒子群优化)算法是一种模拟自然群体行为的优化算法。下面是一个简单的PSO算法MATLAB代码示例: ```matlab function [best_position, best_fitness] = pso_algorithm() % 初始化参数 swarm_size = 30; % 群体大小 max_iter = 100; % 最大迭代次数 inertia_weight = 0.7; % 惯性权重 cognitive_weight = 1.4; % 认知权重 social_weight = 1.4; % 社交权重 lower_bounds = -10; % 解空间下界 upper_bounds = 10; % 解空间上界 % 初始化粒子的位置和速度 positions = zeros(swarm_size, 1); velocities = zeros(swarm_size, 1); % 初始化每个粒子的最佳位置和适应度值 best_positions = positions; best_fitness = inf(swarm_size, 1); % 初始化全局最佳位置和适应度值 global_best_position = 0; global_best_fitness = inf; % 开始迭代 iter = 1; while iter <= max_iter % 更新每个粒子的速度和位置 for i = 1:swarm_size % 更新速度 velocities(i) = inertia_weight * velocities(i) + ... cognitive_weight * rand() * (best_positions(i) - positions(i)) + ... social_weight * rand() * (global_best_position - positions(i)); % 更新位置 positions(i) = positions(i) + velocities(i); % 限制位置在解空间内 positions(i) = max(positions(i), lower_bounds); positions(i) = min(positions(i), upper_bounds); % 计算当前位置的适应度值 fitness = objective_function(positions(i)); % 更新每个粒子的最佳位置和适应度值 if fitness < best_fitness(i) best_positions(i) = positions(i); best_fitness(i) = fitness; % 更新全局最佳位置和适应度值 if fitness < global_best_fitness global_best_position = positions(i); global_best_fitness = fitness; end end end iter = iter + 1; end % 返回结果 best_position = global_best_position; best_fitness = global_best_fitness; end function fitness = objective_function(x) % 输入自定义的目标函数,计算适应度值 fitness = x^2; end ``` 以上代码实现了一个简单的PSO算法,其中优化的目标函数为x^2(可根据需要自行修改)。算法通过迭代更新粒子的速度和位置,并根据目标函数的值更新每个粒子的最佳位置和全局最佳位置,直到达到最大迭代次数为止。最后返回全局最佳位置和适应度值作为优化结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JiAngTxone

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

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

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

打赏作者

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

抵扣说明:

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

余额充值