粒子群算法(1)

article/2025/10/1 10:44:43

粒子群算法

1.入门

粒子群算法,其全称为粒子群优化算法(Particle Swarm Optimization,PsO)。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。

2.什么是启发式算法?

启发式算法百度百科上的定义:一个基于直观或经验构造的算法,在可接受的花费下给出待解决优化问题的一个可行解。
(1)什么是可接受的花费?
计算时间和空间能接受(求解一个问题要几万年or一万台电脑)
(2)什么是优化问题?
工程设计中优化问题(optimization problem)指在一定约束条件下,求解一个目标函数的最大值(或最小值)问题。
注:实际上和我们之前学过的规划问题的定义一样,称呼不同而已。
(3)什么是可行解?
得到的结果能用于工程实践(不一定非要是最优解)
常见的启发式算法:
粒子群、模拟退火、遗传算法、蚁群算法、禁忌搜索算法等等

3.什么是盲目搜索?

如枚举法、蒙特卡洛模拟
有什么问题?
如果现在要求最值的函数是一个多变量的函数,例如是一个10个变量的函数,那么就完蛋了!(要考虑的情况随着变量数呈指数增长,计算时间肯定不够)

4.启发式搜索-爬山法

以最简单的连续—元函数找最大值为例,我们来讲解爬山法:
(1在解空间中随机生成一个初始解;
(2)根据初始解的位置,我们在下一步有两种走法:向左邻域走一步或者向右邻
域走一步(走的步长越小越好,但会加大计算量);
(3)比较不同走法下目标函数的大小,并决定下一步往哪个方向走。上图中向左
走目标函数较大,因此我们应该往左走一小步;
(4)不断重复这个步骤,直到找到一个极大值点(或定义域边缘处).此时我们就
结束搜索。

粒子群算法基础概念

来源

1995年,美国学者Kennedy和Eberhart共同提出了粒子群算法,其基本思想源于对鸟类群体行为进行建模与仿真的研究结果的启发。

核心思想

它的核心思想是利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得问题的可行解。

最初提出的论文:

Kennedy J , Eberhart R .Particle swarm optimization[C]// Proceedings of lICNN’95 - International Conference on Neural Networks.IEEE, 1995.

图形解释

在这里插入图片描述
这只鸟第d步所在的位置=第d-1步所在的位置+第d-1步的速度运动的时间
x(d)= x(d-1) + v(d-1) ×t(每一步运动的时间t—般取1)
在这里插入图片描述
这只鸟第d步所在的位置=第d-1步所在的位置+第d-1步的速度
运动的时间
x(d) = x(d-1) + v(d-1) ×t(每一步运动的时间t—般取1)
这只鸟第d步的速度=上一步自身的速度惯性+自我认知部分+社会认知部分
v(d) = w×v(d-1) + c1×r1×(pbest(d)-x(d)) + c2×r2×(gbest(d)-x(d))(三个部分的和)

一些概念

粒子:优化问题的候选解
位置:候选解所在的位置
速度:候选解移动的速度
适应度:评价粒子优劣的值,一般设置为目标函数值
**个体最佳位置:**单个粒子迄今为止找到的最佳位置
群体最佳位置:所有粒子迄今为止找到的最佳位置

流程图

在这里插入图片描述

符号说明

在这里插入图片描述

核心公式

这只鸟第d步所在的位置=第d-1步所在的位置+第d-1步的速度*运动的时间
x(d) = x(d-1) + v(d-1) ×t(每一步运动的时间t—般取1)
在这里插入图片描述

这只鸟第d步的速度=上一步自身的速度惯性+自我认知部分+社会认知部分
v(d) = w×v(d-1) + c1×r1×(pbest(d)-x(d)) + c2×r2×(gbest(d)-x(d))(三个部分的和)
在这里插入图片描述

因数确定

在这里插入图片描述

在最初提出粒子群算法的论文中指出,个体学习因子和社会(或群体)学习因子取2比较合适。
(注意:最初提出粒子群算法的这篇论文没有惯性权重)

Kennedy J , Eberhart R .Particle swarm optimization[C]// Proceedings of lICNN’95 - International Conference on Neural Networks.IEEE, 1995.

在这里插入图片描述

论文中得到的结论:惯性权重取0.9-1.2是比较合适的,一般取0.9就行
引入惯性权重的论文:

SHI,Y. A Modified Particle Swarm Optimizer[C]// Proc. of IEEE ICEC conference, Anchorage.1998.

粒子群算法代码实现(MATLAB)

例题

在这里插入图片描述

初始化参数

n=10;%粒子数量
narvs = 1; %变量个数(函数中有几个自变量)
c1 = 2; %每个粒子的个体学习因子
c2 = 2; %每个粒子的社会学习因子
w = 0.9;%惯性权重
K = 50;%迭代的次数
vmax = 1.2; %粒子的最大速度
x_lb = -3; % x的下界
x_ub = 3; % x的上界

(1)增加粒子数量会增加我们找到更好结果的可能性,但会增加运算的时间。
(2) c1,c2,w这三个量有很多改进空间,未来我再来专门讲怎么去调整。
(3)迭代的次数K越大越好吗?不一定哦.如果现在已经找到最优解了,再增加迭代次数是没有意义的。
(4)这里出现了粒子的最大速度、是为了保证下一步的位置离当前位置别太远,—般取自变量可行域的10%至20%(不同文献看法不同)。
(5)X的下界和上界是保证粒子不会飞出定义域。

初始化粒子

x= zeros(n,narvs);
for i = 1: narvs
%随机初始化粒子所在的位置在定义域内
x(:,i) = x_lb(0) + (x_ub(i)-x_lb(i))*rand(n,1);
end
%随机初始化粒子的速度,设置为[-vmax,vmax]
v= -vmax + 2*vmax .* rand(n,narvs);

(1)这里为什么要写成下标的形式?
保证程序的兼容性,“适配"多元函数
(2)行向量为什么可以和矩阵来点乘?
在这里插入图片描述
(3)行向量为什么可以和矩阵来相加?

在这里插入图片描述

计算适应度

fit = zeros(n,1);%初始化这n个粒子的适应度全为0
for i = 1:n %循环整个粒子群,计算每一个粒子的适应度
fit(i) = Obj_fun1(x(i,:));%调用Obj_fun1函数来计算适应度(这里写成x讷)主要是为了和以后遇到的多元函数互通)
end
pbest = x;%初始化这n个粒子迄今为止找到的最佳位置(是一个n*narvs的向量)
ind = find(fit == max(fit),1);%找到适应度最大的那个粒子的下标
gbest = x(ind,:);%定义所有粒子迄今为止找到的最佳位置(是一个1*narvs的向量)

