优化算法: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 。 定义函…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

联邦学习带宽资源分配
带宽资源分配是指在网络中如何合理分配有限的带宽资源,以满足各个通信任务和用户的需求,尤其是在多用户共享带宽的情况下,如何确保各个设备或用户的通信需求得到高效且公平的满足。带宽是网络中的一个重要资源,通常指的是单位时间…...

多模态大语言模型arxiv论文略读(112)
Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文标题:Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文作者:Jea…...

豆瓣图书评论数据分析与可视化
【题目描述】豆瓣图书评论数据爬取。以《平凡的世界》、《都挺好》等为分析对象,编写程序爬取豆瓣读书上针对该图书的短评信息,要求: (1)对前3页短评信息进行跨页连续爬取; (2)爬取…...

跟进一下目前最新的大数据技术
搭建最新平台 40C64G服务器,搭建3节点kvm,8C12G。 apache-hive-4.0.1-bin apache-tez-0.10.4-bin flink-1.20.1 hadoop-3.4.1 hbase-2.6.2 jdk-11.0.276 jdk8u452-b09 jdk8终于可以不用了 spark-3.5.5-bin-hadoop3 zookeeper-3.9.3 trino…...