粒子群算法(Particle Swarm Optimization)

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

算法背景

粒子群优化算法(Particle Swarm Optimization,PSO)的灵感来源于鸟群或鱼群的觅食行为。想象一下,你在公园里看到一群鸟,它们在空中飞翔,寻找食物。每只鸟都不知道食物在哪里,但它们会根据周围其他鸟的位置和过去自己找到食物的经验来调整自己的飞行方向。如果一只鸟发现了食物,其他鸟很快也会朝着这个方向飞去。在这个过程中,整个鸟群像一个搜索系统,通过个体间的信息共享,找到最佳的觅食地点。

这个觅食的过程非常像一个优化问题:每只鸟(粒子)都在寻找食物(最优解),它们根据自己和同伴的经验(位置信息),在整个空间(搜索空间)中移动,最终找到食物的位置(最优解的位置)。

有读者可以感觉粒子群算法与麻雀算法有些相似。粒子群算法(PSO)和麻雀搜索算法(SSA)都是受自然界中群体行为启发的优化算法,它们都模仿了生物群体的社会行为来寻找最优解。然而,PSO是基于鸟群的觅食行为,而SSA则是模仿了麻雀的觅食和警戒行为,两者在模拟策略和行为细节上有所不同。

算法应用

粒子群优化算法(PSO)是一种非常灵活和多用途的优化算法,它在许多领域都有广泛的应用。以下是一些主要的应用场景:

  1. 工程优化:在工程领域,PSO常被用于设计优化、结构优化、电力系统优化等。比如,可以用它来优化建筑的结构设计,使其在成本和稳定性之间达到最佳平衡。
  2. 机器学习和数据挖掘:在机器学习中,PSO可以用于选择最佳的特征组合、调整算法的参数,甚至是用于训练神经网络。
  3. 网络和计算机科学:在网络设计、路由优化、云计算资源分配等领域,PSO也显示出了其有效性。比如,它可以用于优化网络中的数据流,确保信息快速且准确地传输。
  4. 经济学和金融:在金融市场分析、投资组合优化等方面,PSO也被广泛应用。它可以帮助投资者决定在何处投资,以及如何分配他们的资产,以获得最大的收益。
  5. 生物医学应用:在生物医学领域,PSO被用于生物信息学、药物设计和医疗影像分析等方面,帮助研究人员解决复杂的生物医学问题。

算法计算流程

粒子群优化算法 (PSO) 的计算流程可以详细分为以下几个步骤:
1. 初始化粒子群:
– 随机生成一组粒子 (解的候选者),每个粒子代表搜索空间中的一个潜在解。
– 为每个粒子指定一个随机的位置 (即解的值) 和速度。
2. 评估粒子的适应度:
– 对每个粒子的当前位置进行评估,根据优化问题的目标函数计算其适应度(如何接近最优解)。

3. 更新速度和位置:
– 对于每个粒子,根据下面的公式更新其速度:

标准的粒子群速度更新公式如下:

v_i^\mathrm{new~}=w\cdot v_i^\mathrm{old~}+c_1\cdot rand_1\cdot\left(\mathrm{~pbest~}_i-x_i^\mathrm{old~}\right)+c_2\cdot rand_2\cdot\left(g\mathrm{~best~}-x_i^\mathrm{old~}\right)

其中:
– v_{i}^{new} 是粒子 i 在新的迭代中的速度。
– w是惯性权重,用于控制前一速度对当前速度的影响。
v_{i}^{\mathrm{old}}是粒子 i 在前一迭代中的速度。
– c_{1} 和 c_{2} 是加速常数,用于调整个体和社会学习行为的相对影响。
– rand_{1}和  rand_{2}是两个介于 0 和 1 之间的随机数。
pbset_{i}是粒子 i 到目前为止找到的最优位置。
– gbest 是整个群体到目前为止找到的最优位置。
x_{i}^{old} 是粒子 i 在前一迭代中的位置。
– 更新粒子的位置:

