人工智能算法之粒子群优化算法

人工智能算法之粒子群优化算法

在这里插入图片描述

粒子群优化算法(PSO)是一种群体智能优化算法,由Kennedy和Eberhart在1995年提出,灵感来源于鸟群、鱼群等生物群体行为。PSO通过群体中个体的交互及对周围环境的感知,快速找到最优解。PSO算法广泛应用于函数优化、机器学习、神经网络训练等多个领域,具有实现简单、参数少、收敛速度快等优点。

粒子群优化算法的基本原理

PSO算法的核心思想是通过群体协作和共享信息,找到问题的最优解。在PSO算法中,每个个体称为“粒子”,每个粒子代表一个潜在的解。粒子在搜索空间中移动,并通过迭代更新其速度和位置来寻找最优解。在迭代过程中,每个粒子根据其个体最佳位置全局最佳位置来调整其速度和位置,从而不断逼近最优解。

在PSO算法中,每个粒子具有以下属性:

  1. 位置 xi :粒子在搜索空间中的当前位置,表示一个潜在解。
  2. 速度 vi :粒子的移动速度,决定粒子的位置更新方向和步长。
  3. 个体最佳位置 pi :粒子自身历史搜索中找到的最佳位置。
  4. 全局最佳位置 g :整个粒子群体中找到的最佳位置。

粒子的位置和速度会根据以下公式进行更新:

  1. 速度更新公式
    在这里插入图片描述

    其中:

在这里插入图片描述

  • 为粒子 i 在第 k+1 次迭代时的速度;
  • w 为惯性权重,用于平衡粒子的探索能力和开发能力;
  • c1 和 c2 为学习因子,控制粒子追随个体最佳位置和全局最佳位置的程度;
  • r1 和 r2 为[0, 1]的随机数,增加随机性;
  • pi 表示粒子 i 的个体最佳位置;
  • g 表示全局最佳位置;
  • 为粒子 i 在第 k 次迭代的位置。

在这里插入图片描述

  1. 位置更新公式
    在这里插入图片描述

    其中 在这里插入图片描述
    为粒子 i 在第 k+1 次迭代的位置。

PSO算法的参数

  • 惯性权重 ( w ):决定粒子当前速度的影响程度。较大的 w 值有助于探索搜索空间,较小的 w 值有助于开发局部区域。
  • **学习因子 c1 和 c2 **:分别控制粒子向自身最佳位置和全局最佳位置靠拢的力度。
  • 粒子数量:粒子的数量越多,算法的全局搜索能力越强,但计算量也会增大。

粒子群优化算法的伪代码

  1. 初始化粒子群的每个粒子位置和速度。
  2. 计算每个粒子的适应度值。
  3. 更新每个粒子的个体最佳位置和全局最佳位置。
  4. 更新粒子的速度和位置。
  5. 如果满足终止条件(如达到最大迭代次数),则结束;否则,返回步骤2继续迭代。

粒子群优化算法的Python实现

以下代码演示了PSO算法在二维函数上的优化过程,目标是找到函数的最小值。我们选择优化一个简单的Rosenbrock函数:

在这里插入图片描述

Rosenbrock函数常用作算法测试函数,函数的最小值为0,位于点( (a, a^2) )。

Python代码实现
import numpy as np# 定义Rosenbrock函数
def rosenbrock(x, y, a=1, b=100):return (a - x) ** 2 + b * (y - x ** 2) ** 2# 粒子类
class Particle:def __init__(self, bounds):self.position = np.array([np.random.uniform(bounds[0][0], bounds[0][1]),np.random.uniform(bounds[1][0], bounds[1][1])])self.velocity = np.array([np.random.uniform(-1, 1), np.random.uniform(-1, 1)])self.best_position = self.position.copy()self.best_score = float('inf')def update_velocity(self, global_best_position, w, c1, c2):r1, r2 = np.random.rand(), np.random.rand()cognitive_component = c1 * r1 * (self.best_position - self.position)social_component = c2 * r2 * (global_best_position - self.position)self.velocity = w * self.velocity + cognitive_component + social_componentdef update_position(self, bounds):self.position += self.velocity# 保持在边界范围内self.position = np.clip(self.position, [bounds[0][0], bounds[1][0]], [bounds[0][1], bounds[1][1]])# 粒子群优化算法
def pso(func, bounds, num_particles, max_iter, w=0.5, c1=2, c2=2):# 初始化粒子群particles = [Particle(bounds) for _ in range(num_particles)]global_best_position = np.array([0.0, 0.0])global_best_score = float('inf')for iteration in range(max_iter):for particle in particles:# 计算适应度值score = func(particle.position[0], particle.position[1])# 更新个体最佳if score < particle.best_score:particle.best_score = scoreparticle.best_position = particle.position.copy()# 更新全局最佳if score < global_best_score:global_best_score = scoreglobal_best_position = particle.position.copy()# 更新粒子的速度和位置for particle in particles:particle.update_velocity(global_best_position, w, c1, c2)particle.update_position(bounds)# 输出当前迭代的全局最佳值print(f"Iteration {iteration+1}: Best score = {global_best_score}, Best position = {global_best_position}")return global_best_position, global_best_score# 参数设置
bounds = [(-5, 5), (-5, 5)]  # 搜索空间范围
num_particles = 30           # 粒子数量
max_iter = 100               # 最大迭代次数# 执行PSO算法
best_position, best_score = pso(rosenbrock, bounds, num_particles, max_iter)
print(f"Global best position: {best_position}, Global best score: {best_score}")

