优化算法:2.粒子群算法(PSO)及Python实现
一、定义
粒子群算法(Particle Swarm Optimization,PSO)是一种模拟鸟群觅食行为的优化算法。想象一群鸟在寻找食物,每只鸟都在尝试找到食物最多的位置。它们通过互相交流信息,逐渐向食物最多的地方聚集。PSO就是基于这种群体智能的原理。

二、过程
1. 初始化粒子群
首先,我们随机生成一群粒子,每个粒子代表一个潜在的解。这些粒子就像一群鸟,它们在问题的解空间中随机分布。每个粒子有自己的位置和速度,位置表示解的参数,速度表示解的变化趋势。
设粒子群大小为 n,粒子的位置和速度用向量表示。假设搜索空间是 d 维的。
-
位置初始化:每个粒子的初始位置
可以随机生成在搜索空间的范围内:
其中,
和
分别是第 j 维的最小值和最大值,rand() 是一个生成 [0, 1] 之间随机数的函数。
-
速度初始化:每个粒子的初始速度
也可以随机生成:
其中,
和
分别是第 j 维的最小速度和最大速度。
2. 计算适应度
每个粒子都有一个“适应度”,这就像是鸟找到的食物量。适应度越高,表示解越好。我们用一个函数来计算每个粒子的适应度,这个函数通常是我们要优化的问题的目标函数。
计算每个粒子当前的位置 对应的适应度值
,以衡量其解的好坏。这个适应度函数 f 就是我们要优化的目标函数,具体形式取决于实际问题。
3. 更新个体和全局最佳位置
每个粒子都记得自己找到的最好的位置(个体最佳位置 ),这叫做“个体最佳位置”。同时,所有粒子中找到的最好的位置叫做“全局最佳位置”(全局最佳位置 g)。在每次迭代中,我们检查每个粒子的当前位置是否比它之前找到的最好位置更好,如果是,就更新个体最佳位置。同时,我们也更新全局最佳位置。
在优化问题中,我们通常有一个目标函数 f(x),其目的是要最小化或最大化这个函数。适应度函数 f(x) 是一个评估每个解好坏的函数。在最小化问题中,适应度函数值越小,表示这个解越好;而在最大化问题中,适应度函数值越大,表示这个解越好。
-
个体最佳位置更新:对于每个粒子,如果当前适应度值更好,则更新个体最佳位置:
如果
,则
。其中,
是第 i 个粒子的个体最佳位置。
-
全局最佳位置更新:检查所有粒子的个体最佳位置,找到适应度值最小(此处假设为最大化问题)的那个位置作为全局最佳位置:
。其中,g 是全局最佳位置。
4. 更新速度和位置
更新速度:
每个粒子的速度更新公式如下:
其中:
是第 i 个粒子在第 j 维上的当前速度。
- w 是惯性权重,控制粒子保持原有速度的程度。
是认知系数,控制粒子向自身历史最佳位置移动的程度。
是社会系数,控制粒子向全局最佳位置移动的程度。
是一个生成 [0, 1]之间随机数的函数。
是第 i 个粒子在第 j 维上的个体最佳位置。
是全局最佳位置在第 j 维上的值。
是第 i 个粒子在第 j 维上的当前位置。
更新位置:
每个粒子的位置更新公式如下:
其中:
是第 i 个粒子在第 j 维上的当前位置。
是第 i 个粒子在第 j 维上的更新后的速度。
5. 重复迭代
我们重复上述步骤,直到满足某个停止条件,比如达到最大迭代次数,或者粒子的适应度变化很小。
三、Python示例
- 目标函数:定义了一个简单的目标函数
。
- 参数设置:设置了PSO算法的参数,包括粒子数量、迭代次数、惯性权重和认知/社会系数。
- 初始化:初始化了粒子的位置和速度,同时记录每个粒子的个体最佳位置和全局最佳位置。
- 迭代优化:在每次迭代中,更新粒子的速度和位置,更新个体最佳位置和全局最佳位置,记录全局最佳位置的历史。
- 理论结果:定义的目标函数
中,全局最优解显然是 (x, y) = (0, 0),因为这是函数的最小值点,其值为0。全局最佳位置的移动轨迹应该表现为逐步接近原点 (0, 0)的过程。
完整代码如下:
import numpy as np
import matplotlib.pyplot as plt# 定义目标函数(f(x) = x^2 + y^2)
def objective_function(position):return position[0] ** 2 + position[1] ** 2# 参数
num_particles = 30 # 粒子数量,即搜索空间中的粒子数
num_iterations = 100 # 迭代次数,即算法运行的总次数
w = 0.7 # 惯性权重,控制粒子速度的惯性
c1 = 1.5 # 认知系数
c2 = 1.5 # 社会系数# 初始化粒子位置和速度
particles_position = np.random.uniform(-10, 10, (num_particles, 2)) # 随机初始化粒子的位置,范围在 [-10, 10] 之间
particles_velocity = np.random.uniform(-1, 1, (num_particles, 2)) # 随机初始化粒子的速度,范围在 [-1, 1] 之间
personal_best_position = particles_position.copy()
personal_best_value = np.array([objective_function(p) for p in particles_position])
global_best_position = personal_best_position[np.argmin(personal_best_value)]
global_best_value = np.min(personal_best_value)# 记录优化过程中的全局最佳位置
global_best_positions_history = []for iteration in range(num_iterations):for i in range(num_particles):# 更新速度r1, r2 = np.random.rand(2)particles_velocity[i] = (w * particles_velocity[i] +c1 * r1 * (personal_best_position[i] - particles_position[i]) +c2 * r2 * (global_best_position - particles_position[i]))# 更新位置particles_position[i] += particles_velocity[i]# 更新个体最佳位置current_value = objective_function(particles_position[i])if current_value < personal_best_value[i]:personal_best_value[i] = current_valuepersonal_best_position[i] = particles_position[i]# 更新全局最佳位置current_best_value = np.min(personal_best_value)if current_best_value < global_best_value:global_best_value = current_best_valueglobal_best_position = personal_best_position[np.argmin(personal_best_value)]# 记录全局最佳位置global_best_positions_history.append(global_best_position.copy())# 绘制结果
global_best_positions_history = np.array(global_best_positions_history)
plt.figure(figsize=(10, 6))
plt.plot(global_best_positions_history[:, 0], global_best_positions_history[:, 1], 'bo-', label='Global Best Position',zorder=1)
plt.scatter(global_best_positions_history[-1, 0], global_best_positions_history[-1, 1], color='red', s=50,label='Final Global Best', zorder=2)
plt.text(global_best_positions_history[-1, 0], global_best_positions_history[-1, 1],f'({global_best_positions_history[-1, 0]:.2f}, {global_best_positions_history[-1, 1]:.2f})',color='red', fontsize=12, zorder=3)
plt.title('PSO Optimization Process')
plt.xlabel('X Position')
plt.ylabel('Y Position')
plt.legend()
plt.grid()
plt.show()
结果如下:

