粒子群算法(PSO算法)

news2025/5/18 13:32:42

粒子群算法概述

1.粒子群优化算法(Particle Swarm Optimization,简称PSO)。粒子群优化算法是在1995年由Kennedy博士和Eberhart博士一起提出的,它源于对鸟群捕食行为的研究。

2.基本核心是利用群体中的个体对信息的共享从而使得整个群体的运动在问题求解空间中产生从无序倒有序的演化过程,从而获得问题的最优解。

3.粒子群算法模拟鸟群的捕食过程,将待优化的问题看做是捕食的鸟群,解空间看做是鸟群的飞行空间,空间的每只鸟的位置即是粒子群算法在解空间的一个粒子,也就是待优化问题的一个解。

粒子群算法满足以下假设:

1.粒子被假定没有体积没有质量,本身的属性只有速度和位置。

2.每个粒子在解空间中运动,它通过速度改变其方向和位置。

3.通常粒子将追踪当前的最优粒子以经过最少代数的搜索达到最优。

PSO算法模型

1.PSO算法首先在可行解空间中初始化一群粒子,每个粒子都代表极值最优化问题的一个潜在最优解,用位置、速度和适应度值三项指标表示该粒子的特征。

2.粒子在解空间中运动,通过跟踪个体极值Pbest和群体极值Gbest来更新个体位置。

3.粒子每更新一次位置和速度,就计算一次适应度值,并且通过比较新粒子的适应度值和个体极值、群体极值的适应度更新个体极值Pbest和群体极值Gbest的位置。

假设在一个n维的搜索空间,有m个粒子组成一个粒子群{X}=\left ( X{_{1}},X_{2},...,X_{m} \right ),其中:

注:

掌握PSO算法需要从以下两个角度进行理解:

1.粒子在一定程度上离开原先的搜索轨迹,向新的方向进行搜索,体现了一种向未知区域开拓的能力,类似于全局搜索

2.粒子在一定程度上继续在原先的搜索轨迹上更细一步的搜索,主要针对搜索过程中所搜索到的区域进行更进一步的搜索,类似于局部搜索

基本粒子群算法

在找到这两个最优解时,粒子根据下面的式子来更新自己的速度和位置:

 注:

Vij 指第i个粒子在第j个分量的速度,k代表第k次循环。r1和r2是介于(0,1)的随机数。c1和c2是学习因子。

关于学习因子c1和c2:

1.如果c1=c2=0,则说明粒子将以当前的飞行速度飞到边界。此时,粒子仅能搜索有限的区域,所以很难找到最优解。

2.如果c1=0,则为“社会”模型,粒子只有群体经验而缺乏认知能力。此时,算法收敛速度快,但容易陷入局部最优。

3.如果c2=0,则为“认知”模型,粒子没有社会共享信息,粒子之间没有信息的交互。此时,算法找到最优解的概率很小。

易知该公式由三部分组成:

1.第一部分为“惯性(inertia)”或“动量(momentum)”部分,反映了粒子的运动“习惯(habit)”,代表粒子有维持自己先前速度的趋势。

2.第二部分为“认知(cognition)”,反映了粒子对自身历史经验的记忆(memory)或回忆(remembrance),代表粒子有向自身历史最佳位置逼近的趋势。

3.第三部分为“社会(social)”部分,反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或者邻域历史最佳位置逼近的趋势。

标准粒子群算法

Shi和Eberhart于1998年在IEEE国际计算学术会议上发表了题为“A Modified Particle Swarm Optimizer”的论文,首次在速度更新公式中加入了惯性权重,如下式所示:

 其中w>0叫做惯性因子。w越大,全局寻优能力越强,局部寻优能力越弱;w越小,全局寻优能力越弱,局部寻优能力越强。此时的粒子群算法被称作是标准粒子群算法

经验:

实验表明,动态的w能获得更好的寻优结果。在搜索过程中可以对w进行动态调整:可以初始给w赋子较大正值,随着搜索的进行,可以线性地使逐渐减小,这样可以保证在算法开始时,各粒子能够以较大的速度步长在全局范围内探测到较好的区域:而在搜索后期,较小的值则保证粒子能够在极值点周围做精细的搜索,从而使算法有较大的概率向全局最优解位置收敛。对W进行调整,可以权衡全局搜索和局部搜索能力。

目前,采用较多的动态惯性权重值是线性递减权值策略,其表达式如下:

 其中,T_{max}表示最大迭代次数;w_{max}w_{min}分别表示最大和最小惯性权重。在大多数应用中,通常有w_{max}=0.9 , w_{min}=0.4 。

当然,除了线性递减权值策略,还有线性微分递减策略:

 

 压缩粒子群算法

当 w=\lambda 时,标准粒子算法就会退化为压缩粒子群算法:

此时的粒子群算法被称作是压缩粒子群算法。其中 \lambda 为压缩因子:

 离散粒子群算法

基本粒子群算法是在连续域中搜索函数极值的有利工具。为了处理离散空间的问题,Kennedy和Eberhart又提出了一种离散二进制版的粒子群算法。在此算法中,将离散空间问题映射到连续粒子空间,并适当修改粒子群算法来求解。在计算上仍保留经典粒子群算法中的速度和位置更新规则。

在离散粒子群算法中,将离散问题空间映射到连续粒子运动空间,并做适当的修改。仍然保留经典粒子群算法中的速度和位置更新规则。粒子在状态空间的取值只限于0,1两个值,而速度的每一个位代表的是粒子位置所对应的位取值为0/1的可能性。因此在离散粒子群算法中,粒子速度的更新公式依然保持不变,但是个体最优位置和全局最优位置每一位的取值只能为0/1。

更新方式:

 

其中,r ~ U(0 , 1) ,  V_{ij} 表示位置X_{ij}取值为1的可能性,其更新公式与基本粒子群算法一致。

粒子群算法流程

Step 1.种群初始化:群体规模N,每个粒子的位置X和速度V_{i}

Step 2.计算每个粒子的适应值fit_{i};。 

Step 3.对每个粒子,用它的适应度值fit_{i}和个体极值Pbest_{i}比较。如果fit_{i}<Pbest_{i},则用fit_{i}替换Pbest_{i}

Step 4.对每个粒子,用它的适应度值fit_{i}和全局极值Gbest_{i}比较。如果fit_{i}<Gbest_{i},则用fit_{i}替换Gbest_{i}

Step 5.迭代更新粒子的速度V_{i}和位置X

Step6.进行边界条件处理。

Step 7.判断算法终止的条件是否满足。若满足,则结束算法并输出优化结果;否则,返回Step2。

 算法的参数说明

 注:

边界条件处理:

当某一维或若干维的位置或速度超过设定值时,采用边界条件处理策略可将粒子的位置限制在可行搜索空间内,这样能避免种群的膨胀与发散,也能避免粒子大范围地盲目搜索,从而提高了搜素效率。具体的方法有很多种,比如通过设置最大位置限制x_{max}和最大速度限制v_{max},当超过最大位置或最大速度时,在范围内随机产生一个数值代替,或者将其设置为最大值,即边界吸收。

例题

适应度函数fit.m

function y = fit(x)
% 函数用于计算粒子的适应度
% x:输入粒子
% y:粒子适应度值
y = x(1).^2 + x(2).^2 - 10*cos(2*pi*x(1)) - 10*cos(2*pi*x(2)) + 20;

主脚本main.m

%% I. 清空环境
clc
clear
close all

%% II. 绘制目标函数曲线
figure
[x,y] = meshgrid(-5:0.1:5,-5:0.1:5);
z = x.^2 + y.^2 - 10*cos(2*pi*x) - 10*cos(2*pi*y) + 20;
mesh(x,y,z)
hold on

%% III. 参数初始化
c1 = 1.49445;
c2 = 1.49445;

kmax = 100;   % 进化次数  
popsize = 100; %种群规模