代码解读

  1. 粒子类Particle 类表示一个粒子,包括位置、速度、个体最佳位置和个体最佳得分等属性。粒子可以通过update_velocity方法更新速度,通过update_position方法更新位置。

  2. 适应度计算:粒子的位置在每次迭代中会被用来计算目标函数的值,并比较以找到更优解。

  3. 个体最佳与全局最佳更新:在每次迭代中,每个粒子都会更新自身的个体最佳位置,而整个种群的全局最佳位置也会相应更新。

  4. 速度和位置更新:根据粒子自身的个体最佳位置和全局最佳位置,使用惯性权重、学习因子和随机数更新粒子的速度,接着更新位置并限制其在边界范围内。

  5. 输出结果:代码输出每次迭代的最佳分数和位置,最终返回整个种群的全局最佳位置和分数。

参数对PSO算法的影响

  1. 惯性权重 ( w ):较大的 w 值鼓励粒子在搜索空间中进行广泛搜索,较小的 w 值有助于集中搜索。

  2. **学习因子 c1 和 c2 **:分别表示粒子

对个体最佳位置和全局最佳位置的追随程度。增大 c1 有利于个体开发,而增大 c2 则有利于全局搜索。

  1. 粒子数量:较多的粒子会提高算法的搜索能力,但也会增加计算成本。

在这里插入图片描述

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

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

相关文章

【深入浅出】深入浅出transformer(附面试题)

本文的目的是为了帮助大家面试transformer&#xff0c;会结合我的面试经历以及看法去讲解transformer&#xff0c;并非完整的技术细致讲解&#xff0c;介意请移步。 结构 提到transformer网络模型&#xff0c;大家脑海中是否有这张图呢&#xff1f; 这是网络结构中经典的编解…

net 获取本地ip地址,net mvc + net core 两种

