粒子群算法(PSO算法)
粒子群算法概述
1.粒子群优化算法(Particle Swarm Optimization,简称PSO)。粒子群优化算法是在1995年由Kennedy博士和Eberhart博士一起提出的,它源于对鸟群捕食行为的研究。
2.基本核心是利用群体中的个体对信息的共享从而使得整个群体的运动在问题求解空间中产生从无序倒有序的演化过程,从而获得问题的最优解。
3.粒子群算法模拟鸟群的捕食过程,将待优化的问题看做是捕食的鸟群,解空间看做是鸟群的飞行空间,空间的每只鸟的位置即是粒子群算法在解空间的一个粒子,也就是待优化问题的一个解。
粒子群算法满足以下假设:
1.粒子被假定没有体积没有质量,本身的属性只有速度和位置。
2.每个粒子在解空间中运动,它通过速度改变其方向和位置。
3.通常粒子将追踪当前的最优粒子以经过最少代数的搜索达到最优。
PSO算法模型
1.PSO算法首先在可行解空间中初始化一群粒子,每个粒子都代表极值最优化问题的一个潜在最优解,用位置、速度和适应度值三项指标表示该粒子的特征。
2.粒子在解空间中运动,通过跟踪个体极值Pbest和群体极值Gbest来更新个体位置。
3.粒子每更新一次位置和速度,就计算一次适应度值,并且通过比较新粒子的适应度值和个体极值、群体极值的适应度更新个体极值Pbest和群体极值Gbest的位置。
假设在一个n维的搜索空间,有m个粒子组成一个粒子群,其中:
注:
掌握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进行调整,可以权衡全局搜索和局部搜索能力。
目前,采用较多的动态惯性权重值是线性递减权值策略,其表达式如下:
其中,表示最大迭代次数;
和
分别表示最大和最小惯性权重。在大多数应用中,通常有
,
。
当然,除了线性递减权值策略,还有线性微分递减策略:
压缩粒子群算法
当 时,标准粒子算法就会退化为压缩粒子群算法:
此时的粒子群算法被称作是压缩粒子群算法。其中 为压缩因子:
离散粒子群算法
基本粒子群算法是在连续域中搜索函数极值的有利工具。为了处理离散空间的问题,Kennedy和Eberhart又提出了一种离散二进制版的粒子群算法。在此算法中,将离散空间问题映射到连续粒子空间,并适当修改粒子群算法来求解。在计算上仍保留经典粒子群算法中的速度和位置更新规则。
在离散粒子群算法中,将离散问题空间映射到连续粒子运动空间,并做适当的修改。仍然保留经典粒子群算法中的速度和位置更新规则。粒子在状态空间的取值只限于0,1两个值,而速度的每一个位代表的是粒子位置所对应的位取值为0/1的可能性。因此在离散粒子群算法中,粒子速度的更新公式依然保持不变,但是个体最优位置和全局最优位置每一位的取值只能为0/1。
更新方式:
,
其中,r ~ U(0 , 1) , 表示位置
取值为1的可能性,其更新公式与基本粒子群算法一致。
粒子群算法流程
Step 1.种群初始化:群体规模,每个粒子的位置
和速度
。
Step 2.计算每个粒子的适应值;。
Step 3.对每个粒子,用它的适应度值和个体极值
比较。如果
,则用
替换
。
Step 4.对每个粒子,用它的适应度值和全局极值
比较。如果
,则用
替换
。
Step 5.迭代更新粒子的速度和位置
。
Step6.进行边界条件处理。
Step 7.判断算法终止的条件是否满足。若满足,则结束算法并输出优化结果;否则,返回Step2。
算法的参数说明
注:
边界条件处理:
当某一维或若干维的位置或速度超过设定值时,采用边界条件处理策略可将粒子的位置限制在可行搜索空间内,这样能避免种群的膨胀与发散,也能避免粒子大范围地盲目搜索,从而提高了搜素效率。具体的方法有很多种,比如通过设置最大位置限制
和最大速度限制
,当超过最大位置或最大速度时,在范围内随机产生一个数值代替,或者将其设置为最大值,即边界吸收。
例题
适应度函数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:kmaxfor 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,:)); endfor j = 1:popsize % 个体最优更新if fitness(j) > fitnessPbest(j)Pbest(j,:) = pop(j,:);fitnessPbest(j) = fitness(j);end% 群体最优更新if fitness(j) > fitnessGbestGbest = pop(j,:);fitnessGbest = fitness(j);endend 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,:));endfor j = 1:popsize% 个体最优更新if fitness(j) < fitnessPbest(j)Pbest(j,:) = pop(j,:);fitnessPbest(j) = fitness(j);end% 群体最优更新if fitness(j) < fitnessGbestGbest = pop(j,:);fitnessGbest = fitness(j);endendBest(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
相关文章:

粒子群算法(PSO算法)
粒子群算法概述 1.粒子群优化算法(Particle Swarm Optimization,简称PSO)。粒子群优化算法是在1995年由Kennedy博士和Eberhart博士一起提出的,它源于对鸟群捕食行为的研究。 2.基本核心是利用群体中的个体对信息的共享从而使得整…...
git提交库常用词
新功能 feat修改BUG fix文档修改 docs格式修改 style重构 refactor性能提升 perf测试 test构建系统 build对CI配置文件修改 ci修改构建流程、或增加依赖库、工具 chore回滚版本 revert...

LLM智能体新纪元:深入解析MCP与A2A协议,赋能智能自动化协作
LLM智能体(LLM agents)是能够自主行动以实现特定目标的AI系统。在实际应用中,智能体能够将用户请求拆解为多个步骤,利用知识库或API获取数据,最终整合出答案。这让智能体相比于传统独立聊天机器人拥有更强大的能力——…...

SAP学习笔记 - 开发豆知识01 - CDS SDK命令出乱码 (cds init CAP-Test03 --add java)
1,现象 安装完VSCode以及各种需要的插件(比如SAP CDS Language Support),就可以做CAP开发。 用这个命令创建Project:cds init CAP-Test03 --add java 然后出来一个乱码错误 adding java The derived package name c…...

(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
目录 前言: 源代码: product.h product.c fileio.h fileio.c main.c json_export.h json_export.c tasks.json idex.html script.js 相关步骤: 第一步: 第二步: 第三步: 第四步: 第五步…...

进阶-数据结构部分:2、常用排序算法
飞书文档https://x509p6c8to.feishu.cn/wiki/FfpIwIPtviMMb4kAn3Sc40ABnUh 常用排序算法 这几种算法都是常见的排序算法,它们的优劣和适用场景如下: 冒泡排序(Bubble Sort):简单易懂,时间复杂度较高&…...
解决 Three.js Raycaster 点击位置与实际交点偏差问题
当使用 Three.js 的 Raycaster 时,如果发现点击位置与显示的碰撞点之间存在较大偏差,这通常是由于坐标系统不匹配或参数设置不正确导致的。以下是系统性的排查和解决方案: 1. 检查鼠标坐标转换 最常见的偏差原因是鼠标坐标到标准化设备坐标…...

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

LeetCode --- 156双周赛
题目列表 3541. 找到频率最高的元音和辅音 3542. 将所有元素变为 0 的最少操作次数 3543. K 条边路径的最大边权和 3544. 子树反转和 一、找到频率最高的元音和辅音 分别统计元音和辅音的出现次数最大值,然后相加即可,代码如下 // C class Solution {…...
模型量化AWQ和GPTQ哪种效果好?
环境: AWQ GPTQ 问题描述: 模型量化AWQ和GPTQ哪种效果好? 解决方案: 关于AWQ(Adaptive Weight Quantization)和GPTQ(Generative Pre-trained Transformer Quantization)这两种量化方法的…...

npm 报错 gyp verb `which` failed Error: not found: python2 解决方案
一、背景 npm 安装依赖报如下错: gyp verb check python checking for Python executable "python2" in the PATH gyp verb which failed Error: not found: python2 一眼看过去都觉得是Python环境问题,其实并不是你python环境问题…...

初识Linux · IP协议· 下
目录 前言: 内网IP和公网IP 内网IP 公网IP 路由 前言: 前文我们介绍了IP协议的协议头,通过源码等方式我们理解了IP协议中的字段,比如8位协议,比如通过环回问题引出的8位最大生存时间,比如8位协议&…...
5.27本日总结
一、英语 复习list2list29 二、数学 学习14讲部分内容 三、408 学习计组1.2内容 四、总结 高数和计网明天结束当前章节,计网内容学完之后主要学习计组和操作系统 五、明日计划 英语:复习lsit3list28,完成07年第二篇阅读 数学&#…...
JavaScript基础-创建对象的三种方式
在JavaScript中,对象是构建复杂数据结构和实现面向对象编程的核心。掌握如何创建对象对于每个开发者来说都是必不可少的技能。本文将介绍创建JavaScript对象的三种主要方式:对象字面量、构造函数以及类(ES6引入),并探讨…...

JAVA的常见API文档(上)
游戏打包 注意API文档中的方法不需要记忆!! 了解之后如果需要可以查询API文档 对Math的方法总结: 运用刚学的Math方法加快代码的运行效率 可以减少循环次数 找规律: 发现因子有规律: 必定一个大于平方根,…...
JavaScript 中的 for...in 和 for...of 循环详解
在 JavaScript 中,for...in 和 for...of 是两种常用的循环结构,但它们有着不同的用途和行为。很多初学者容易混淆这两者,本文将详细解析它们的区别、适用场景以及注意事项。 目录 for…in 循环 基本用法遍历对象属性注意事项 for…of 循环 …...
AtCoder AT_abc406_c [ABC406C] ~
前言 除了 A 题,唯一一道一遍过的题。 题目大意 我们定义满足以下所有条件的一个长度为 N N N 的序列 A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\dots,A_N) A(A1,A2,…,AN) 为波浪序列: N ≥ 4 N\ge4 N≥4(其实满足后面就必须满足这…...

Spark,连接MySQL数据库,添加数据,读取数据
连接数据库 可以看到shell中我们读取出的数据 在IDEA中打代码如果能输出跟shell中一样的结果即证明连接成功 【出错反思】 像我前面出错的原因就是在打代码时将密码输入错误 添加数据 读取数据就是在上面代码中一起展示了,这里我就不单独说了...
Linux容器技术详解
容器技术基础 什么是容器 容器是一种轻量级的虚拟化技术,它将应用程序及其依赖(库、二进制文件、配置文件等)打包在一个独立的单元中,可以在任何支持容器运行时的环境中一致地运行。 Docker官网:https://www.docker…...

【EDA软件】【联合Modelsim仿真使用方法】
背景 业界EDA工具仿真功能是必备的,例如Vivado自带仿真工具,且无需联合外部仿真工具,例如MoodelSim。 FUXI工具仿真功能需要联合Modelsim,才能实现仿真功能。 方法一:FUXI联合ModelSim 1 添加testbench文件 新建to…...
STM32 __main
STM32开发中__main与用户main()函数的本质区别及工作机制 在STM32开发中,__main和用户定义的main()函数是启动过程中的两个关键节点,分别承担运行时初始化和用户程序入口的职责。以下是它们的核心差异及协作机制: 一、定义与层级差异 __ma…...

【离散化 线段树】P3740 [HAOI2014] 贴海报|普及+
本文涉及知识点 C线段树 [HAOI2014] 贴海报 题目描述 Bytetown 城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的 electoral 墙。 张贴规则如下: electoral…...
Python训练营打卡Day28
浙大疏锦行 DAY 28 类的定义和方法 知识点回顾: 1.类的定义 2.pass占位语句 3.类的初始化方法 4.类的普通方法 5.类的继承:属性的继承、方法的继承 作业 题目1:定义圆(Circle)类 要求: 1.包含属性&#x…...
MODBUS RTU通信协议详解与调试指南
一、MODBUS RTU简介 MODBUS RTU(Remote Terminal Unit)是一种基于串行通信(RS-485/RS-232)的工业标准协议,采用二进制数据格式,具有高效、可靠的特点,广泛应用于PLC、传感器、变频器等工业设备…...

CSP 2024 提高级第一轮(CSP-S 2024)单选题解析
单选题解析 第 1 题 在 Linux 系统中,如果你想显示当前工作目录的路径,应该使用哪个命令?(A) A. pwd B. cd C. ls D. echo 解析:Linux 系统中,pwd命令可以显示当前工作目录的路径。pwd&#x…...

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

Java 面向对象详解和JVM底层内存分析
先关注、点赞再看、人生灿烂!!!(谢谢) 神速熟悉面向对象 表格结构和类结构 我们在现实生活中,思考问题、发现问题、处理问题,往往都会用“表格”作为工具。实际上,“表格思维”就是…...

深度学习---知识蒸馏(Knowledge Distillation, KD)
一、知识蒸馏的本质与起源 定义: 知识蒸馏是一种模型压缩与迁移技术,通过将复杂高性能的教师模型(Teacher Model)所学的“知识”迁移到轻量级的学生模型(Student Model),使学生模型在参数量和计…...

基于CNN卷积神经网络的带频偏QPSK调制信号检测识别算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)…...

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