% 控制粒子速度
Vmax = 1;
Vmin = -1;
% 个体位置变化的最大范围
popmax = 5;
popmin = -5;

%% IV. 产生初始粒子和速度
for i = 1:popsize
    % 随机产生一个种群
    pop(i,:) = 5*rands(1,2);     %初始各个粒子位置
    V(i,:) = rands(1,2);         %初始化各个粒子速度
    % 计算适应度
    fitness(i) = fit(pop(i,:));   %各个粒子的适应度值
end

%% V. 个体极值和群体极值
[best_fitness best_index] = max(fitness);
Gbest = pop(best_index,:);     %粒子群体最优位置
Pbest = pop;                   %粒子个体最优位置
fitnessPbest = fitness;        %粒子个体最优适应度值
fitnessGbest = best_fitness;   %粒子群体最优适应度值

%% VI. 迭代寻优
for i = 1:kmax
    
    for j = 1:popsize
        % 速度更新
        V(j,:) = 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) = fit(pop(j,:)); 
    end
    
    for j = 1:popsize  
        % 个体最优更新
        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 
    Best(i) = fitnessGbest;%用于存储每次迭代产生的最优的适应度值        
end
%% VII.输出结果
[fitnessGbest, Gbest]
plot3(Gbest(1), Gbest(2), fitnessGbest,'bo','linewidth',1.5)

figure
plot(Best)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

运行结果:

ans =

   80.7065   -4.5223    4.5231

 适应度函数fun.m

function y = fun(x)
%函数用于计算粒子适应度值
%x:输入粒子 
%y:粒子适应度值 
y = 0.5 + (sin(sqrt(x(1)^2+x(2)^2))^2 - 0.5) / (1 + 0.001*(x(1)^2+x(2)^2))^2;
% y = 3*cos(x(1)*x(2)) + x(1) + x(2)^2;

主脚本main.m

%% I. 清空环境
% clc
% clear

%% II. 绘制目标函数曲线
figure
[x,y] = meshgrid(-10:0.1:10,-10:0.1:10);
z = 0.5 + (sin(sqrt(x.^2+y.^2)).^2 - 0.5)./ (1 + 0.001*(x.^2+y.^2)).^2;
mesh(x,y,z)
hold on
%% III. 参数初始化
c1 = 1.49445;
c2 = 1.49445;

kmax = 100;   % 进化次数
popsize = 100; %种群规模

% 控制粒子速度
Vmax = 1;
Vmin = -1;
% 个体位置变化的最大范围
popmax = 10;
popmin = -10;

%惯性权重最大值和最小值
Wmax = 0.9;
Wmin = 0.4;

% %压缩因子
% phi = c1+c2;
% lamda = 2 / abs(2 - phi - sqrt(phi^2 - 4*phi));   % 压缩因子
%% IV. 产生初始粒子和速度
for i = 1:popsize
    % 随机产生一个种群
    pop(i,:) = 10*rands(1,2);     %初始各个粒子位置
    V(i,:) = rands(1,2);         %初始化各个粒子速度
    % 计算适应度
    fitness(i) = fun(pop(i,:));   %各个粒子的适应度值
end

%% V. 个体极值和群体极值
[best_fitness best_index] = min(fitness);
Gbest = pop(best_index,:);     %粒子群体最优位置
Pbest = pop;                   %粒子个体最优位置
fitnessPbest = fitness;        %粒子个体最优适应度值
fitnessGbest = best_fitness;   %粒子群体最优适应度值

%% VI. 迭代寻优
for i = 1:kmax
    %计算动态惯性权重
    w = Wmax - (Wmax - Wmin)*i / kmax;
    
    for j = 1:popsize
        
        % 速度更新
        V(j,:) = w*V(j,:) + c1*rand*(Pbest(j,:) - pop(j,:)) + c2*rand*(Gbest - pop(j,:));%标准粒子群算法
        %         V(j,:) = lamda*V(j,:) + c1*rand*(Pbest(j,:) - pop(j,:)) + c2*rand*(Gbest - pop(j,:));%压缩粒子群算法
        %         V(j,:) = 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:popsize
        % 个体最优更新
        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
    Best(i) = fitnessGbest;%用于存储每次迭代产生的最优的适应度值
