优化算法:2.粒子群算法(PSO)及Python实现

一、定义

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

二、过程

        1. 初始化粒子群

        首先,我们随机生成一群粒子,每个粒子代表一个潜在的解。这些粒子就像一群鸟,它们在问题的解空间中随机分布。每个粒子有自己的位置和速度,位置表示解的参数,速度表示解的变化趋势。

        设粒子群大小为  n,粒子的位置和速度用向量表示。假设搜索空间是 d 维的。

  • 位置初始化:每个粒子的初始位置 x_i可以随机生成在搜索空间的范围内:

    x_{i,j} = x_{\text{min},j} + \text{rand()} \times (x_{\text{max},j} - x_{\text{min},j})

    其中, x_{\text{min},j}x_{\text{max},j} 分别是第 j 维的最小值和最大值,rand() 是一个生成 [0, 1] 之间随机数的函数。

  • 速度初始化:每个粒子的初始速度 v_i也可以随机生成:

    v_{i,j} = v_{\text{min},j} + \text{rand()} \times (v_{\text{max},j} - v_{\text{min},j})

    其中, v_{\text{min},j}v_{\text{max},j}分别是第 j 维的最小速度和最大速度。

        2. 计算适应度

        每个粒子都有一个“适应度”,这就像是鸟找到的食物量。适应度越高,表示解越好。我们用一个函数来计算每个粒子的适应度,这个函数通常是我们要优化的问题的目标函数。

        计算每个粒子当前的位置 x_i  对应的适应度值 f(x_i) ,以衡量其解的好坏。这个适应度函数 f 就是我们要优化的目标函数,具体形式取决于实际问题。

        3. 更新个体和全局最佳位置

        每个粒子都记得自己找到的最好的位置(个体最佳位置 p_i ​),这叫做“个体最佳位置”。同时,所有粒子中找到的最好的位置叫做“全局最佳位置”(全局最佳位置 g)。在每次迭代中,我们检查每个粒子的当前位置是否比它之前找到的最好位置更好,如果是,就更新个体最佳位置。同时,我们也更新全局最佳位置。

        在优化问题中,我们通常有一个目标函数 f(x),其目的是要最小化或最大化这个函数。适应度函数 f(x) 是一个评估每个解好坏的函数。在最小化问题中,适应度函数值越小,表示这个解越好;而在最大化问题中,适应度函数值越大,表示这个解越好。

  • 个体最佳位置更新:对于每个粒子,如果当前适应度值更好,则更新个体最佳位置:

    如果 f(x_i) < f(p_i) ,则 p_i = x_i。其中, p_i ​ 是第 i 个粒子的个体最佳位置。

  • 全局最佳位置更新:检查所有粒子的个体最佳位置,找到适应度值最小(此处假设为最大化问题)的那个位置作为全局最佳位置:g = \arg \min_{p_i} f(p_i)。其中,g 是全局最佳位置。

        4. 更新速度和位置

        更新速度

        每个粒子的速度更新公式如下:

v_{i,j}(t+1) = w \cdot v_{i,j}(t) + c_1 \cdot \text{rand()} \cdot (p_{i,j} - x_{i,j}(t)) + c_2 \cdot \text{rand()} \cdot (g_j - x_{i,j}(t))

        其中:

  • v_{i,j}(t)是第 i 个粒子在第 j 维上的当前速度。
  • w 是惯性权重,控制粒子保持原有速度的程度。
  • c_1是认知系数,控制粒子向自身历史最佳位置移动的程度。
  • c_2是社会系数,控制粒子向全局最佳位置移动的程度。
  • \text{rand()} 是一个生成 [0, 1]之间随机数的函数。
  • p_{i,j}是第 i 个粒子在第 j 维上的个体最佳位置。
  • g_j 是全局最佳位置在第 j 维上的值。
  • x_{i,j}(t)是第 i 个粒子在第 j 维上的当前位置。

        更新位置:

        每个粒子的位置更新公式如下:

        x_{i,j}(t+1) = x_{i,j}(t) + v_{i,j}(t+1)

        其中:

  • x_{i,j}(t)是第 i 个粒子在第 j 维上的当前位置。
  • v_{i,j}(t+1) 是第 i 个粒子在第 j 维上的更新后的速度。

5. 重复迭代

        我们重复上述步骤,直到满足某个停止条件,比如达到最大迭代次数,或者粒子的适应度变化很小。

