智能算法系列之粒子群优化算法

article/2025/10/7 1:52:33

在这里插入图片描述

  本博客封面由ChatGPT + DALL·E 2共同创作而成。

文章目录

    • 前言
    • 1. 算法思想
    • 2. 细节梳理
      • 2.1 超参数的选择
      • 2.2 一些trick
    • 3. 算法实现
      • 3.1 问题场景
      • 3.2 python实现
    • 代码仓库:IALib[GitHub]

前言

  本篇是智能算法(Python复现)专栏的第三篇文章,主要介绍粒子群优化算法(ParticleSwarm Optimization, PSO)的思想,python实现及相关应用场景模拟。

  粒子群优化算法,简称粒子群算法,也叫作鸟群觅食算法。PSO算法的基本思想受到许多对鸟类的群体行为(觅食行为)进行建模与仿真研究结果的启发,粒子在解空间中追随最优的粒子进行迭代搜索,而不需要像遗传算法那样使用交叉以及变异操作。

1. 算法思想

  PSO算法最初设想是模拟鸟群觅食的过程,想象这样一个场景:一群鸟随机的分布在一个区域,在这个区域只有一块食物,但是所有的鸟都不知道这块食物的具体方位,只知道自己当前的位置距离食物还有多远。找到食物最简单有效的方式就是搜索目前离食物最近的鸟的周围区域。如果把食物当作最优点,而把鸟离食物的距离当作函数的适应度,那么鸟寻觅食物的过程就可以当作函数寻优的过程。由此受到启发,经过简化提出了PSO算法。

  PSO算法作为一种仿生算法,目前还没有完备的数学理论作为基础,但是作为一种新兴的智能优化算法,已经在诸多领域展现了良好的应用前景。

  粒子群优化算法的核心思想是通过模拟鸟群或鱼群等动物的群体行为,以达到求解最优化问题的目的。在粒子群优化中,搜索空间中的每个解都被视为一个粒子,每个粒子的位置表示解的搜索空间中的位置,粒子的速度表示解的搜索方向和速度。在搜索过程中,每个粒子通过学习其他粒子的经验,更新自己的位置和速度。粒子的位置和速度的更新可以分为两个部分:局部搜索和全局搜索。局部搜索是指粒子在其自身经验的基础上进行搜索,全局搜索是指粒子在全局最优解的基础上进行搜索。具体来说,每个粒子会记忆其历史最优解和全局最优解,然后通过调整自己的速度和位置来寻找更好的解。
  粒子群优化算法的基本步骤如下:
  (1) 初始化粒子群:随机生成粒子群中每个粒子的位置和速度。
  (2) 计算每个粒子的适应度:根据粒子的位置计算适应度函数的值。
  (3) 更新每个粒子的历史最优解:将粒子自己的历史最优解更新为当前最优解。
  (4) 更新全局最优解:将整个粒子群的最优解更新为所有粒子历史最优解中最优的一个。
  (5) 更新每个粒子的速度和位置:根据当前粒子自己的历史最优解和整个粒子群的最优解,以及粒子的速度和位置,更新粒子的速度和位置。
  粒子的速度更新公式如下: v ( t + 1 ) = v ( t ) + c 1 r 1 ( t ) [ p b e s t ( t ) − x ( t ) ] + c 2 r 2 ( t ) [ g b e s t ( t ) − x ( t ) ] v(t+1) = v(t) + c_1r_1(t)[pbest(t) - x(t)] + c_2r_2(t)[gbest(t) - x(t)] v(t+1)=v(t)+c1r1(t)[pbest(t)x(t)]+c2r2(t)[gbest(t)x(t)]  其中 c 1 c_1 c1 c 2 c_2 c2表示学习因子,也叫加速因子,具体来说, c 1 c_1 c1用来调节粒子飞向自身最好位置方向的步长, c 2 c_2 c2用来调节粒子飞向全局最好位置方向的步长。 r 1 r_1 r1 r 2 r_2 r2用来保持群体的多样性。 p b e s t pbest pbest表示当前粒子迄今为止搜索到的最优位置, g b e s t gbest gbest为整个粒子群迄今为止搜索到的最优位置。
  粒子的位置更新公式如下: x ( t + 1 ) = x ( t ) + v ( t + 1 ) x(t+1) = x(t) + v(t+1) x(t+1)=x(t)+v(t+1)

