粒子群算法(PSO)简介及Python实现

article/2025/10/26 3:27:38

一、概述

  粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization) ,缩写为PSO.粒子群优化算法是一种进化计算技术(evolutionary computation),1995年由Eberhart博士和kennedy 博士提出,源于对鸟群捕食的行为研究。
  该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
  如果我们把一个优化问题看作是在空中觅食的鸟群,那么粒子群中每个优化问题的潜在解都是搜索空间的一只鸟,称之为“粒子”(Particle),“食物”就是优化问题的最优解。每个粒子都有一个由优化问题决定的适应度用来评价粒子的“好坏”程度,每个粒子还有一个速度决定它们飞翔的方向和距离,它根据自己的飞行经验和同伴的飞行经验来调整自己的飞行。粒子群初始化为一群随机粒子(随机解),然后通过迭代的方式寻找最优解,在每一次的迭代中,粒子通过跟踪两个“极值”来更新自己,第一个是粒子本身所经历过的最好位置,称为个体极值即pbest;另一个是整个群体经历过的最好位置称为全局极值gbest。每个粒子通过上述的两个极值不断更新自己,从而产生新一代的群体。

二、粒子群算法

  假设搜索空间是D维空间,并且群体中有N个粒子。那么群体中的第i个粒子可以表示为一个D维的向量,粒子i位置:Xi=(xi1,xi2,…,xiD),i=1,2,⋯,N。它所经历的“最好”位置记作pbesti=(pi1,pi2,…piD) ,i=1,2,⋯,N。粒子的每个位置代表要求的一个潜在解,把它代入目标函数就可以得到它的适应度值,用来评判粒子的“好坏”程度。整个群体迄今为止搜索到的最优位置记作gbest=(g1,g2,…gD)。通常,在第d(1≤d≤D)维的位置变化范围限定在[Xmin,d,Xmax,d] 内,速度变化范围限定在[-Vmax,d,Vmax,d]内(即在迭代中Vid、Xid若超出了边界值,则该维的速度或位置被限制为该维最大速度或边界位置)

粒子i的第d维速度更新公式:

粒子i的第d维位置更新公式:

c1:个体学习因子,也称为个体加速因子。这个因子越大粒子越倾向于往它自己曾去的最好的地方
c2:社会学系因子,也成为社会加速因子。这个因子越大粒子越倾向于种群中最好的的地方
r1,r2:[0,1]上的随机数。随机代表着粒子比较佛系,他也不知道飞哪里
惯性权重,也叫惯性系数,这个数越大,代表着它不容易更改之前的运动路线,更倾向于探索未知领域。

参数的选择:
  粒子数目一般取30~50,参数c1 , c2 一般取2。适应度函数、粒子的维数和取值范围要视具体问题而定。问题解的编码方式通常可以采用实数编码。更新速度后,先进行速度边界检测,一般采用v(v > Vmax)= Vmax,位置同理。常见终止条件为设定迭代进化次数、适应度n代不再变化等。

算法的主要流程:
第一步:对粒子群的随机位置和速度进行初始设定,同时设定迭代次数。
第二步:计算每个粒子的适应度值。
第三步:对每个粒子,将其适应度值与所经历的最好位置pbest i的适应度值进行比较,若较好,则将其作为当前的个体最优位置。
第四步:对每个粒子,将其适应度值与全局所经历的最好位置gbestg的适应度值进行比较,若较好,则将其作为当前的全局最优位置。
第五步:根据速度、位置公式对粒子的速度和位置进行优化,从而更新粒子位置。
第六步:如未达到结束条件(通常为最大循环数或最小误差要求),则返回第二步

三、算法优缺点

优点:

  1. PSO算法没有交叉和变异运算,依靠粒子速度完成搜索,并且在迭代进化中只有最优的粒子把信息传递给其它粒子,搜索速度快。
  2. PSO算法具有记忆性,粒子群体的历史最好位置可以记忆并传递给其它粒子。
  3. 需调整的参数较少,结构简单,易于工程实现。
  4. 采用实数编码,直接由问题的解决定,问题解的变量数直接作为粒子的维数。