相关文章:
优化算法:2.粒子群算法(PSO)及Python实现
一、定义 粒子群算法(Particle Swarm Optimization,PSO)是一种模拟鸟群觅食行为的优化算法。想象一群鸟在寻找食物,每只鸟都在尝试找到食物最多的位置。它们通过互相交流信息,逐渐向食物最多的地方聚集。PSO就是基于这…...
ThreadLocal面试三道题
针对ThreadLocal的面试题,我将按照由简单到困难的顺序给出三道题目,并附上参考答案的概要。 1. 简单题:请简述ThreadLocal是什么,以及它的主要作用。 参考答案: ThreadLocal是Java中的一个类,用于提供线…...
Git操作指令(已完结)
Git操作指令 一、安装git 1、设置配置信息: # global全局配置 git config --global user.name "Your username" git config --global user.email "Your email"# 显示颜色 git config --global color.ui true# 配置别名,各种指令都…...
大数据采集工具——Flume简介安装配置使用教程
Flume简介&安装配置&使用教程 1、Flume简介 一:概要 Flume 是一个可配置、可靠、高可用的大数据采集工具,主要用于将大量的数据从各种数据源(如日志文件、数据库、本地磁盘等)采集到数据存储系统(主要为Had…...
C语言 #具有展开功能的排雷游戏
文章目录 前言 一、整个排雷游戏的思维梳理 二、整体代码分布布局 三、游戏主体逻辑实现--test.c 四、整个游戏头文件的引用以及函数的声明-- game.h 五、游戏功能的具体实现 -- game.c 六、老六版本 总结 前言 路漫漫其修远兮,吾将上下而求索。 一、整个排…...
npm publish出错,‘proxy‘ config is set properly. See: ‘npm help config‘
问题:使用 npm publish发布项目依赖失败,报错 proxy config is set properly. See: npm help config 1、先查找一下自己的代理 npm config get proxy npm config get https-proxy npm config get registry2、然后将代理和缓存置空 方式一: …...
Springboot 多数据源事务
起因 在一个service方法上使用的事务,其中有方法是调用的多数据源orderDB 但是多数据源没有生效,而是使用的primaryDB 原因 spring 事务实现的方式 以 Transactional 注解为例 (也可以看 TransactionTemplate, 这个流程更简单一点)。 入口:ProxyTransa…...
Python每日学习
我是从c转来学习Python的,总感觉和c相比Python的实操简单,但是由于写c的代码多了,感觉Python的语法好奇怪 就比如说c的开头要有库(就是类似于#include <bits/stdc.h>)而且它每一项的代码结束之后要有一个表示结…...
数据库 执行sql添加删除字段
添加字段: ALTER TABLE 表明 ADD COLUMN 字段名 类型 DEFAULT NULL COMMENT 注释 AFTER 哪个字段后面; 效果: 删除字段: ALTER TABLE 表明 DROP COLUMN 字段;...
前端开发:HTML与CSS
文章目录 前言1.1、CS架构和BS架构1.2、网页构成 HTML1.web开发1.1、最简单的web应用程序1.2、HTTP协议1.2.1 、简介1.2.2、 http协议特性1.3.3、http请求协议与响应协议 2.HTML概述3.HTML标准结构4.标签的语法5.基本标签6.超链接标签6.1、超链接基本使用6.2、锚点 7.img标签8.…...
ctfshow解题方法
171 172 爆库名->爆表名->爆字段名->爆字段值 -1 union select 1,database() ,3 -- //返回数据库名 -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema库名 -- //获取数据库里的表名 -1 union select 1,group_concat(…...
探索 Blockly:自定义积木实例
3.实例 3.1.基础块 无输入 , 无输出 3.1.1.json var textOneJson {"type": "sql_test_text_one","message0": " one ","colour": 30,"tooltip": 无输入 , 无输出 };javascriptGenerator.forBlock[sql_test_te…...
MongoDB教程(二十三):关于MongoDB自增机制
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、MongoD…...
展馆导览系统架构解析,从需求分析到上线运维
在物质生活日益丰富的当下,人们对精神世界的追求愈发强烈,博物馆、展馆、纪念馆等场所成为人们丰富知识、滋养心灵的热门选择。与此同时,人们对展馆的导航体验也提出了更高要求,展馆导览系统作为一种基于室内外地图相结合的位置引…...
Servlet详解(超详细)
Servlet详解 文章目录 Servlet详解一、基本概念二、Servlet的使用1、创建Servlet类2、配置Servleta. 使用web.xml配置b. 使用注解配置 3、部署Web应用4、处理HTTP请求和生成响应5、处理表单数据HTML表单Servlet 6、管理会话 三、servlet生命周期1、加载和实例化2、初始化3、 请…...
Meta AI引入Imagine Me功能,上传图片输入提示词即可实现个性化照片
AITOP100平台获悉,Meta 公司在 AI 领域再次迈出了重要的步伐,其发布的 Llama 3.1 开源 AI 模型以及对 Meta AI 功能的更新扩充引发了广泛关注。 其中,新引入的“Imagine Me”功能尤为引人注目。在这一功能下,美国地区的用户只需上…...
常用自启设置
一、开机自启动 1、编辑 vi /lib/systemd/system/nginx.service 文件,没有创建一个 touch nginx.service 然后将如下内容根据具体情况进行修改后,添加到nginx.service文件中: [Unit] Descriptionnginx Afternetwork.target remote-fs.targ…...
模块与组件、模块化与组件化的理解
在React或其他现代JavaScript框架中,模块与组件、模块化与组件化是核心概念,它们对于提高代码的可维护性、复用性和开发效率具有重要意义。以下是对这些概念的理解: 模块与组件 模块(Module) 定义:模块是…...
Rust:cargo的常用命令
1.查看版本 $ cargo --version cargo 1.79.0 (ffa9cf99a 2024-06-03) 2.创建新的项目 $ cargo new hello 创建后的目录结构为 $ tree hello/ hello/ ├── Cargo.toml └── src └── main.rs 3.运行项目 $ cd hello $ cargo run Compiling hello v0.1.0 (/home/c…...
LeetCode 3106.满足距离约束且字典序最小的字符串:模拟(贪心)
【LetMeFly】3106.满足距离约束且字典序最小的字符串:模拟(贪心) 力扣题目链接:https://leetcode.cn/problems/lexicographically-smallest-string-after-operations-with-constraint/ 给你一个字符串 s 和一个整数 k 。 定义函…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