end
%% VII.输出结果
disp(['当x=',num2str(Gbest(1)),'和','y=',num2str(Gbest(2)),'时','所求函数的最小值是',num2str(fitnessGbest)])

plot3(Gbest(1), Gbest(2), fitnessGbest,'bo','linewidth',15)

figure
plot(Best)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

运行结果:

>> main
当x=7.2595e-06和y=-1.7485e-05时所求函数的最小值是3.5877e-10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM智能体新纪元:深入解析MCP与A2A协议,赋能智能自动化协作

LLM智能体&#xff08;LLM agents&#xff09;是能够自主行动以实现特定目标的AI系统。在实际应用中&#xff0c;智能体能够将用户请求拆解为多个步骤&#xff0c;利用知识库或API获取数据&#xff0c;最终整合出答案。这让智能体相比于传统独立聊天机器人拥有更强大的能力——…

SAP学习笔记 - 开发豆知识01 - CDS SDK命令出乱码 (cds init CAP-Test03 --add java)

1&#xff0c;现象 安装完VSCode以及各种需要的插件&#xff08;比如SAP CDS Language Support&#xff09;&#xff0c;就可以做CAP开发。 用这个命令创建Project&#xff1a;cds init CAP-Test03 --add java 然后出来一个乱码错误 adding java The derived package name c…

(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)

目录 前言&#xff1a; 源代码&#xff1a; product.h product.c fileio.h fileio.c main.c json_export.h json_export.c tasks.json idex.html script.js 相关步骤&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 第五步…

进阶-数据结构部分:​​​​​​​2、常用排序算法

飞书文档https://x509p6c8to.feishu.cn/wiki/FfpIwIPtviMMb4kAn3Sc40ABnUh 常用排序算法 这几种算法都是常见的排序算法&#xff0c;它们的优劣和适用场景如下&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;简单易懂&#xff0c;时间复杂度较高&…

25、DeepSeek-R1论文笔记

DeepSeek-R1论文笔记 1、研究背景与核心目标2、核心模型与技术路线3、蒸馏技术与小模型优化4、训练过程简介5、COT思维链&#xff08;Chain of Thought&#xff09;6、强化学习算法&#xff08;GRPO&#xff09;7、冷启动**1. 冷启动的目的****2. 冷启动的实现步骤****3. 冷启动…

LeetCode --- 156双周赛

题目列表 3541. 找到频率最高的元音和辅音 3542. 将所有元素变为 0 的最少操作次数 3543. K 条边路径的最大边权和 3544. 子树反转和 一、找到频率最高的元音和辅音 分别统计元音和辅音的出现次数最大值&#xff0c;然后相加即可&#xff0c;代码如下 // C class Solution {…

npm 报错 gyp verb `which` failed Error: not found: python2 解决方案

一、背景 npm 安装依赖报如下错&#xff1a; gyp verb check python checking for Python executable "python2" in the PATH gyp verb which failed Error: not found: python2 一眼看过去都觉得是Python环境问题&#xff0c;其实并不是你python环境问题&#xf…

初识Linux · IP协议· 下

目录 前言&#xff1a; 内网IP和公网IP 内网IP 公网IP 路由 前言&#xff1a; 前文我们介绍了IP协议的协议头&#xff0c;通过源码等方式我们理解了IP协议中的字段&#xff0c;比如8位协议&#xff0c;比如通过环回问题引出的8位最大生存时间&#xff0c;比如8位协议&…

JAVA的常见API文档(上)

游戏打包 注意API文档中的方法不需要记忆&#xff01;&#xff01; 了解之后如果需要可以查询API文档 对Math的方法总结&#xff1a; 运用刚学的Math方法加快代码的运行效率 可以减少循环次数 找规律&#xff1a; 发现因子有规律&#xff1a; 必定一个大于平方根&#xff0c;…

