【群体智能优化算法系列 】一 粒子群算法 (Particle Swarm Optimization, PSO)

【群体智能优化算法系列 】一 粒子算法

  • 一:前言
  • 二:算法原理
    • 2.1 核心思想
    • 2.2 PSO核心公式​
    • 2.3 PSO算法流程图
  • 三:python实现 二维Rastrigin函数 最低点检索例子
  • 参考

一:前言

粒子群算法是由Kennedy和Eberhart在1995年提出的一种基于群体智能的优化算法。该算法模拟鸟群觅食行为,通过粒子间的信息共享和协作来寻找最优解。

二:算法原理

2.1 核心思想

粒子群算法的核心思想可以通过鸟群找食物的故事​理解,

假设一群小鸟在森林里找食物(最优解):
​(1)每只鸟不知道食物在哪,但能感知自己当前位置离食物有多远(通过目标函数计算适应度)。

(2)​小鸟们会交流​:每只鸟记住自己飞过的最好位置(个体经验),同时整个鸟群知道所有鸟中最好的位置(群体经验)。

​(3)飞行策略​:每只鸟决定下一步飞哪里时,会综合三个方向:

  • 惯性方向​:保持原来的飞行方向(不想急转弯)。
  • 个体经验方向​:飞向自己曾经找到过食物的地方。
  • 群体经验方向​:飞向鸟群中其他鸟找到食物最多的地方。

​(4)动态调整​:小鸟们一边飞一边更新信息,最终整个鸟群会逐渐聚集到食物最丰富的位置

2.2 PSO核心公式​

PSO核心公式
在这里插入图片描述在这里插入图片描述

2.3 PSO算法流程图

在这里插入图片描述