x_i^\text{new }=x_i^\text{old }+v_i^\text{new}

4. 更新个体和全局最优解:
– 对于每个粒子,如果当前位置比之前遇到的最佳位置更优,则更新其个体最优解 (pbest)。
– 同时,从所有粒子中找出具有最佳适应度的位置,更新为全局最优解 (gbest)。

5. 迭代和终止条件:
– 重复步骤2-4,直到满足终止条件(如达到最大迭代次数或解的质量达到预定阈值) 。
6. 输出结果:
– 算法结束时,全局最优解 gbest 即为找到的最优解。

注意,粒子群优化算法 (PSO) 中的速度更新公式设计得非常巧妙,它反映了算法的核心思想: 通过模拟鸟群的社会行为来指导搜索过程。公式的设计考虑了以下几个关键因素:
1. 惯性权重 w :
– 这部分表示粒子的当前速度对其未来速度的影响,即粒子的惯性。较大的惯性权重有助于粒子探索更远的区域,促进全局搜索;较小的权重有利于粒子在局部区域进行详细搜索,促进局部优化。
2. 个体经验 c_1\cdot rand_1\cdot\left(\mathrm{~pbest~}_i-x_i^\mathrm{old~}\right) :
– 这部分反映了粒子自身的历史最佳位置 (个体经验) 对其速度的影响。粒子会考虑自己之前找到的最优位置(pbest),并朝这个方向调整速度。这里的随机数 rand 1 保证了搜索的随机性和多样性。
3. 社会经验c_2\cdot rand_2\cdot\left(g\mathrm{~best~}-x_i^\mathrm{old~}\right) :
– 这部分考虑了群体中其他粒子的信息。每个粒子也会朝着当前群体中已知的最优位置 (gbest) 移动。这里的随机数 rand 2 同样增加了搜索的随机性和多样性。
4. 学习因子 c1 和 c2 :
– 这两个学习因子分别表示个体经验和社会经验对速度更新的影响程度。这些因子的值决定了算法是倾向于利用个体的过去经验还是群体的共同经验。

总的来说,速度更新公式通过结合个体历史信息和群体共享信息,以及通过引入随机因素来增加搜索的多样性,从而有效地指导粒子群体在解空间中的搜索行为,这既保证了全局搜索能力,又保留了局部搜索的细致性。通过调整公式中的参数,可以控制算法的探索和开发能力,使其适应不同类型的优化问题。

算法示例推导

上述函数求解的python代码实现如下:

import numpy as np
import matplotlib.pyplot as plt
# 粒子群优化算法(PSO)求解 f(x, y) = x^2 + y^2
# 目标函数
def objective_function(position):
    x, y = position
    return x**2 + y**2
# 参数设置
n_particles = 50
n_iterations = 10
dim = 2  # 搜索空间的维度,这里是二维空间
w = 0.5  # 惯性权重
c1 = 0.8  # 个体学习因子
c2 = 0.9  # 社会学习因子
# 初始化粒子群
particle_position = np.random.rand(n_particles, dim) * 10 - 5  # 初始位置
particle_velocity = np.random.rand(n_particles, dim) * 2 - 1  # 初始速度
pbest_position = particle_position.copy()  # 个体最优位置
pbest_value = np.full(n_particles, float('inf'))  # 个体最优值
gbest_value = float('inf')  # 全局最优值
gbest_position = np.array([float('inf'), float('inf')])  # 全局最优位置
# 迭代过程
for i in range(n_iterations):
    for j in range(n_particles):
        # 计算每个粒子的适应度值
        fitness = objective_function(particle_position[j])
        # 更新个体最优
        if fitness < pbest_value[j]:
            pbest_value[j] = fitness
            pbest_position[j] = particle_position[j].copy()
        # 更新全局最优
        if fitness < gbest_value:
            gbest_value = fitness
            gbest_position = particle_position[j].copy()
    for j in range(n_particles):
        # 更新速度
        particle_velocity[j] = (w * particle_velocity[j] + 
                                c1 * np.random.rand() * (pbest_position[j] - particle_position[j]) + 
                                c2 * np.random.rand() * (gbest_position - particle_position[j]))
        # 更新位置
        particle_position[j] += particle_velocity[j]