在这里插入图片描述

2. 细节梳理

2.1 超参数的选择

  PSO算法中没有实际的机制来控制粒子速度,值太大会导致粒子跳过最好解,太小又会导致对搜索空间的不充分搜索,所以有必要对速度的范围进行限制,一般可以根据搜索的位置范围进行调节,比如,本示例中的搜索范围为[0, 5],粒子的速度范围为[-1, 1]
   c 1 c_1 c1 c 2 c_2 c2这两个参数对粒子群算法的收敛起的作用不是很大,但是适当调整这两个参数,可以减小局部最小值的困扰,当然也会使收敛速度变快。
   r 1 r_1 r1 r 2 r_2 r2可以设置为[0,1]的随机数。

2.2 一些trick

  为了改善基本PSO算法的收敛性能,在更新粒子的速度时引入了惯性权重的概念,即: v ( t + 1 ) = w v ( t ) + c 1 r 1 ( t ) [ p b e s t ( t ) − x ( t ) ] + c 2 r 2 ( t ) [ g b e s t ( t ) − x ( t ) ] v(t+1) = wv(t) + c_1r_1(t)[pbest(t) - x(t)] + c_2r_2(t)[gbest(t) - x(t)] v(t+1)=wv(t)+c1r1(t)[pbest(t)x(t)]+c2r2(t)[gbest(t)x(t)]  其中, w w w称为惯性权重,基本PSO算法是惯性权重 w = 1 w=1 w=1的特殊情况。惯性权重 w w w使粒子保持飞行惯性,使其可以扩展搜索空间,有能力探索新的区域。

  带有惯性权重的粒子群优化算法是最常用的一种粒子群优化算法,本示例就是基于带有惯性权重的粒子群优化算法进行实现的。

  惯性权重 w w w的引入清除了基本PSO算法对速度最大值的需求,因为 w w w的作用就是保持全局和局部搜索能力的平衡。当速度最大值增加时,就人为减少 w w w来达到搜索的平衡,而 w w w的减少可降低需要的迭代次数,就可以将某一维速度的最大值锁定为每维变量的变化范围,只对 w w w进行调节。
  对全局搜索,广泛使用的方法是在前期利用较高的探索能力得到具有超高潜力且多样化的种子,而在后期提升开发能力以加快收敛速度,所以,也可以将 w w w设定为随进化迭代次数线性减少[在本示例中未实现该操作]

  除了上述的改进算法外,还有协同粒子群优化算法、量子粒子群优化算法(Qutantum-behaved Particle SwarmOptimization,QPSO)和混合粒子群优化算法。其中混合粒子群优化算法的研究更为广泛,小博主我计划在下一篇中介绍一下基于模拟退火算法的粒子群优化算法,其性能比单纯的模拟退火算法和粒子群优化算法都要好,敬请期待。

3. 算法实现

3.1 问题场景

  最值问题,求解 f ( x ) = x s i n ( 5 x ) − x c o s ( 2 x ) f(x) = xsin(5x) - xcos(2x) f(x)=xsin(5x)xcos(2x)在定义域[0, 5]上的最小值。我们先手动计算一下:

f ′ ( x ) = 2 x s i n ( 2 x ) + s i n ( 5 x ) − c o s ( 2 x ) + 5 x c o s ( 5 x ) f^\prime (x) = 2 x sin(2 x) + sin(5 x) - cos(2 x) + 5 x cos(5 x) f(x)=2xsin(2x)+sin(5x)cos(2x)+5xcos(5x)  令 f ′ ( x ) = 0 f^\prime (x) = 0 f(x)=0之后,理论上可以求得驻点,但又不太好计算。。。

