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

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

在这里插入图片描述

粒子群优化算法(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…

项目里MongodbTemplate用法

1. 先引入依赖(这里以gradle项目为例) implementation org.springframework.boot:spring-boot-starter-data-mongodb2. 在对应应类上获取MongoTemplate private final MongoTemplate mongoTemplate;3. 下面就是一些常用功能实现 注: 下面的XXX是你的表名 3.1 数据保存 实现1…

Handler、Looper、message进阶知识

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

pcl::IntegralImageNormalEstimation Assertion Assertion `v == T(Value)‘ failed.

pcl::IntegralImageNormalEstimation&#xff1a; Assertion Assertion v T(Value)’ failed. 最新项目用到IntegralImageNormalEstimation类计算法向量。配置运行成功后。 我用 PCL version 1.12.1 on Ubuntu 22. The eigen3 version is 3.4.0 运行IntegralImageNormalEst…

后端:Spring、Spring Boot-配置、定义bean

文章目录 1. 什么是Bean&#xff0c;如何配置2. 如何配置bean2.1 使用注解Bean2.2 使用注解Import 1. 什么是Bean&#xff0c;如何配置 被spring容器所管理的对象被称为bean&#xff0c;管理方式可以有纯xml文件方式、注解方式进行管理(比如注解Component)。 在Spring Boot中&…

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

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

vue添加省市区

主要参考“element”框架&#xff1a;Element - The worlds most popular Vue UI framework <div class"block"><span class"demonstration">默认 click 触发子菜单</span><el-cascaderv-model"value":options"optio…

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

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

java-web-day7-会话跟踪技术

会话跟踪技术 1.cookie 优点:HTTP协议中支持的技术 缺点: 移动端App无法使用cookie 安全性不强, 而且用户可以自己禁用cookie cookie不能跨域 什么是跨域?协议,IP/域名, 端口三者中有一个不一样就是跨域 2.session--基于cookie实现 优点:用户数据存储在服务端, 只给浏览器一个…

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、…

从0学习React(7)

在上篇文章中&#xff0c;我们重点讲了关于函数组件的状态管理。这篇文章&#xff0c;我用一种新的方式来讲一讲React&#xff0c;我会通过一个函数来去讲React。当然&#xff0c;这肯定不能一个函数讲完&#xff0c;但是我可以讲很多个函数&#xff0c;一篇文章讲一个&#xf…

安卓屏幕息屏唤醒

背景&#xff0c;今天遇项目需要&#xff0c;需要在下载在后台任务运行时&#xff08;如下载、上传或进行长时间计算&#xff09;&#xff0c;保持 CPU 活动&#xff0c;然后就写了这个实现方法&#xff0c;废话不多说上代码 第一步&#xff0c;再清单AndroidManifest文件声明权…

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

在现代企业中&#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;…