# 输出结果
print(f"全局最优位置:{gbest_position}")
print(f"全局最优值:{gbest_value}")
# 重新执行粒子群优化算法,进行5次迭代
# 重新初始化粒子位置和速度
particle_position = initial_particle_position.copy()  # 粒子位置
particle_velocity = np.random.rand(n_particles, dim) * 2 - 1  # 初始速度
pbest_position = particle_position.copy()  # 个体最优位置
pbest_value = np.full(n_particles, float('inf'))  # 个体最优值
gbest_value = float('inf')  # 全局最优值
gbest_position = np.array([float('inf'), float('inf')])  # 全局最优位置
# 执行5次迭代的过程
for _ in range(5):
    for j in range(n_particles):
        fitness = objective_function(particle_position[j][0], particle_position[j][1])
        if fitness < pbest_value[j]:
            pbest_value[j] = fitness
            pbest_position[j] = particle_position[j].copy()
        if fitness < gbest_value:
            gbest_value = fitness
            gbest_position = particle_position[j].copy()
    for j in range(n_particles):
        particle_velocity[j] = (w * particle_velocity[j] + 
                                c1 * np.random.rand() * (pbest_position[j] - particle_position[j]) + 
                                c2 * np.random.rand() * (gbest_position - particle_position[j]))
        particle_position[j] += particle_velocity[j]
# 创建3D图形
fig = plt.figure(figsize=(12, 6))
# 初始状态
ax1 = fig.add_subplot(1, 2, 1, projection='3d')
ax1.plot_surface(x, y, z, cmap='viridis', alpha=0.6)
ax1.scatter(initial_particle_position[:, 0], initial_particle_position[:, 1], 
            objective_function(initial_particle_position[:, 0], initial_particle_position[:, 1]), 
            color='r', s=10)
ax1.set_title('初始状态')
ax1.set_xlabel('X axis')
ax1.set_ylabel('Y axis')
ax1.set_zlabel('Z axis')
# 优化后的状态(5次迭代后)
ax2 = fig.add_subplot(1, 2, 2, projection='3d')
ax2.plot_surface(x, y, z, cmap='viridis', alpha=0.6)
ax2.scatter(particle_position[:, 0], particle_position[:, 1], 
            objective_function(particle_position[:, 0], particle_position[:, 1]), 
            color='r', s=10)
ax2.set_title('优化后的状态(5次迭代)')
ax2.set_xlabel('X axis')
ax2.set_ylabel('Y axis')
ax2.set_zlabel('Z axis')
plt.show()

最后,我分别可视化了粒子群优化算法初始状态和优化5轮后的状态,对比表明粒子群优化算法的效果。

图片[1]-粒子群算法(Particle Swarm Optimization)-VenusAI

  • 左图(初始状态):展示了目标函数的表面,并标记了初始化时粒子群的位置(红色点)。这些点代表粒子群初始时的随机分布。
  • 右图(优化后的状态 – 5次迭代):同样展示了目标函数的表面,并标记了经过5次迭代后粒子群的位置(红色点)。可以看到,粒子群的位置相比于初始状态有了明显的聚集,部分粒子开始靠近函数的最小值点(原点)。

这两幅图形象地说明了粒子群优化算法的工作原理:从随机搜索开始,经过多次迭代,粒子逐渐聚焦于搜索空间中的优化区域。虽然只进行了5次迭代,但我们已经可以看到粒子群朝着问题的最优解方向的逐渐聚集。随着更多迭代的进行,粒子群将更加集中地趋向于全局最优解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python怎么遍历字符串