三、Python示例

  1. 目标函数:定义了一个简单的目标函数f(x, y) = x^2 + y^2
  2. 参数设置:设置了PSO算法的参数,包括粒子数量、迭代次数、惯性权重和认知/社会系数。
  3. 初始化:初始化了粒子的位置和速度,同时记录每个粒子的个体最佳位置和全局最佳位置。
  4. 迭代优化:在每次迭代中,更新粒子的速度和位置,更新个体最佳位置和全局最佳位置,记录全局最佳位置的历史。
  5. 理论结果:定义的目标函数f(x, y) = x^2 + y^2 中,全局最优解显然是 (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()

        结果如下:

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

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

相关文章

关于锁策略

在Java中对于多线程来说&#xff0c;锁是一种重要且必不可少的东西&#xff0c;那么我们将如何使用以及在什么时候使用什么样的锁呢&#xff1f;请各位往下看 悲观锁VS乐观锁 悲观锁&#xff1a; 在多线程环境中&#xff0c;冲突是非常常见的&#xff0c;所以在执行操作之前…

GRL-图强化学习

GRL代码解析 一、agent.py二、drl.py三、env.py四、policy.py五、utils.py 一、agent.py 这个Python文件agent.py实现了一个强化学习&#xff08;Reinforcement Learning, RL&#xff09;的智能体&#xff0c;用于在图环境&#xff08;graph environment&#xff09;中进行学习…

【python_将一个列表中的几个字典改成二维列表,并删除不需要的列】

def 将一个列表中的几个字典改成二维列表(original_list,headersToRemove_list):# 初始化一个列表用于存储遇到的键&#xff0c;保持顺序ordered_keys []# 遍历data中的每个字典&#xff0c;添加其键到ordered_keys&#xff0c;如果该键还未被添加for d in original_list:for …

MXNet 库使用指南

MXNet 是一个功能强大且灵活的深度学习框架&#xff0c;广泛应用于图像分类、自然语言处理和推荐系统等领域。下面将详细介绍如何使用 MXNet 库&#xff0c;包括安装、基础使用、构建和训练神经网络模型。 1. 安装 MXNet 首先&#xff0c;需要安装 MXNet。可以使用以下命令安装…

P4009 汽车加油行驶问题题解

P4009 汽车加油行驶问题 紫题&#xff0c;但是DFS。 思路 记忆化搜索&#xff0c;分多钟情况去搜索。 注意该题不用标记&#xff0c;有可能会往回走。 有可能这样走。 代码 #include<bits/stdc.h> #include<cstring> #include<queue> #include<set&g…

Flutter Geolocator插件使用指南:获取和监听地理位置

Flutter Geolocator插件使用指南&#xff1a;获取和监听地理位置 简介 geolocator 是一个Flutter插件&#xff0c;提供了一个简单易用的API来访问特定平台的地理位置服务。它支持获取设备的最后已知位置、当前位置、连续位置更新、检查设备上是否启用了位置服务&#xff0c;以…

redis:清除缓存的最简单命令示例

清除redis缓存命令(执行命令列表见截图) 1.打开cmd窗口&#xff0c;并cd进入redis所在目录 2.登录redis redis-cli 3.查询指定队列当前的记录数 llen 队列名称 4.清除指定队列所有记录 ltrim 队列名称 1 0 5.再次查询&#xff0c;确认队列的记录数是否已清除

配置和连接另一台电脑上的 MySQL 数据库

要配置和连接另一台电脑上的 MySQL 数据库&#xff0c;可以按照以下步骤进行设置&#xff1a; 1. 配置 MySQL 服务器 在目标计算机上&#xff08;192.168.10.103&#xff09;进行以下操作&#xff1a; 修改 MySQL 配置文件&#xff1a; 打开 MySQL 配置文件&#xff08;通常位…

VPN,实时数据显示,多线程,pip,venv

VPN和翻墙在本质上是不同的。想要真正实现翻墙&#xff0c;需要选择部署在墙外的VPN服务。VPN也能隐藏用户的真实IP地址 要实现Python对网页数据的定时实时采集和输出&#xff0c;可以使用Python的定时任务调度模块。其中一个常用的库是APScheduler。您可以编写一个函数&#…

【系统架构设计师】十八、信息系统架构设计理论与实践①

目录 一、信息系统架构概述 二、信息系统架构风格与分类 2.1 信息系统架构风格 2.2 信息系统架构分类 三、信息系统架构模型 3.1 单体应用 3.2 客户机/服务器 3.2.1 二层 C/S 3.2.2 三层 C/S 和 B/S 3.2.3 多层 C/S 和 B/S 3.2.4 MVC 3.3 面向服务架构(SOA)模式 …

Android 启动时应用的安装解析过程《一》

应用对于Android系统来说至关重要&#xff0c;系统会有几个时机对APP进行解析&#xff0c;一个是APK安装的时候会进行解析&#xff0c;还有一个就是系统在重启之后会进行解析&#xff0c;这里就简单的记录一下重启的时候APK的解析过程。 一、SystemServer 系统在启动之后从内…

Activiti 本地画流程 http://localhost:8080/activiti-app/#/

http://localhost:8080/activiti-app/#/ 1、本地安装了Tomcat 2、本地安装了Activiti 3、拷贝Activiti中这两个文件到Tomcat中的webapps目录下 4、启动startu.bat 5、http://localhost:8080/activiti-app/#/ 账号&#xff1a;admin 密码&#xff1a;test

乐鑫 Matter 技术体验日回顾|全面 Matter 解决方案驱动智能家居新未来

日前&#xff0c;乐鑫信息科技 (688018.SH) 在深圳成功举办了 Matter 方案技术体验日活动&#xff0c;吸引了众多照明电工、窗帘电机、智能门锁、温控等智能家居领域的客户与合作伙伴。活动现场&#xff0c;乐鑫产研团队的小伙伴们与来宾围绕 Matter 产品研发、测试认证、生产工…

Python学习笔记46:游戏篇之外星人入侵(七)

前言 到目前为止&#xff0c;我们已经完成了游戏窗口的创建&#xff0c;飞船的加载&#xff0c;飞船的移动&#xff0c;发射子弹等功能。很高兴的说一声&#xff0c;基础的游戏功能已经完成一半了&#xff0c;再过几天我们就可以尝试驾驶 飞船击毁外星人了。当然&#xff0c;计…

解析西门子PLC的String和WString

西门子PLC有两种字符串类型&#xff0c;String与WString String 用于存放英文数字标点符号等ASCII字符&#xff0c;每个字符占用一个字节 WString宽字符串用于存放中文、英文、数字等Unicode字符&#xff0c;每个字符占用两个字节 之前我搞过一篇解析String的 关于使用TCP-…

nginx基础使用

文章目录 nginx下载和编译configtest1test2config 原理 nginx 功能: 做为web server 使用在局域网内&#xff0c;提供对外的ip和端口 下载和编译 源码内容&#xff1a; nginx openssl pcrc zlib 编译&#xff1a; 1 cmake 方式&#xff1a; mkdir build cd build cmake 2 ma…

Unity Shader动画:用代码绘制动态视觉效果

在Unity中&#xff0c;Shader是运行在GPU上的小程序&#xff0c;用于控制顶点和像素的渲染过程。通过编写自定义Shader&#xff0c;开发者可以创造出各种令人惊叹的动画效果&#xff0c;从简单的颜色变化到复杂的流体模拟。本文将探讨如何使用Unity Shader来实现动画效果。 Sh…

算法入门篇(五)之 树的应用

目录 1.树和二叉树 1.1树&#xff08;Tree&#xff09; 1.1.1 特点 1.1.2 使用场景 1.1.3 示例 1.2二叉树&#xff08;Binary Tree&#xff09; 1.2.1 特点 1.2.2 使用场景 1.2.3 示例 2.二叉树遍历 2.1 先序遍历、中序遍历、后序遍历、层次遍历 2.1.1 先序遍历&…

git命令实现github与gitee同步

使用 git remote -v查看远程库连接了啥 git remote set-url --add origin 你的git仓库ssh (意思就是在 远端库origin下面加一个)然后就是git push&#xff08;这里可能会碰到问题&#xff0c;远程仓库的分支比本地分支更新&#xff09;注意github&#xff08;main&#xff09;与…

Vue3 Pinia的创建与使用代替Vuex 全局数据共享 同步异步

介绍 提供跨组件和页面的共享状态能力&#xff0c;作为Vuex的替代品&#xff0c;专为Vue3设计的状态管理库。 Vuex&#xff1a;在Vuex中&#xff0c;更改状态必须通过Mutation或Action完成&#xff0c;手动触发更新。Pinia&#xff1a;Pinia的状态是响应式的&#xff0c;当状…