三:python实现 二维Rastrigin函数 最低点检索例子

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from mpl_toolkits.mplot3d import Axes3D
import time# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef fitness_function(position):"""目标函数:二维Rastrigin函数"""x, y = positionreturn 20 + (x**2 - 10 * np.cos(2 * np.pi * x)) + (y**2 - 10 * np.cos(2 * np.pi * y))def pso_optimization(func, bounds, n_particles=30, max_iter=50, w=0.7, c1=1.5, c2=1.5):"""粒子群优化算法实现"""dim = len(bounds)# 初始化粒子群particles = {'position': np.array([np.random.uniform(low, high, n_particles) for (low, high) in bounds]).T,'velocity': np.zeros((n_particles, dim)),'best_position': np.zeros((n_particles, dim)),'best_fitness': np.full(n_particles, np.inf),'history': []  # 存储迭代历史}# 初始全局最优global_best_pos = np.zeros(dim)global_best_fit = np.inf# 计算初始适应度for i in range(n_particles):fitness = func(particles['position'][i])particles['best_position'][i] = particles['position'][i].copy()particles['best_fitness'][i] = fitnessif fitness < global_best_fit:global_best_fit = fitnessglobal_best_pos = particles['position'][i].copy()particles['history'].append({'positions': particles['position'].copy(),'global_best': global_best_pos.copy()})# 主循环for t in range(max_iter):for i in range(n_particles):# 更新速度和位置r1, r2 = np.random.rand(), np.random.rand()particles['velocity'][i] = (w * particles['velocity'][i] +c1 * r1 * (particles['best_position'][i] - particles['position'][i]) +c2 * r2 * (global_best_pos - particles['position'][i]))# 更新位置particles['position'][i] += particles['velocity'][i]# 边界处理for d in range(dim):low, high = bounds[d]particles['position'][i][d] = np.clip(particles['position'][i][d], low, high)# 计算新适应度new_fitness = func(particles['position'][i])# 更新个体最优if new_fitness < particles['best_fitness'][i]:particles['best_position'][i] = particles['position'][i].copy()particles['best_fitness'][i] = new_fitness# 更新全局最优if new_fitness < global_best_fit:global_best_fit = new_fitnessglobal_best_pos = particles['position'][i].copy()# 记录本次迭代状态particles['history'].append({'positions': particles['position'].copy(),'global_best': global_best_pos.copy()})return global_best_pos, global_best_fit, particles['history']def visualize_optimization(history, bounds, func):"""可视化优化过程"""fig = plt.figure()  # 增加图形宽度以容纳colorbar# 控制变量animation_state = {'paused': False,'stopped': False,'current_frame': 0}# 创建函数网格x = np.linspace(bounds[0][0], bounds[0][1], 100)y = np.linspace(bounds[1][0], bounds[1][1], 100)X, Y = np.meshgrid(x, y)Z = np.zeros_like(X)for i in range(X.shape[0]):for j in range(X.shape[1]):Z[i, j] = func([X[i, j], Y[i, j]])# 创建子图ax1 = fig.add_subplot(121, projection='3d')ax2 = fig.add_subplot(122)# 初始化绘图元素surf = ax1.plot_surface(X, Y, Z, cmap='viridis', alpha=0.3)particles_3d = ax1.scatter([], [], [], c='red', s=30)best_3d = ax1.scatter([], [], [], c='gold', s=100, marker='*')contour = ax2.contourf(X, Y, Z, 20, cmap='viridis', alpha=0.6)# 添加等高线标签contour_lines = ax2.contour(X, Y, Z, 10, colors='black', alpha=0.4, linewidths=0.5)ax2.clabel(contour_lines, inline=True, fontsize=8, fmt='%.1f')# 添加颜色条cbar = plt.colorbar(contour, ax=ax2, shrink=0.8)cbar.set_label('适应度值', rotation=270, labelpad=15)particles_2d = ax2.scatter([], [], c='red', s=30, alpha=0.7)best_2d = ax2.scatter([], [], c='gold', s=100, marker='*')# 设置标签和标题ax1.set_xlabel('X')ax1.set_ylabel('Y')ax1.set_zlabel('f(X,Y)')ax1.view_init(elev=30, azim=45)ax2.set_xlabel('X')ax2.set_ylabel('Y')ax2.set_xlim(bounds[0])ax2.set_ylim(bounds[1])# 创建动画函数def on_key_press(event):"""键盘事件处理"""if event.key == ' ':  # 空格键暂停/继续animation_state['paused'] = not animation_state['paused']status = "暂停" if animation_state['paused'] else "继续"print(f"动画{status}")def show_final_results():"""显示最终结果并暂停"""final_frame = len(history) - 1final_positions = history[final_frame]['positions']final_best = history[final_frame]['global_best']# 更新到最终状态particles_3d._offsets3d = (final_positions[:, 0], final_positions[:, 1], [func(p) for p in final_positions])best_3d._offsets3d = ([final_best[0]], [final_best[1]], [func(final_best)])particles_2d.set_offsets(final_positions)best_2d.set_offsets([final_best])# 更新标题显示最终结果final_fitness = func(final_best)ax1.set_title(f'优化完成! 总迭代: {final_frame}\n最优值: {final_fitness:.6f}\n最优位置: [{final_best[0]:.3f}, {final_best[1]:.3f}]')ax2.set_title(f'最终结果 - 误差: {abs(final_fitness):.6f}')plt.draw()print(f"\n=== 优化结果 ===")print(f"最优位置: [{final_best[0]:.6f}, {final_best[1]:.6f}]")print(f"最优适应度值: {final_fitness:.6f}")print(f"理论最优值: 0.0000 (在位置 [0, 0])")print(f"误差: {abs(final_fitness):.6f}")print("\n按任意键关闭窗口...")# 等待用户输入input()def update(frame):# 检查是否被停止if animation_state['stopped']:return particles_3d, best_3d, particles_2d, best_2d# 检查是否暂停if animation_state['paused']:return particles_3d, best_3d, particles_2d, best_2danimation_state['current_frame'] = frame# 当前迭代数据positions = history[frame]['positions']global_best = history[frame]['global_best']# 更新3D散点图particles_3d._offsets3d = (positions[:, 0], positions[:, 1], [func(p) for p in positions])best_3d._offsets3d = ([global_best[0]], [global_best[1]], [func(global_best)])# 更新2D散点图particles_2d.set_offsets(positions)best_2d.set_offsets([global_best])# 更新标题current_fitness = func(global_best)ax1.set_title(f'迭代 {frame}/{len(history)-1}\n当前最优值: {current_fitness:.4f}\n[空格]暂停')ax2.set_title(f'等高线图 - 迭代 {frame}')# 如果是最后一帧,自动显示最终结果if frame == len(history) - 1:ani.event_source.stop()# 延迟显示最终结果plt.pause(0.5)  # 短暂暂停show_final_results()return particles_3d, best_3d, particles_2d, best_2d# 连接键盘事件fig.canvas.mpl_connect('key_press_event', on_key_press)# 创建动画ani = FuncAnimation(fig, update, frames=len(history), interval=200, blit=False, repeat=False)  # 改为不重复plt.tight_layout(pad=2.0)  # 增加边距以确保文字完整显示# 显示操作提示print("\n=== 操作说明 ===")print("[空格键] - 暂停/继续动画")print("[关闭窗口] - 退出程序")print("==================\n")return ani, figdef main():# 设置函数搜索边界bounds = [(-5.12, 5.12), (-5.12, 5.12)]print("正在运行粒子群优化算法...")# 运行PSO优化best_pos, best_fit, history = pso_optimization(fitness_function, bounds)print(f"\n算法执行完成!")print(f"最优解位置: [{best_pos[0]:.6f}, {best_pos[1]:.6f}]")print(f"最优值: {best_fit:.6f}")# 可视化优化过程ani, fig = visualize_optimization(history, bounds, fitness_function)# 显示实时动画print("正在启动粒子群算法可视化...")try:plt.show()except KeyboardInterrupt:print("\n程序被用户中断")print("程序结束")if __name__ == "__main__":main()