python怎么遍历字符串&#xff1f;下面给大家介绍四种方法&#xff1a; 1、第一种方式&#xff0c;使用for in遍历字符串。 girl_str "love You" for everyChar in girl_str:print everyChar 2、第二种方式&#xff0c;使用range()或xrange()&#xff0c;把字符串…

iOS MRC那句话

混编时使用MRC文件需要使用这句话 -fno-objc-arc在下图中显示的位置添加

vue:网页icon无法显示

logo文件放在public文件夹下&#xff0c;在html里设置icon。 本地源码运行后发现网页icon无法显示我们设置的logo&#xff0c;而是显示了浏览器默认icon。 这个问题不需要解决&#xff0c;部署后网页icon显示就正常了。

【软考网络工程师】每日练题学知识

1.在EIGRP协议中&#xff0c;某个路由器收到了两条路径到达目标网络&#xff0c;路径1的带宽为100Mbps&#xff0c;延迟2ms&#xff0c;路径2的带宽为50Mbps&#xff0c;迟为4ms&#xff0c;如果EIGRP使用带宽和延迟的综合度量标准&#xff0c;那么该路由器选择的最佳路径是&am…

【MySQL的内外连接】

文章目录 一、内连接二、外连接1.左外连接2.右外连接 一、内连接 基本语法&#xff1a; select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件&#xff1b;&#xff08;这里的and&#xff0c;也可以修改成where&#xff0c;并且建议使用where&#xff0c;逻辑更清晰…

GEE案例分析——利用多时 Sentinel-1/2 和 Landsat-8/9 遥感数据在GEE中使用机器学习方法进行作物类时序分类

摘要 准确绘制作物类型图对于确保粮食安全至关重要。遥感(RS)卫星数据空间覆盖面广,时间频率高,是这一领域前景广阔的工具。然而,由于作物的类内和类间变异性很高,利用 RS 数据进行准确的作物类型分类方法的需求仍在不断增长。为此,本研究提出了一种新颖的并行级联集合…

《Video Mamba Suite》论文笔记(3)Mamba作为时序适配器的作用

原文翻译 4.3 Mamba as Video Temporal Adapter&#xff08;时序自适应建模&#xff09; Tasks and datasets.除了评估 Mamba 在后时间建模中的性能外&#xff0c;我们还评估了它作为视频时间适配器的有效性。通过对自我中心数据[29,49]进行视频-文本对比学习&#xff0c;对双…

免费的集成组件有哪些?

集成组件是指将多个软件或系统进行整合&#xff0c;以实现更高效、更可靠的数据处理和管理。在数据管理和分析领域&#xff0c;集成组件是不可或缺的工具之一。 在当今高度信息化的时代&#xff0c;集成组件在各行各业的应用中扮演着举足轻重的角色。集成组件能够将不同来源的…

翻天娃时光列车于地铁1号线闪耀启程,五一站厅活动再掀品牌热潮

四月下旬&#xff0c;备受瞩目的翻天娃食品品牌地铁广告震撼亮相长沙地铁1号线&#xff0c;翻天娃时光列车闪耀启程。五月中旬&#xff0c;翻天娃又在五一广场地铁站举办了一场别出心裁的站厅活动&#xff0c;将市民乘客们带入了一场穿越时光的奇妙旅程。 作为一家专注于休闲食…

【opencv】图像处理(一)

实验环境&#xff1a;anaconda、jupyter notebook 实验用到的包&#xff1a;numpy,matplotlib,opencv 一、opencv安装 最好使用python3.6&#xff08;我之前用的3.9安装opencv3.4.1.15会失败&#xff09; conda create -n cv python3.6安装opencv3.4.1.15&#xff08;3.4.2版…

美国加州正测试ChatGPT等生成式AI,在4大部门应用