Spark,连接MySQL数据库,添加数据,读取数据

连接数据库 可以看到shell中我们读取出的数据 在IDEA中打代码如果能输出跟shell中一样的结果即证明连接成功 【出错反思】 像我前面出错的原因就是在打代码时将密码输入错误 添加数据 读取数据就是在上面代码中一起展示了&#xff0c;这里我就不单独说了

【EDA软件】【联合Modelsim仿真使用方法】

背景 业界EDA工具仿真功能是必备的&#xff0c;例如Vivado自带仿真工具&#xff0c;且无需联合外部仿真工具&#xff0c;例如MoodelSim。 FUXI工具仿真功能需要联合Modelsim&#xff0c;才能实现仿真功能。 方法一&#xff1a;FUXI联合ModelSim 1 添加testbench文件 新建to…

【离散化 线段树】P3740 [HAOI2014] 贴海报|普及+

本文涉及知识点 C线段树 [HAOI2014] 贴海报 题目描述 Bytetown 城市要进行市长竞选&#xff0c;所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理&#xff0c;城市委员会为选民准备了一个张贴海报的 electoral 墙。 张贴规则如下&#xff1a; electoral…

CSP 2024 提高级第一轮(CSP-S 2024)单选题解析

单选题解析 第 1 题 在 Linux 系统中&#xff0c;如果你想显示当前工作目录的路径&#xff0c;应该使用哪个命令&#xff1f;&#xff08;A&#xff09; A. pwd B. cd C. ls D. echo 解析&#xff1a;Linux 系统中&#xff0c;pwd命令可以显示当前工作目录的路径。pwd&#x…

六、绘制图片

文章目录 1.创建一个红色图片2.加载bmp图片3.加载png、jpg图片 前面的几个示例&#xff0c;我们已经展示过如果在Linux系统下使用xlib接口向窗口中绘制文本、线、矩形&#xff1b;并设置文本、线条的颜色。并利用xlib提供的接口结合事件处理机制完成了一个自绘按钮控件功能。有…

Java 面向对象详解和JVM底层内存分析

先关注、点赞再看、人生灿烂&#xff01;&#xff01;&#xff01;&#xff08;谢谢&#xff09; 神速熟悉面向对象 表格结构和类结构 我们在现实生活中&#xff0c;思考问题、发现问题、处理问题&#xff0c;往往都会用“表格”作为工具。实际上&#xff0c;“表格思维”就是…

深度学习---知识蒸馏(Knowledge Distillation, KD)

一、知识蒸馏的本质与起源 定义&#xff1a; 知识蒸馏是一种模型压缩与迁移技术&#xff0c;通过将复杂高性能的教师模型&#xff08;Teacher Model&#xff09;所学的“知识”迁移到轻量级的学生模型&#xff08;Student Model&#xff09;&#xff0c;使学生模型在参数量和计…

基于CNN卷积神经网络的带频偏QPSK调制信号检测识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

【DAY21】 常见的降维算法

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 目录 PCA主成分分析 t-sne降维 线性判别分析 (Linear Discriminant Analysis, LDA) 作业&#xff1a; 什么时候用到降维 降维的主要应用场景 知识点回顾&#xff1a; PCA主成分分析t-sne降维LDA线性判别 通常情况下&#xff0c;…

校园社区小程序源码解析

基于ThinkPHP、FastAdmin和UniApp开发的校园社区小程序源码&#xff0c;旨在为校园内的学生和教职员工提供一个便捷的在线交流和服务平台。 该小程序前端采用UniApp进行开发&#xff0c;具有良好的跨平台兼容性&#xff0c;可以轻松发布到iOS和Android平台。同时&#xff0c;后…

第6章:文件权限

一、文件权限概述 Linux为了保证系统中每个文件的安全&#xff0c;引入了文件权限机制。针对于系统中的每一个文件Linux都可以提供精确的权限控制。它可以做到不同的用户对同一个文件具有不同的操作权利。而通常这个权利包括以下3个&#xff1a; 读的权利&#xff08;Read&…