缺点:

  1. 缺乏速度的动态调节,容易陷入局部最优,导致收敛精度低和不易收敛。
  2. 不能有效解决离散及组合优化问题。
  3. 参数控制,对于不同的问题,如何选择合适的参数来达到最优效果。
  4. 不能有效求解一些非直角坐标系描述问题,

  粒子群算法的参数是固定的。w描述的是粒子的“惯性”,在进化前期w应该大一些,保证各个粒子独立飞行充分搜索空间,后期应该小一点,多向其他粒子学习。c1,c2分别向个体极值和全局极值最大飞行步长。前期c1,应该大一些,后期c2,应该大一些,这样就能平衡粒子的全局搜索能力和局部搜索能力。3个参数共同影响了粒子的飞行方向,导致即使其他粒子找到更好的,但是当前粒子惯性太大,不能很快的飞向更优的位置。


四、简单的实例及Python实现

import numpy as np
import randomclass PSO_model:def __init__(self,w,c1,c2,r1,r2,N,D,M):self.w = w # 惯性权值self.c1=c1self.c2=c2self.r1=r1self.r2=r2self.N=N # 初始化种群数量个数self.D=D # 搜索空间维度self.M=M # 迭代的最大次数self.x=np.zeros((self.N,self.D))  #粒子的初始位置self.v=np.zeros((self.N,self.D))  #粒子的初始速度self.pbest=np.zeros((self.N,self.D))  #个体最优值初始化self.gbest=np.zeros((1,self.D))  #种群最优值self.p_fit=np.zeros(self.N)self.fit=1e8 #初始化全局最优适应度# 目标函数,也是适应度函数(求最小化问题)def function(self,x):A = 10x1=x[0]x2=x[1]Z = 2 * A + x1 ** 2 - A * np.cos(2 * np.pi * x1) + x2 ** 2 - A * np.cos(2 * np.pi * x2)return Z# 初始化种群def init_pop(self):for i in range(self.N):for j in range(self.D):self.x[i][j] = random.random()self.v[i][j] = random.random()self.pbest[i] = self.x[i] # 初始化个体的最优值aim=self.function(self.x[i]) # 计算个体的适应度值self.p_fit[i]=aim # 初始化个体的最优位置if aim < self.fit:  # 对个体适应度进行比较,计算出最优的种群适应度self.fit = aimself.gbest = self.x[i]# 更新粒子的位置与速度def update(self):for t in range(self.M): # 在迭代次数M内进行循环for i in range(self.N): # 对所有种群进行一次循环aim=self.function(self.x[i]) # 计算一次目标函数的适应度if aim<self.p_fit[i]: # 比较适应度大小,将小的负值给个体最优self.p_fit[i]=aimself.pbest[i]=self.x[i]if self.p_fit[i]<self.fit: # 如果是个体最优再将和全体最优进行对比self.gbest=self.x[i]self.fit = self.p_fit[i]for i in range(self.N): # 更新粒子的速度和位置self.v[i]=self.w*self.v[i]+self.c1*self.r1*(self.pbest[i]-self.x[i])+ self.c2*self.r2*(self.gbest-self.x[i])self.x[i]=self.x[i]+self.v[i]print("最优值:",self.fit,"位置为:",self.gbest)if __name__ == '__main__':# w,c1,c2,r1,r2,N,D,M参数初始化w=random.random()c1=c2=2#一般设置为2r1=0.7r2=0.5N=30D=2M=200pso_object=PSO_model(w,c1,c2,r1,r2,N,D,M)#设置初始权值pso_object.init_pop()pso_object.update()

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

相关文章

mac中如何在PS中使用Cutterman工具快速切图