5月11日&#xff0c;美联社消息&#xff0c;美国加州政府正在测试ChatGPT等生成式AI&#xff0c;应用在税收和收费管理部、交通部、公共卫生部以及卫生与公众服务部4大部门。 测试时间6个月&#xff0c;为其提供技术支持的一共有5家公司&#xff0c;分别是OpenAI、Anthropic、…

笨方法自学python(九)-读写文件

读取文件 前面已经学过了 input 和 argv&#xff0c;这些是你开始学习读取文件的必备基础。你可能需要多多实验才能明白它的工作原理&#xff0c;这节练习涉及到写两个文件。一个正常的 ex15.py 文件&#xff0c;另外一个是 ex15_sample.txt&#xff0c;第二个文件并不是脚本&…

电子杂志制作攻略,轻松打造高质量数字出版物

随着数字科技的飞速发展&#xff0c;电子杂志作为一种新型的数字出版物&#xff0c;已经越来越受到人们的青睐。它不仅具有丰富的内容、多样的形式&#xff0c;还具有便捷的传播和阅读方式。如今&#xff0c;电子杂志已经逐渐成为企业、媒体和个人展示自身品牌、传播信息的重要…

IDEA项目代码修改后不自动生效需要执行mvn clean install才生效

背景 IDEA代码修改之后&#xff0c;启动测试发现不生效&#xff0c;只有重新mvn clean install之后才能加载到改动的代码 解决方法 严重怀疑是idea的配置问题导致的&#xff0c;没有什么特别好的办法&#xff0c;只能删配置重新导入 1、删除 .idea文件夹 以及 所有.iml文件 …

一个基于servlet的MVC项目-登录验证

一、MVC的概念 MVC是Model、View、Controller的缩写&#xff0c;分别代表 Web 应用程序中的3种职责1 模型:用于存储数据以及处理用户请求的业务逻辑。 2视图:向控制器提交数据&#xff0c;显示模型中的数据。 3控制器:根据视图提出的请求&#xff0c;判断将请求和数据交给哪个…

身份证实名认证API接口如何对接

身份证实名认证API接口又叫身份证核验API接口、身份证二要素验证API接口&#xff0c;指的是输入姓名和身份证号通过官方权威核查&#xff0c;实时校验此二要素是否一致。那么身份证实名认证API接口如何对接呢&#xff1f; 首先我们找到一家有这个接口的服务商数脉API,然后注册…

数据分离和混淆矩阵的学习

1.明确意义 通过训练集建立模型的意义是对新的数据进行准确的预测&#xff08;测试集的准度高才代表good fit&#xff09;&#xff1b; 2.评估流程 3.单单利用准确率accuracy进行模型评估的局限性 模型一&#xff1a;一共1000个数据&#xff08;分别为900个1和100个0&#x…

Python自动化办公实战案例:文件整理与邮件发送

目录 一、引言 二、案例背景 三、实战案例 &#xff08;一&#xff09;文件自动整理 &#xff08;二&#xff09;邮件自动发送 四、结语 一、引言 随着办公自动化的兴起&#xff0c;Python作为一门强大的编程语言&#xff0c;逐渐被应用于日常办公中。从文件整理到邮件…

RelationMap图谱--VUE,真实项目提供mock数据

RelationMap官网&#xff1a; 在线配置官网&#xff08;可以把数据放进去&#xff0c;直接看效果&#xff09; VUE2 效果&#xff1a;左侧列表栏&#xff0c;点击右侧显示对应的图谱 代码&#xff1a;按照代码直接贴过去&#xff0c;直接出效果 relationMap/index.vue <te…

【小白的大模型之路】基础篇:Transformer细节

基础篇&#xff1a;Transformer 引言模型基础架构原论文架构图EmbeddingPostional EncodingMulti-Head AttentionLayerNormEncoderDecoder其他 引言 此文作者本身对transformer有一些基础的了解,此处主要用于记录一些关于transformer模型的细节部分用于进一步理解其具体的实现机…