net mvc public static string GetIP(HttpRequestBase request){// 尝试获取 X-Forwarded-For 头string result request.Headers["X-Forwarded-For"]?.Split(,).FirstOrDefault()?.Trim();if (string.IsNullOrEmpty(result)){// 获取用户的 IP 地址result reques…

Handler、Looper、message进阶知识

Android Handler、Looper、Message的进阶知识 在Android开发中&#xff0c;Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用&#xff0c;尤其是在高并发和UI性能优化中&#xff0c;可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…

开源一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码。 前言 在当前的物流仓储行业&#xff0c;企业面临着信息化升级的迫切需求&#xff0c;但往往受限于高昂的软件采购和维护成本。现有的…

Sigrity Power SI Resonance analysis模式如何进行谐振分析操作指导

Sigrity Power SI Resonance analysis模式如何进行谐振分析操作指导 Sigrity Power SI可以方便快捷的进行谐振分析,谐振分析的目的是为了分析电源地平面组成的腔体的谐振频率以及谐振幅度,让频率在谐振频率附近的信号避开谐振腔,以及添加相应的电容来降低谐振峰值. 仍然以这…

vue特性

Vue.js是一套构建用户界面的渐进式框架&#xff0c;其特性主要包括以下几点&#xff1a; MVVM模式 Vue.js采用了MVVM&#xff08;Model-View-ViewModel&#xff09;的设计模式。在这种模式下&#xff0c;Model代表数据模型&#xff0c;View代表用户界面&#xff0c;ViewModel…

【AI开源项目】FastGPT- 快速部署FastGPT以及使用知识库的两种方式!

文章目录 一、FastGPT大模型介绍1. 开发团队2. 发展史3. 基本概念 二、FastGPT与其他大模型的对比三、使用 Docker Compose 快速部署 FastGPT1、安装 Docker 和 Docker Compose&#xff08;1&#xff09;. 安装 Docker&#xff08;2&#xff09;. 安装 Docker Compose&#xff…

Kubernetes实战——DevOps集成SpringBoot项目

目录 一、安装Gitlab 1、安装并配置Gitlab 1.1 、下载安装包 1.2、安装 1.3、修改配置文件 1.4、更新配置并重启 2、配置 2.1、修改密码 2.2、禁用注册功能 2.3、取消头像 2.4、修改中文配置 2.5、配置 webhook 3、卸载 二、安装镜像私服Harbor 1、下载安装包 2、…

多项目管理复杂性对企业的影响

在现代企业中&#xff0c;多项目管理已成为提升竞争力的关键策略。然而&#xff0c;资源分配冲突、沟通协调难题、优先级排序复杂等因素使得多项目管理充满挑战。资源分配冲突尤其突出&#xff0c;因为在多个项目同时进行时&#xff0c;有限的资源需要在不同项目间进行合理分配…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

Mac OS 搭建MySQL开发环境

Mac OS 搭建MySQL开发环境 文章目录 Mac OS 搭建MySQL开发环境一、安装Mysql&#xff1a;二、配置环境变量三、安装Navicat 本地环境&#xff1a; Mac OS Sequoia15.0.1&#xff08;M3 Max) 目标状态&#xff1a; 下载安装Mysql&#xff0c;配置相关环境。 一、安装Mysql&…

关于springboot跨域与拦截器的问题

今天写代码的时候遇到的一个问题&#xff0c;在添加自己设置的token拦截器之后&#xff0c;报错&#xff1a; “ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:112:14) at Axi…

Java 面向对象编程(OOP)(4/30)

目录 Java 面向对象编程&#xff08;OOP&#xff09; 1. 类与对象 1.1 类的定义 1.2 对象的创建与使用 2. 封装 2.1 访问修饰符 2.2 使用 Getter 和 Setter 方法 3. 继承 3.1 继承的基本用法 3.2 方法重写 4. 多态 4.1 编译时多态&#xff08;方法重载&#xff09;…

NVR设备ONVIF接入平台EasyCVR视频分析设备平台视频质量诊断技术与能力

视频诊断技术是一种智能化的视频故障分析与预警系统&#xff0c;NVR设备ONVIF接入平台EasyCVR通过对前端设备传回的码流进行解码以及图像质量评估&#xff0c;对视频图像中存在的质量问题进行智能分析、判断和预警。这项技术在安防监控领域尤为重要&#xff0c;因为它能够确保监…

Python Pycharm下载

pycharm-professional-2023.3.3 python-3.9.0-amd64.exe 链接&#xff1a;https://pan.baidu.com/s/1YYf835hlleeDksPMmX9y2g?pwd9x16 提取码&#xff1a;9x16 更多资料获取学习书籍下面搜一搜这里不迷路&#xff0c;回复关键字获取&#xff1a;python

比较24个结构的迭代次数

(A,B)---6*30*2---(0,1)(1,0) 让A是结构1&#xff0c;让B全是0。收敛误差为7e-4&#xff0c;收敛199次取迭代次数平均值&#xff0c;得到28080.98 做一个同样的网络(A,B)---6*30*2---(0,1)(1,0)&#xff0c;让A是结构1-24&#xff0c;B全是0&#xff0c;用结构1的收敛权重做初…

深度了解flink(七) JobManager(1) 组件启动流程分析

前言 JobManager是Flink的核心进程&#xff0c;主要负责Flink集群的启动和初始化&#xff0c;包含多个重要的组件(JboMaster&#xff0c;Dispatcher&#xff0c;WebEndpoint等)&#xff0c;本篇文章会基于源码分析JobManagr的启动流程&#xff0c;对其各个组件进行介绍&#x…

.NET内网实战:通过白名单文件反序列化漏洞绕过UAC

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏&#xff0c;主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧&#xff0c;对内网和后渗透感兴趣的朋友们可以订阅该电子报刊&#xff0c;解锁更多的报刊内容。 02基本介绍 03原理分析 在渗透测试和红…

ELK之路第三步——日志收集筛选logstash和filebeat

logstash和filebeat&#xff08;偷懒版&#xff09; 前言logstash1.下载2.修改配置文件3.测试启动4.文件启动 filebeat1.下载2.配置3.启动 前言 上一篇&#xff0c;我们说到了可视化界面Kibana的安装&#xff0c;这一篇&#xff0c;会简单介绍logstash和filebeat的安装和配置。…

植物源UDP-糖基转移酶及其分子改造-文献精读75

植物源UDP-糖基转移酶及其分子改造 摘要 糖基化能够增加化合物的结构多样性,有效改善水溶性、药理活性和生物利用度,对植物天然产物的药物开发至关重要。UDP-糖基转移酶(UGTs)能够催化糖基从活化的核苷酸糖供体转移到受体形成糖苷键,植物中天然产物的糖基化修饰主要通过UGTs实…