参考

【1】 粒子群优化算法(Particle Swarm Optimization, PSO)的详细解读
【2】一篇文章搞懂PSO(粒子群算法)理论讲解+Python代码示例讲解

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

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

相关文章

Jupyter notebook调试:设置断点运行

写了一段小代码&#xff0c;主要是用来测试一段序列的k均值聚类效果&#xff1b; 中间想到debug一下&#xff0c;但是想到自己似乎从来没有正式地接触过jupyter notebook中地debug&#xff0c;平时也只是多开几个cell&#xff0c;然后在其他cell中复制粘贴部分代码&#xff0c…

[12-2] BKP备份寄存器RTC实时时钟 江协科技学习笔记(14个知识点)

1 2 3 4 5 6 7 8 RTC是“Real-Time Clock”的缩写&#xff0c;中文意思是“实时时钟”。这是一种在电子设备中使用的时钟&#xff0c;它能够提供准确的时间信息&#xff0c;即使在设备断电的情况下也能继续运行&#xff0c;因为它通常由一个小型电池供电。RTC广泛应用于计算机…

优化给AI的“提问技巧”(提示工程),让大型语言模型(比如GPT)更好地扮演“心理治疗助手”的角色

优化给AI的“提问技巧”(提示工程),让大型语言模型(比如GPT)更好地扮演“心理治疗助手”的角色 尤其是在“问题解决疗法”(PST)中帮助 caregivers(家庭护理者)缓解焦虑、疲劳等心理症状。以下是核心内容的通俗解读: 一、研究背景:AI当心理医生靠谱吗? 现状:全球…

Java的lambda表达式应用

Lambda表达式是Java 8引入的一项强大特性&#xff0c;它允许以更加简洁的方式表示匿名函数。Lambda表达式不仅让代码更加简洁、清晰&#xff0c;而且为函数式编程提供了有力支持&#xff0c;从而提升了Java语言的表达能力。 本文主要讲解lambda应用stream处理集合的应用。 1、…

云原生/容器相关概念记录

文章目录 网络与虚拟化技术云平台与架构容器与编排容器网络方案性能优化与工具硬件与协议 网络与虚拟化技术 P4可编程网关 P4: Programming Protocol-independent Packet Processors一种基于P4语言的可编程网络设备&#xff0c;支持自定义数据包处理逻辑。P4可编程技术详解&am…

[C++] traits机制

文章目录 C之type_traitsis_floating_point<T> ..的使用std::enable_if<T>::type的使用std::remove_cv 如何自定义traits C之type_traits is_floating_point …的使用 一般在定义打印模板函数的时候&#xff0c;当我们用printf进行终端日志打印&#xff0c;需要根…

OpenCV 视频处理与保存

一、知识点 1、VideoCapture类 (1)、用于从视频文件、摄像机或图像序列中捕获视频帧。 (2)、构造函数 VideoCapture(const String & filename, int apiPreference CAP_ANY) a、filename可以是视频文件的名称(例如"video.avi")&#xff0c;可以是图…

【Leetcode】字符串之二进制求和、字符串相乘

文章目录 算法原理二进制求和题目链接题目描述解题思路代码 字符串相乘题目链接题目描述解题思路代码 算法原理 这两道题都是属于算法里一种经典题型&#xff1a;高精度加/减/乘/除法&#xff0c;需要我们模拟加/减/乘/除 列竖式运算。 二进制求和 题目链接 题目链接 题目描…

MongoDB:索引

目录 1、索引数据结构&#xff1a;B-树 2、索引类型 2.1 单字段索引 2.2 复合索引&#xff08;最重要&#xff01;&#xff09; 2.3 多键索引&#xff08;数组字段&#xff09; 2.4 地理空间索引 2.5 全文索引 2.6 哈希索引&#xff08;分片专用&#xff09; 2.7 TTL …