3.2 python实现

# -*- coding:utf-8 -*-
# Author:   xiayouran
# Email:    youran.xia@foxmail.com
# Datetime: 2023/3/16 16:54
# Filename: particle_swarm_optimization.py
import numpy as np
import matplotlib.pyplot as plt
from base_algorithm import BaseAlgorithm
# base_algorithm 的实现已开源在github上
# 链接在文章末尾__all__ = ['ParticleSwarmOptimization']class Particle:def __init__(self):self.position = None    # 粒子的位置self.velocity = None    # 粒子的速度self.best_position = None   # 个体最优解self.fitness = None         # 适应度值class ParticleSwarmOptimization(BaseAlgorithm):def __init__(self, population_size=100, p_dim=1, v_dim=1, max_iter=1000, x_range=(0, 5), seed=10086):super(ParticleSwarmOptimization, self).__init__()self.__population_size = population_size  # 种群大小self.__p_dim = p_dim        # 粒子位置维度self.__v_dim = v_dim        # 粒子速度维度self.__max_iter = max_iter  # 最大迭代次数self.__w = 0.5    # 惯性权重self.__c1 = 1.5   # 加速因子1self.__c2 = 1.5   # 加速因子2self.__population = []    # 粒子群self.global_best_particle = None    # 全局最优解self.__x_range = x_rangeself.__seed = seednp.random.seed(seed)def init_population(self):for i in range(self.__population_size):particle = Particle()particle.position = np.random.uniform(*self.__x_range, size=self.__p_dim)   # 随机初始化位置particle.velocity = np.random.uniform(-1, 1, size=self.__v_dim)     # 随机初始化速度particle.best_position = particle.position  # 初始最优位置particle.fitness = self.problem_function(particle.position)     # 计算适应度值if self.global_best_particle is None or particle.fitness < self.problem_function(self.global_best_particle.position):self.global_best_particle = particle  # 更新全局最优解self.__population.append(particle)def update_population(self):for i in range(self.__population_size):particle = self.__population[i]r1 = np.random.uniform(0, 1)r2 = np.random.uniform(0, 1)# Step2: 更新速度particle.velocity = self.__w * particle.velocity + \self.__c1 * r1 * (particle.best_position - particle.position) + \self.__c2 * r2 * (self.global_best_particle.position - particle.position)# Step3: 更新位置particle.position += particle.velocityparticle.position = np.clip(particle.position, 0, 5)# Step4: 更新个体最优解if self.problem_function(particle.position) < self.problem_function(particle.best_position):particle.best_position = particle.positionparticle.fitness = self.problem_function(particle.position)# Step5: 更新全局最优解if self.problem_function(particle.position) < self.problem_function(self.global_best_particle.position):self.global_best_particle = particledef solution(self):# Step1: 粒子初始化self.init_population()for i in range(self.__max_iter):self.update_population()print('best particle:\nposition: {}\nvelocity: {}''\nfitness: {}\nbest_position: {}'.format(self.global_best_particle.position,self.global_best_particle.velocity,self.global_best_particle.fitness,self.global_best_particle.best_position))if __name__ == '__main__':algo = ParticleSwarmOptimization()algo.solution()

  得到的最优解如下:

best particle:
position: [3.43298001]
velocity: [1.10173139e-09]
fitness: [-6.27707976]
best_position: [3.43298001]

  模拟过程如下:

在这里插入图片描述

代码仓库:IALib[GitHub]

  本篇代码已同步至【智能算法(Python复现)】专栏专属仓库:IALib
  运行IALib库中的PSO算法:

git clone git@github.com:xiayouran/IALib.git
cd examples
python main.py -algo pso

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

相关文章

粒子群优化算法(PSO)