注意:
(1)这里的适应度实际上就是我们的目标函数值。
(2)这里可以直接计算出pbest和gbest,在后面将用于计算粒子的速度以更新粒子的位置。

更新粒子速度和位置循环

for d=1:K%开始迭代,一共迭代K次for i=1:n%依次更新第i个粒子的速度与位置%更新第i个粒子的速度v(i,:) = w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:))+ c2*rand(1)*(gbest - x(i,:));%如果粒子的速度超过了最大速度限制,就对其进行调整for j = 1: narvsif v(i,j) < -vmax(j)v(i,j) = -vmax(j);elseif v(i,j) > vmax(j)v(i,j) = vmax(j);endendx(i,:) = x(i,:) + v(i,:); %更新第i个粒子的位置%如果粒子的位置超出了定义域,就对其进行调整for j = 1: narvsif x(i,j) < x_lb(j)x(i,j) = x_lb(j);elseif x(i,j) > x_ub(j)x(i,j) = x_ub(j);endendfit(i)= Obj_fun1(x(i,:));%重新计算第i个粒子的适应度%如果第i个粒子的适应度大于这个粒子迄今为止找到的最佳位置对应的适应度if fit(i) > Obj_fun1(pbest(i,:))pbest(i,:)=x(i,:);%那就更新第i个粒子迄今为止找到的最佳位置end%如果第i个粒子的适应度大于所有的粒子迄今为止找到的最佳位置对应的适应度if Obj_fun1(pbest(i,:)) > Obj_fun1(gbest)gbest =pbest(i,:);%那就更新所有粒子迄今为止找到的最佳位置endend    
end