【大模型】Transformer架构完全解读:从“盲人摸象“到“通晓万物“的AI进化论

&#x1f916; Transformer架构完全解读&#xff1a;从"盲人摸象"到"通晓万物"的AI进化论 —— 一位大模型探索者的技术日记 ☕ 第一章&#xff1a;为什么说Transformer是AI界的"蒸汽机革命"&#xff1f; 1.1 从RNN到Transformer&#xff1a;…

JavaEE:使用JMeter进行接口并发测试

一、下载与安装&#xff1a; 1.下载apache-jmeter-5.6.3.zip&#xff1a; https://jmeter.apache.org/download_jmeter.cgi 2.解压到D:\Program Files\apache-jmeter-5.6.3目录 3.添加JDK环境配置到D:\Program Files\apache-jmeter-5.6.3\bin\jmeter.bat文件开头&#xff1…

【笔记】MSYS2 的 MinGW64 环境中正确安装 Python 相关环境管理工具 (Poetry、Virtualenv、Pipenv 和 UV)

MSYS2 环境配置与 Python 项目依赖管理笔记_msys更新python-CSDN博客 【技术笔记】MSYS2 指定 Python 版本安装方案_pacman -u 安装指定版本-CSDN博客 更多关于 MSYS2 开发环境的配置&#xff0c;请查看往期笔记。 简介 本笔记将记录我们在 MSYS2 的 MinGW64 环境中安装 Pytho…

ubuntu添加域名解析服务器地址

在 Ubuntu 中配置域名解析主要有两种方式&#xff1a;静态修改 /etc/hosts 文件 和 动态修改 DNS 解析服务器配置。以下是详细操作指南&#xff1a; 建议优选:二、永久方案&#xff1a;修改 DNS 解析服务&#xff08;推荐&#xff09;中的方法1 一、临时方案&#xff1a;修改…

通过 AIOps 、生成式 AI 和机器学习实现更智能的可观测性

支持 AIOps 的理由 人工智能运维&#xff08;AIOps&#xff09;是将人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和分析技术应用于提升 IT 运维团队日常工作的过程。简单来说&#xff0c;AIOps 是软件系统通过 AI 和 ML 以及相关分析技术来简化和…

【DataWhale组队学习】AI办公实践与应用

AI办公-PPT制作 1. 使用大模型制作PPT的常见流程 使用大模型生成PPT的文稿将文稿的内容喂给可以直接生成PPT的大模型&#xff0c;生成PPT 2. 使用大模型生成PPT文稿 我们可以先使用上一章提过的那些大模型去生成一个PPT的文稿。那根据上一章的内容&#xff0c;我们想要去让…

人机融合智能 | 人智交互中的机器行为设计与管理

以人工智能为代表的科学技术正在深入地塑造和改变着人类的社会、文化和经济等,在“无所不在的算法与智能”的时代,了解智能机器的行为对于设计智能行为并使其造福于人类,对于智能机器的设计者、开发者和使用者,都具有重要意义。机器行为研究从学科交叉的视角,将智能机器行为置于…

langChainv0.3学习笔记(高级篇)

目录 工具创建工具从函数创建工具tool 装饰器结构化工具 从可运行对象创建工具子类化 BaseTool如何创建异步工具处理工具错误返回工具执行的artifact 使用内置工具和工具包自定义默认工具如何使用内置工具包 使用聊天模型调用工具定义工具模式Python 函数LangChain 工具Pydanti…

UiAutomator2 与 Appium 对比分析:安卓自动化测试框架的选择指南

目录 一、基础介绍UiAutomator2Appium 二、功能对比三、架构差异UiAutomator2 架构简图&#xff1a;Appium 架构简图&#xff1a; 四、使用场景分析五、优缺点总结UiAutomator2 优点&#xff1a;UiAutomator2 缺点&#xff1a;Appium 优点&#xff1a;Appium 缺点&#xff1a; …

缺失的第一个正整数

继续每日一题 今天给大家带来一道将数组视为哈希表的算法 题目描述&#xff1a; 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 题目示例&#xff1a; 由于题目要求…

单例模式-Python示例

单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是设计模式中一种创建型模式&#xff0c;广泛应用于软件开发中。一以下以故事化的方式&#xff0c;结合详细的技术讲解&#xff0c;介绍单例模式的背景、定义、适用场景&#xff0c;并提供python的示例代码。 故事…