简介 cutterman是安装在PS软件中的一款智能自动切图插件&#xff0c;用法简单方便&#xff0c;很受设计者们喜欢&#xff0c;导出的图片格式有多种选择&#xff0c;而且还可以针对不同机型选择如苹果系统、安卓系统或电脑端使用。 工具/原料 Photoshoppsd格式图层图片 方法/…

sketch android 切图,Sketch如何快速切图?三分钟教你掌握切图方案

相信有相当一部分的设计同行在工作中碰到各种各样切图尺寸大小的问题&#xff0c;针对Sketch如何快速切图这个问题&#xff0c;今天小编特意出了一篇有关sketch切图尺寸教程的文章&#xff0c;学会了包你三分钟之内掌握设置切图方案的技巧&#xff0c;然后更安心的把剩余时间花…

切图教程,app切图命名总结

再根据自己的习惯对APP切图命名进行整理总结。 结语&#xff1a; 作为一个有强迫症的设计师&#xff0c;希望产出是有缜密的思维逻辑&#xff0c;当然包括细节。 文字有的部分参考其它文章&#xff0c;整理后根据自己的工作经验作出的总结。 自己也还在不断的摸索与学习。 声明…

PS切图方法

方法一&#xff1a;直接右击选中图层&#xff0c;另存为.png文件 方法二&#xff1a;对于分离的几个图层&#xff0c;右击shift选中&#xff0c;ctrE合并图层&#xff0c;再用方法一 方法三&#xff1a;利用切片工具进行切图&#xff1a; 方法四&#xff1a;PS插件切图&#…

PS中的切图

文章目录 图层切图切片切图PS插件切图附&#xff1a;常见的图片格式 PS 有很多的切图方式&#xff1a;图层切图、切片切图、PS 插件切图等。 图层切图 最简单的切图方式&#xff1a;右击图层 --> 导出 PNG 切片。 如果发现某张图片它的文字和背景是分离的&#xff0c;那么…

真正的ps切图方法(前端必看)

看了很多ps切图方法&#xff0c;真的感觉都不是很满意&#xff0c;可能说不是很合适我们前端的用法&#xff0c;毕竟我们要获取的是某一个图层里面的小图片&#xff0c;不需要获取全部切图&#xff0c;好了&#xff0c;废话不多说&#xff0c;看方法。 1.选中所在的图层&#x…

ps 快速切图

前端实战系列之---两种快速切图的方法 今天给大家分享一下我自己在前端工作中的一些切图小技巧&#xff0c;虽然好的UI会给我们把图切好&#xff0c;但是他们切的图不一定百分之百符合我们的需求&#xff0c;所以还是自己动手丰衣足食嘛&#xff0c;看本教程之前希望大家能先看…

切图工具:又一个处理大图的例子

工具下载 有些同学对处理大图还是不太明白&#xff0c;这里再仔细写一个例子&#xff0c;希望能有所帮助。 基本情况&#xff1a; 1、使用高德地图&#xff1b; 2、朋友使用12级地图截屏做底图&#xff0c;制作的源图为17级&#xff0c;分辨率为40960*40960&#xff1b; 由于…

地图切图工具:初步实现顺序法批量切图处理,用于处理大图

工具&#xff1a;https://blog.csdn.net/bq_cui/article/details/47372005 &#xff08;20190504&#xff09; 由于技术限制&#xff0c;本工具无法打开超级大图。切图时如果遇到一个很大的源图片&#xff0c;工具会难以处理&#xff0c;一般是跳出内存溢出提示&#xff0c;点击…

houdini 之copy to points

将第一个输入中的几何图形复制到第二个输入的点上。 属性备注Source Group几何体来源Target Points要复制到的目标点集合Show Guide Geometry是否显示该操作预览流程Pack and Instance在复制之前将输入几何体打包到嵌入式打包图元中。这导致输入几何被每个副本共享&#xff08;…

如何利用Photoshop进行快速切图