图形绘制

绘制函数的图形

x= -3:0.01:3;
y = 11*sin(x) + 7*cos(5*x);figure(1)
plot(x,y,'b-')
title('y = 11*sin(x)+ 7*cos(5*x)')
hold on

代码汇总

在这里插入图片描述

    clear;clc;x= -3:0.01:3;y = 11*sin(x) + 7*cos(5*x);figure(1)plot(x,y,'b-')title('y = 11*sin(x)+ 7*cos(5*x)')hold on%%n=10;%粒子数量narvs = 1; %变量个数(函数中有几个自变量)c1 = 2; %每个粒子的个体学习因子c2 = 2; %每个粒子的社会学习因子w = 0.9;%惯性权重K = 50;%迭代的次数vmax = 1.2; %粒子的最大速度x_lb = -3; % x的下界x_ub = 3; % x的上界%%x= zeros(n,narvs);for i = 1: narvs%随机初始化粒子所在的位置在定义域内x(:,i) = x_lb(i) + (x_ub(i)-x_lb(i))*rand(n,1);end%随机初始化粒子的速度,设置为[-vmax,vmax]v= -vmax + 2*vmax .* rand(n,narvs);%%fit = zeros(n,1);%初始化这n个粒子的适应度全为0for i = 1:n %循环整个粒子群,计算每一个粒子的适应度fit(i) = Obj_fun1(x(i,:));%调用Obj_fun1函数来计算适应度(这里写成x讷)主要是为了和以后遇到的多元函数互通)endpbest = x;%初始化这n个粒子迄今为止找到的最佳位置(是一个n*narvs的向量)ind = find(fit == max(fit),1);%找到适应度最大的那个粒子的下标gbest = x(ind,:);%定义所有粒子迄今为止找到的最佳位置(是一个1*narvs的向量)%%h = scatter(x,fit,80,'*r');fitnessbest = ones(K,1);%初始化每次迭代得到的最佳的适应度for d=1:K%开始迭代,一共迭代K次for i=1:n%依次更新第i个粒子的速度与位置%更新第i个粒子的速度v(i,:) = w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:))+ c2*rand(1)*(gbest - x(i,:));%如果粒子的速度超过了最大速度限制,就对其进行调整for j = 1: narvsif v(i,j) < -vmax(j)v(i,j) = -vmax(j);elseif v(i,j) > vmax(j)v(i,j) = vmax(j);endendx(i,:) = x(i,:) + v(i,:); %更新第i个粒子的位置%如果粒子的位置超出了定义域,就对其进行调整for j = 1: narvsif x(i,j) < x_lb(j)x(i,j) = x_lb(j);elseif x(i,j) > x_ub(j)x(i,j) = x_ub(j);endendfit(i)= Obj_fun1(x(i,:));%重新计算第i个粒子的适应度%如果第i个粒子的适应度大于这个粒子迄今为止找到的最佳位置对应的适应度if fit(i) > Obj_fun1(pbest(i,:))pbest(i,:)=x(i,:);%那就更新第i个粒子迄今为止找到的最佳位置end%如果第i个粒子的适应度大于所有的粒子迄今为止找到的最佳位置对应的适应度if Obj_fun1(pbest(i,:)) > Obj_fun1(gbest)gbest =pbest(i,:);%那就更新所有粒子迄今为止找到的最佳位置endfitnessbest(d) = Obj_fun1(gbest);%更新第d次迭代得到的最佳的适应度pause(0.1)%暂停0.1sh.XData = x; %更新散点图句柄的x轴的数据(此时粒子的位置在图上发生了变化)h.YData = fit; %更新散点图句柄的y轴的数据(此时粒子的位置在图上发生了变化)end figure(2)plot(fitnessbest)%绘制出每次迭代最佳适应度的变化图xlabel('迭代次数');disp('最佳的位置是:'); disp(gbest)disp('此时最优值是:'); disp(Obj_fun1(gbest))end