粒子群优化算法&#xff08;PSO&#xff09; 粒子群优化算法&#xff08;PSO&#xff09;是一种进化计算技术&#xff0c;源于对鸟群捕食行为的研究。该算法最初是受到飞鸟集群活动的规律性启发&#xff0c;进而利用群体智能建立的一个简化模型。粒子群算法在对动物及群活动行…

数学建模——粒子群优化算法(PSO)【有详细样例 + 工具:matlab】(万字总结)

文章目录 一、粒子群优化算法(PSO)是什么&#xff1f;二、粒子群优化算法有什么用&#xff1f;三、粒子群优化算法的适用范围&#xff1f;四、算法简介(有助于理解)五、算法流程第一步&#xff1a;初始化第二步&#xff1a;计算粒子的适应度第三步&#xff1a;更新个体极值与全…

粒子群优化算法(PSO)附代码

文章目录 1 算法介绍2 算法模型3 实现步骤4 MATLAB代码实现PSO算法4.1. main.m4.2. 运行结果 1 算法介绍 粒子群优化算法(Particle Swarm Optimization&#xff0c;PSO)是一种经典的群智能算法&#xff0c;该算法灵感源自于鸟类飞行和觅食的社会活动&#xff0c;鸟群通过个体之…

浏览器添加划词翻译插件

网站&#xff1a;https://github.com/Selection-Translator/crx-selection-translate 安装下载的扩展程序

Chrome划词翻译-Saladict

Saladict 沙拉查词是一款专业划词翻译扩展&#xff0c;为交叉阅读而生。大量权威词典涵盖中英日韩法德西语&#xff0c;支持复杂的 划词操作、网页翻译、生词本、PDF&#xff0c;以及 Vimium 全键盘操作 。 迄今为止最好用的网页划词翻译插件。 下载安装地址&#xff1a;Chrome…

谷歌划词翻译

谷歌划词翻译是个谷歌插件 复制及时翻译很好用 插件下载地址 配置谷歌翻译方法

惊了,MATLAB竟能制作如此方便的划词翻译工具???

我点开程序一看&#xff0c;程序第一行就写着import&#xff0c; 却歪歪斜斜的每行上都是着MATLAB几个大字。 我横竖睡不着&#xff0c;仔细看了半夜&#xff0c; 才从字缝里看出字来&#xff0c;满页都写着 ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀——Java 其实用的…

python实现划词翻译

最近因为编程&#xff0c;需要大量地看一些说明文档&#xff0c;无奈说明文档都是英文的&#xff0c;可把我这个半桶水折腾死了&#xff0c;太多词汇不知道&#xff0c;一个个复制翻译太麻烦了。于是我根据自己的需要&#xff0c;用python写了一个划词翻译。 一&#xff1a;使…

划词翻译简单实现

环境&#xff1a;archlinux &#xff0c;其余linux系统类似 安装依赖 sudo pacman -S xsel sudo pacman -S translate-shell sudo pacman -S libnotify脚本书写 创建脚本 touch word_translate.sh chmod x word_translate.sh vim word_tranlate.sh#!/bin/bashwhile true; d…

Chrome划词插件-有道词典

当我们在阅读文章&#xff0c;查找资料或者查看英文文献时&#xff0c;经常会遇到不认识的英文单词&#xff0c;这时&#xff0c;我们往往会复制单词百度一下才行。 其实&#xff0c;遇到这种情况&#xff0c;我们可以直接下载一个有道词典的Chrome划词插件&#xff0c;遇到需…

PDF划词翻译插件

PDF划词翻译插件 1、打开一个拓展插件的下载网站2、下载沙拉查词并安装3、进入详情&#xff0c;设置为允许打开文件网址4、固定她5、打开她的设置最终划词结果 1、打开一个拓展插件的下载网站 点击此网站地址 2、下载沙拉查词并安装 打开开发者模式&#xff0c;把下载好的.cr…

福昕pdf阅读器的划词翻译功能如何添加(图文并茂)

一、打开福昕阅读器 二、可在上方工具栏&#xff0c;点击“帮助”&#xff0c;关于福昕阅读器领鲜版查看安装的版本信息&#xff0c;如图1-1&#xff0c;图1-2 图1-1 图1-2 三、找到上方工具栏的图标按键&#xff0c;名为“自定义快速访问工具栏”&#xff0c;如图1-3&#…

谷歌浏览器无法翻译成中文,谷歌翻译,最新(沉浸式翻译和划词翻译,chrome无法翻译,谷歌浏览器无法翻译此网页)

简介&#xff1a;谷歌浏览器自带的翻译功能&#xff0c;对我们来说用处很大&#xff0c;但有的时候突然就会变成“无法翻译此网页”&#xff0c;之前给大家提供过两种无法翻译此网页的解决方案&#xff0c;这次再给大家分享下两款别的翻译方法&#xff1b; 一、上次介绍&#x…

关于网页划词翻译

2013-4-21 近日偶然看到js页面文字选中后分享到新浪微博实现&#xff0c;发现原来竟然只要一句话就可以实现获取划词。便萌生自己写个划词翻译的东东&#xff0c;方便自己看文档。 我首先想到了之前看到的油猴插件&#xff0c;最早是在看优酷去广告插件的原理时知道这个东西。感…

基于Edge浏览器的沙拉划词插件使用教程(好用的翻译插件)

1.使用目的 - 使用沙拉划词实现网页多种翻译源进行实时翻译。 - 使用沙拉划词实现PDF翻译。 2.安装方法 2.1 打开edge扩展 点击工具栏右侧… 然后点击扩展 进入扩展 2.2 下载沙拉划词 2.2.1 点击获取扩展 2.2.2点击搜索 搜索沙拉划词 回车搜索 正常获取并添加扩展 出现沙…

PDF划词翻译软件

PDF划词翻译 一个简单的PDF划词翻译软件。 Github仓库地址&#xff1a;https://github.com/WCX1024979076/simple_pdf_translator Github下载地址&#xff1a; https://github.com/WCX1024979076/simple_pdf_translator/releases/tag/v0.1.0 Gitee仓库地址&#xff1a; htt…

推荐一个谷歌浏览器插件:划词翻译

地址&#xff1a;划词翻译插件 最近在看一些英文文档&#xff0c;遇到了一些词汇不认识&#xff0c;在谷歌浏览器上找到了这个翻译插件 谷歌浏览器自己有一个全文翻译的功能&#xff0c;对于一些技术类文档&#xff0c;有些词如果翻译错误了就会闹出笑话来&#xff0c;限于对…

一个简单的划词翻译工具

一个简单的划词翻译工具 看论文时经常要翻译&#xff0c;然而手动复制粘贴到翻译网站上又很麻烦&#xff0c;有些划词翻译工具比如有道的划词和取词&#xff0c;虽然不用按快捷键只选中文本就能翻译&#xff0c;但有时也会失灵什么的&#xff0c;于是就自己用python写了个调用百…

安装侧边翻译,划词翻译,看外文论文神器,比知云还好用Edge Translate

前言 写论文相信大家参考的大多数都是外文文献&#xff0c;但是想我这样英文水平不佳的小伙伴还是比较多的&#xff0c;所以看外文文献就很费劲。 有的小伙伴用谷歌或者百度翻译 一边复制翻译一边看&#xff0c; 后来用知云翻译方便的很多&#xff0c;但是每次…

论文阅读利器——划词翻译插件(桌面与浏览器)

对于喜爱学习&#xff0c;阅读文献的各位来说&#xff0c;满屏的英文字母常常会磨灭我们的热情&#xff0c;而一般的翻译软件又有些贵&#xff0c;或者是根本没有很好的效果。 那么&#xff0c;今天&#xff0c;在这里介绍几款开源的插件与软件。都是可以免费使用的。 一、Edg…