在UI设计中我们常常使用Ai来进行矢量图的绘制&#xff0c;然后导入Ps中进行设计、排版和导出。 在以前的版本中&#xff0c;切图一直是个很麻烦的事情&#xff0c;要么依托于脚本&#xff0c;要么手动一张张导出&#xff0c;很不方便&#xff0c;这种窘况在Photoshop CC 2015…

图像分割之图割(Graph Cut)

基本概念 这里介绍一种用于n维图像数据的边界优化和区域分割的分割技术。该分割算法来自论文&#xff1a;Interactive Graph Cuts for Optimal Boundary & Region Segmentation of Objects in N-D Images。该方法通过交互式的或自动的定位一个或多个代表“物体”的点以及一…

4. PS切图

4.1常见的图片格式 jpg图像格式: JPEG ( .JPG )对色彩的信息保留较好,高清,颜色较多,我们产品类的图片经常用jpg格式的gif图像格式 : GIF格式最多只能储存256色,所以通常用来显示简单图形及字体,但是可以保存透明背景和动画效果,实际经常用于一些图片小动画效果png图像格式&am…

Photoshop 实时切图功能 Generate

大家好&#xff0c;我是笨笨&#xff0c;笨笨的笨&#xff0c;笨笨的笨&#xff0c;谢谢!!! 本文发表在【湖边的小屋遗址】 转载请注明出处 Generate web assets in Photoshop CC 貌似就是以前的 Ctrl Shift Alt s 升级。并不只是操作上&#xff0c;感觉是要优化输出资源的…

IOS切图直接作为Android切图使用

跳槽到新公司之后&#xff0c;发现工作真心挺坑的&#xff0c;基本没什么流程规范&#xff0c;职责分工也不明确&#xff0c;整天瞎折腾。。。&#xff0c;慢慢的开始怀念起老东家了。 在新公司UI只提供ios的切图给开发&#xff0c;其实他们不会做android切图。。。&#xff0c…

Group Convolution与Depthwise Convolution

转自&#xff1a;Group Convolution分组卷积&#xff0c;以及Depthwise Convolution和Global Depthwise Convolution - 云社区 - 腾讯云 写在前面 Group Convolution分组卷积&#xff0c;最早见于AlexNet——2012年Imagenet的冠军方法&#xff0c;Group Convolution被用来切分…

Graph Cut(图割)详解

原文地址&#xff1a;http://blog.csdn.net/zouxy09/article/details/8532111 Graph cuts是一种十分有用和流行的能量优化算法&#xff0c;在计算机视觉领域普遍应用于前背景分割&#xff08;Image segmentation&#xff09;、立体视觉&#xff08;stereo vision&#xff09;、…

sketch的切图技巧总结:如何批量切出固定大小的切图并保留透明部分?

原文来自公众号&#xff1a;希音的设计笔记 获取方式 关注公众号&#xff1a;希音的设计笔记&#xff0c;后台回复 切图插件 &#x1f447;&#x1f447; 限时免费扫码进群&#xff0c;交流行业设计 添加小编微信一起见证彼此成长 最近有刚转战sketch的同学问到两个问题&am…

利用Photoshop进行快速切图

概要 在UI设计中我们常常使用Ai来进行矢量图的绘制&#xff0c;然后导入Ps中进行设计、排版和导出。 在以前的版本中&#xff0c;切图一直是个很麻烦的事情&#xff0c;要么依托于脚本&#xff0c;要么手动一张张导出&#xff0c;很不方便&#xff0c;这种窘况在Photoshop CC…

前端必备 PS三种切图方法 Cutterman最好用的切图工具

文章目录 1.常见的图片格式方法1. PS图层切图方法2. 切片切图方法3.Cutterman插件切图(最简单、最好用的切图工具) 准备工作&#xff1a;一个非绿色版的PS软件&#xff0c;如果还没安装好PS的&#xff0c;建议在微信搜“软件安装目录”小程序&#xff0c;里面有大多数办公和编程…