http://chatgpt.dhexx.cn/article/HbJC19yD.shtml

相关文章

粒子群优化算法

背景 1995 年&#xff0c;Kennedy 和 Eberhart 两位博士共同 提出了粒子群优化算法 (Particle swarm optimization&#xff0c; PSO) PSO 算法中&#xff0c;将鸟群的个体位置或食物当作优化问题的解&#xff0c;利用群体中个体与最优个体以及个体之间的信息交互&#xff0c;引…

粒子群算法

粒子群算法简介 粒子群算法&#xff0c;其全称为粒子群优化算法(Particle Swarm Optimization,PSO) 。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。粒子群算法属于启发式算法也叫智能优化算法&#xff0c;其基本思想在于通过群体中个体之间的协作和信息…

粒子群(PSO)算法的理解与应用

最近在学习粒子群算法&#xff0c;看了很多资料都有点摸不清头脑&#xff0c;直到看了一篇博客中超级简洁的粒子群C实现代码&#xff0c;才明白粒子群算法的原理&#xff0c;真心感谢博主&#xff0c;在此贴出博主的博客地址&#xff1a; http://blog.sina.com.cn/s/blog_4ed02…

6套粒子群算法(内含matlab代码)

粒子群算法(1)----粒子群算法简介 一、粒子群算法的历史 粒子群算法源于复杂适应系统&#xff08;Complex Adaptive System,CAS&#xff09;。CAS理论于1994年正式提出&#xff0c;CAS中的成员称为主体。比如研究鸟群系统&#xff0c;每个鸟在这个系统中就称为主体。主体有适…

粒子群算法(PSO)详解

1 粒子群PSO算法简介 1.1 维基百科的解释 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;&#xff0c;或称粒子群优化&#xff0c;是属于人工智能算法&#xff0c;公元1995年由肯尼迪&#xff08;Kennedy&#xff09;与埃伯哈特&#xf…

优化算法——粒子群算法(PSO)

一、粒子群算法的概述 粒子群算法(PSO)属于群智能算法的一种&#xff0c;是通过模拟鸟群捕食行为设计的。假设区域里就只有一块食物&#xff08;即通常优化问题中所讲的最优解&#xff09;&#xff0c;鸟群的任务是找到这个食物源。鸟群在整个搜寻的过程中&#xff0c;通过相互…

粒子群算法(PSO) 介绍

算法理解 粒子群算法&#xff0c;又叫鸟群算法&#xff0c;可见是受鸟群捕食行为的启发。它属于遗传算法、群智算法。粒子群算法关注于粒子的两个属性&#xff1a;位置和速度。每个粒子在空间中单独搜寻&#xff0c;它们记得自己找到的过最优解&#xff0c;也知道整个粒子群当…

【优秀作业】粒子群算法

粒子群优化算法 一、概述 粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;的思想来源于对鸟捕食行为的模仿&#xff0c;最初&#xff0c;Reynolds.Heppner 等科学家研究的是鸟类飞行的美学和那些能使鸟群同时突然改变方向&#xff0c;分散…

Dex加固与反编译

编译与反编译 编译 将java代码转换为Dalvik字节码 将res资源文件、AndroidManifest.xml等配置文件编译为二进制文件 反编译 将DEX文件转换为jar包或者Smali文件 将二进制资源文件还原为资源源码文件 编译与反编译是相对的过程&#xff0c;转换过程分别由编译器和反编译器实…

编译与反编译

编译&#xff1a;高级语言转换成计算机认识的低级语言 编译的主要的目的是将便于人编写、阅读、维护的高级语言所写作的源代码程序&#xff0c;翻译为计算机能解读、运行的低级语言的程序&#xff0c;也就是可执行文件。 反编译&#xff1a;Java的反编译&#xff0c;一般是将…

反编译网站

最近帮一个公司反编译了一个他们在用的网站&#xff0c;是一个印照片&#xff0c;然后群(384389229)里面的伙伴们&#xff08;专指&#xff1a;魂牵悲梦&#xff09;&#xff0c;叫我写个反编译的教程出来&#xff0c;由于前面时间很忙&#xff0c;一拖再拖到了现在终于有空就写…

编译/反编译

1.Android APK 1.软件 1.apktool 1.作用&#xff1a;反编译apk或重新打包apk 2.dex2jar 1.作用&#xff1a;将Android的可执行文件.dex转换为.jar 3.jd-gui 1.作用&#xff1a;方便阅读jar文件的代码工具 2.步骤 1.通过apktool将apk软件反编译2.使用dex2jar将classes.dex文件转…

反编译(Decompilers)

工具下载 调试工具反汇编工具反编译工具PE相关工具编译工具编辑工具.NET工具脱壳工具加壳工具补丁工具监视软件代码计算 密码学工具其它 反编译&#xff08;Decompilers&#xff09; VFP程序 UnFoxAll 3.0专业增强版  优点&#xff1a;界面和功能较实用缺点&#xff1a;支持到…

反编译器

转自&#xff1a;https://blog.csdn.net/kongwei521/article/details/54927689 在项目开发过程中&#xff0c;估计也有人和我遇到过同样的经历&#xff1a;运行环境出现了重大Bug亟需解决、或者由于电脑挂了、旧代码覆盖新代码&#xff0c;而在这种情况下&#xff0c;我们不能…

如何构建反汇编代码?

大型的非结构化反汇编指令堆几乎不可能被分析&#xff0c;所以大多数反汇编工具都会以某种简单的分析方法来构造反汇编代码。在本节中&#xff0c;我们将会讨论通过反汇编工具恢复的通用代码和数据结构&#xff0c;以及这些通用代码和数据结构会如何帮助我们进行二进制分析。 …

反编译

反编译 我们都知道&#xff0c;Android程序打完包之后得到的是一个APK文件&#xff0c;这个文件是可以直接安装到任何Android手机上的&#xff0c;我们反编译其实也就是对这个APK文件进行反编译。Android的反编译主要又分为两个部分&#xff0c;一个是对代码的反编译&#xff…

解决openai.error.APIConnectionError: Error communicating with OpenAI

一、问题描述 可以fanqiang&#xff0c;但是使用openai的接口还是报错如下的openai.error.APIConnectionError: Error communicating with OpenAI问题&#xff1a; File "D:\Anaconda3\envs\gms\lib\site-packages\openai\api_resources\abstract\engine_api_resource.py…

【Nginx应用】1.理解正、反向代理和负载均衡

在讲解Nginx之前&#xff0c;我们首先要理解什么是正向代理和反向代理。因为Nginx作为负载均衡的作用时&#xff0c;扮演的就是一个代理的角色&#xff0c;理解了正反向代理&#xff0c;对我们接下来学习Nginx会很有帮助1.正向代理 在我们的日常生活中其实就已经使用到了正向代…

软件安全实验——局域网DDoS攻击

文章目录 实验任务实验过程DoS攻击与DDoS攻击ping命令参数实施DDoS攻击 实验任务 对局域网内IP地址为10.12.186.186的主机&#xff08;已关闭防火墙&#xff09;发起基于网络流量的DDoS攻击。 实验过程 DoS攻击与DDoS攻击 DoS是Denial of Service的简称&#xff0c;即拒绝服务…

kali局域网攻击(一)

前言 很久以前的博客才发现&#xff0c;发布一下。 这个系列以后有时间再做。 arp攻击 arp路由链表,感兴趣的自行百度,我的博客我的笔记. 路由指向 介绍两个东西. echo 0 >/proc/sys/net/ipv4/ip_forward #让经过的数据不留通 echo 1 >/proc/sys/net/ipv4/ip_forward…