粒子群算法原理的示例介绍

news2024/9/23 7:21:22

一:粒子群优化算法的介绍

粒子群优化算法(PSO)是一种基于群体智能的优化算法,于1995年提出。它受到鸟群狩猎行为的启发,通过模拟鸟群或鱼群的社会行为来进行问题的求解。

基本原理

粒子群算法中,每个解决问题的潜在解被视为搜索空间中的一个“粒子”,每个粒子代表了问题的一个可能解。粒子在搜索空间中飞行,通过跟踪两个“极值”来更新自己的位置和速度:

1. 个体极值:粒子自身所经历的最优位置。
2. 全局极值:整个粒子群中所有粒子所经历的最优位置。

算法步骤

1. 初始化:随机初始化一群粒子的位置和速度。
2. 评价:计算每个粒子的适应度值。在粒子群优化算法(PSO)中,适应度值是用来评估粒子当前位置好坏的指标,它直接关系到粒子搜索最优解的能力。适应度函数(Fitness Function)是定义在搜索空间上的一个函数,它将粒子的位置映射到一个实数值,这个值越小(或越大,取决于优化问题的目标)表示粒子越优。
3. 更新个体极值:如果当前粒子的位置比它之前经历的最优位置更优,则更新个体极值。
4. 更新全局极值:如果当前粒子的位置比群体中所有粒子经历的最优位置更优,则更新全局极值。
5. 更新速度和位置:根据个体极值和全局极值更新每个粒子的速度和位置。
6. 迭代:重复步骤2-5,直到满足停止条件(如达到最大迭代次数或解的质量满足要求)。

算法公式

粒子的速度和位置更新公式通常如下:

二:粒子群优化算法的实现原理示例

实例:求解函数的最小值

目标函数:选择一个简单的多维函数,例如f(x)=x_{}^{2}+y_{}^{2},我们的目标是找到这个函数的全局最小值

1:导入必要的库

import numpy as np

这里导入了NumPy库,可用于大型多维数组的运算。

2:定义目标函数

def objective_function(position):
    x, y = position
    return x**2 + y**2

 3:初始化粒子群

def initialize_particles(n_particles, dim):
    particles = np.random.rand(n_particles, dim) * 20 - 10  # 在[-10, 10]范围内随机初始化
    velocities = np.zeros((n_particles, dim))
    return particles, velocities

这个函数初始化粒子群:

  • particles:一个二维数组,表示每个粒子的位置。位置是在 [−10,10][−10,10] 范围内随机初始化的。
  • velocities:一个与 particles 大小相同的二维数组,表示每个粒子的速度。初始时,所有粒子的速度都是0。

4. 更新粒子速度和位置

def update_particles(particles, velocities, best_particle, best_global_position, c1=1.5, c2=1.5, w=0.5):
    for i in range(particles.shape[0]):
        r1, r2 = np.random.rand(2)
        velocities[i] = w * velocities[i] + c1 * r1 * (best_particle[i] - particles[i]) + 
                        c2 * r2 * (best_global_position - particles[i])
        particles[i] += velocities[i]

这个函数根据上述的速度和位置更新公式来更新粒子的速度和位置。

5. 粒子群优化主函数

def particle_swarm_optimization(n_particles, dim, max_iter, target_fitness):
    particles, velocities = initialize_particles(n_particles, dim)
    best_particle = particles.copy()
    best_global_position = particles[np.argmin([objective_function(p) for p in particles])]
    best_global_fitness = objective_function(best_global_position)

    for _ in range(max_iter):
        for i in range(particles.shape[0]):
            fitness = objective_function(particles[i])
            if fitness < objective_function(best_particle[i]):
                best_particle[i] = particles[i]
                if fitness < best_global_fitness:
                    best_global_fitness = fitness
                    best_global_position = particles[i]

        if best_global_fitness < target_fitness:
            break

        update_particles(particles, velocities, best_particle, best_global_position)

    return best_global_position, best_global_fitness

这是PSO算法的主函数:

def particle_swarm_optimization(n_particles, dim, max_iter, target_fitness):

这个函数接受以下参数:

  • n_particles:粒子群中粒子的数量。
  • dim:搜索空间的维度(在这个例子中是2维)。
  • max_iter:算法执行的最大迭代次数。
  • target_fitness:目标适应度值,当全局最优适应度小于这个值时,算法停止。
particles, velocities = initialize_particles(n_particles, dim)

这里调用 initialize_particles 函数来初始化粒子群的位置和速度。

best_particle = particles.copy()
best_global_position = particles[np.argmin([objective_function(p) for p in particles])]
best_global_fitness = objective_function(best_global_position)
  • best_particle:每个粒子到目前为止找到的最好位置,初始时与粒子当前位置相同。
  • best_global_position:整个群体到目前为止找到的最好位置,初始时是 particles 中适应度最小的位置。 NumPy函数 np.argmin 用于找到列表中的最小值的索引。在这里,它返回的是具有最小目标函数值的粒子的索引。
  • best_global_fitness:全局最优适应度,即 best_global_position 处的适应度值。
for _ in range(max_iter):

这个主循环将在 max_iter 指定的迭代次数内运行。

for i in range(particles.shape[0]):
    fitness = objective_function(particles[i])
    if fitness < objective_function(best_particle[i]):
        best_particle[i] = particles[i]
        if fitness < best_global_fitness:
            best_global_fitness = fitness
            best_global_position = particles[i]

对于每个粒子:

  • 计算其当前适应度 fitness
  • 如果当前适应度小于该粒子迄今为止找到的最好位置的适应度,则更新该粒子的最佳位置 best_particle[i]
  • 如果当前适应度也小于全局最优适应度,则更新全局最优位置 best_global_position 和全局最优适应度 best_global_fitness
if best_global_fitness < target_fitness:
    break

如果在任何时刻全局最优适应度小于目标适应度 target_fitness,则提前终止算法。我们在本示例中目标适应度 target_fitness设为1e-6。

update_particles(particles, velocities, best_particle, best_global_position)

调用 update_particles 函数来根据PSO的规则更新粒子的速度和位置。

return best_global_position, best_global_fitness

函数最后返回全局最优位置 best_global_position 和全局最优适应度 best_global_fitness

整个算法的目标是找到目标函数 objective_function 的最小值,通过迭代地更新粒子的位置和速度,算法逐渐接近最优解。

6. 运行PSO算法

n_particles = 30
dim = 2
max_iter = 1000
target_fitness = 1e-6
best_position, best_fitness = particle_swarm_optimization(n_particles, dim, max_iter, target_fitness)
best_position, best_fitness

这里设置了PSO算法的参数并运行它。最后,打印出找到的最佳位置和适应度。这个实现的目标是找到使目标函数最小的 𝑥 和 𝑦。运行结果如下:

通过粒子群算法,我们成功找到了目标函数近似全局最小值。最终结果是在大约1000次迭代后得到的,最优位置接近于 (0, 0),这是函数的理论最小值点。最优适应度(即函数值)非常接近于0,这表明算法效果良好。

三:基于pyswarm库实现粒子群优化算法

pyswarm库中的粒子群优化(Particle Swarm Optimization,简称PSO)算法可以用来寻找一个目标函数的最优解,同时满足约束条件。接下来仍然f(x)=x_{}^{2}+y_{}^{2}为例,目标是找到这个函数的全局最小值。且pso函数默认寻找最小值。

  1. 导入pyswarm库中的pso函数

    from pyswarm import pso
    

    这行代码导入了pyswarm库中的pso函数,该函数是实现粒子群优化算法的核心。

  2. 定义目标函数

    def objective_function(x):
        return x[0]**2 + x[1]**2
    

    这里定义了一个接受一个参数x的函数,x是一个包含两个元素的列表或数组,分别代表两个决策变量。目标函数计算的是这两个决策变量的平方和。

  3. 定义约束条件

    def constraint(x):
        return 1 - x[0]**2 - x[1]**2
    

    约束条件函数接受决策变量x作为输入,并返回一个值。对于不等式约束,如果返回值大于等于0,则认为约束被满足。在这个例子中,约束条件意味着决策变量x的解必须在单位圆内。

  4. 使用pso函数进行优化

    xopt, fopt = pso(objective_function, [-10, -10], [10, 10], f_ieqcons=constraint)
    

    这行代码调用了pso函数来执行优化。以下是参数的说明:

    • objective_function:前面定义的目标函数。
    • [-10, -10]:决策变量的下界,表示每个变量可以取的最小值。
    • [10, 10]:决策变量的上界,表示每个变量可以取的最大值。
    • f_ieqcons=constraint:不等式约束条件。这里传递的是前面定义的constraint函数。
  5. 输出最优解和最优值

    print("最优解:", xopt)
    print("最优值:", fopt)
    

    这两行代码打印出优化算法找到的最优解xopt(决策变量的值)和最优值fopt(目标函数在最优解处的值)。结果如下:

想要探索更多元化的数据分析视角,可以关注之前发布的相关内容。

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

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

相关文章

顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比

顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测&#xff0c;优化前后对比 目录 顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测&#xff0c;优化前后对比预测效果基本介绍…

一种小众且适合发文的智能优化算法应用——三维TSP问题

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 今天给大家介绍一种非常小众的智能优化算法应用&am…

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大&#xff0c;但不同的语言在不同领域都有着自己的优势&#xff0c;为了强强联合&#xff0c;LabVIEW提供了强大的外部程序接口能力&#xff0c;包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等…

2024/9/9 408“回头看”:

B树是什么&#xff1f;有什么作用&#xff1f;B树的插入和删除具体细节是什么&#xff1f;除了B树还有一个是B&#xff0b;树、还是B-树&#xff0c;他们有什么区别&#xff0c;又有什么相同点&#xff1f; b树在王道考研查找这一章&#xff0c;所以他的主要作用就是查找。 在…

MySQL中binary放在判断语句之前有什么作用

为什么要加binary进行判断 ① 因为 mysql中等号比较是不区分大小写的&#xff0c;select aA这个输出结果为1。 ② 在判断语句之前 加上binary可以以区分大小写比较 &#xff0c;因为这样底层会用二进制形式比较&#xff0c;实现精确匹配。 代码比较 忽略大小写比较 select …

Ftrans跨域文件传输方案,数据流动无阻的高效路径

大型集团企业由于其规模庞大、业务广泛且往往将分支机构、办事处分布在多个地域&#xff0c;因此会涉及到跨域文件传输的需求。主要源于以下几个方面&#xff1a; 1.业务协同&#xff1a;集团内部的不同部门或子公司可能位于不同的地理位置&#xff0c;但需要进行紧密的业务协…

【C++】STL学习——priority_queue(了解仿函数)

目录 priority_queue介绍迭代器种类priority_queue实现仿函数仿函数的使用 priority_queue介绍 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆&#xff0c;在堆中可以随时插入元素&#x…

Linux 磁盘管理-RAID磁盘冗余阵列看这一篇就够了

今天给伙伴们分享一下Linux 磁盘管理-RAID磁盘冗余阵列&#xff0c;希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者&#xff0c;对云原生运维感兴趣&#xff0c;也保持时刻学习&#xff0c;后续会分享工作中用到的运维技术&#xff0c;在运维的路上得到…

机器学习深度学习

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 深度学习概述 1.1 定义与历史背景 深度学习作为机器学习领域的一个重要分支,其核心在于构建由多层(深层)的人工神经网络组成的计算模型,这些模型能够学习数据的多层次抽象表示。深度学习的…

东大成贤资源库-数据挖掘技术与应用 实验一:数据预处理_熟悉数据挖掘数据预处理流程。 基于给定的数据集(csv)文件,完成下列数据处理。 1

【实验内容】 程序清单 import pandas as pd import numpy as np# 读入文件&#xff0c;存放在字典data里 data pd.read_csv("D:\\Desktop\\data1.csv")# 填入Id列空缺的值 for i in range(1,len(data)):if pd.isnull(data[Id][i]):data[Id][i]i1# Id属性列去重&a…

虚拟机的安装步骤

我这里使用的是VMware 1.下载centos7 2.配置 跟这图来就好 开启虚拟机 第一个页面直接回车,忘了截图 等待安装 选择语言,看自己 点击完成 点击继续安装 设置账号密码 然后等待就行 安装完成之后会有一个重启,点击(又忘了截图) 完成许可和网络 最后就可以了

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代&#xff0c;文本到语音&#xff08;Text-to-Speech, TTS&#xff09;技术已成为人机交互的关键桥梁&#xff0c;无论是为视障人士提供辅助阅读&#xff0c;还是为智能助手注入声音的灵…

数据权限的设计与实现系列7——前端筛选器组件Everright-filter用法说明

背景 官方给了全局性的介绍和示例&#xff0c;不过到了具体使用环节&#xff0c;介绍就不是那么清楚明确了&#xff0c;往往是直接放 demo&#xff0c;需要去推测和揣测&#xff0c;然后动手验证。去百度了下&#xff0c;也没找到现成的对该组件的使用说明&#xff0c;得以开荒…

Unreal Fest 2024 虚幻引擎影视动画制作的普遍问题

一 毛发缓存数据巨大的问题&#xff08;及5个解决方案&#xff09; 在引擎里模拟毛发&#xff0c;并且把它缓存下来&#xff0c;我们就不需要从外部导入了&#xff0c;所以我们要解决的问题就是怎么样在引擎里自由地控制毛发 1.物理场控制 延申 [技术分享]《UE中的世界物理场…

迭代器模式iterator

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍&#xff11;、W25Q64简介&am…

P1071 [NOIP2009 提高组] 潜伏者

1.题目太长要耐性总结出题目的要求 2.map中count的使用方法 #include <bits/stdc.h> using namespace std; map<char, char>m0, m1;//m0记录密文对明文&#xff0c;m1记录明文对密文int main() {string x, y, z ;//x为密文&#xff0c;y为明文&#xff0c;z为待翻…

SpringBoot+Redis极简整合

1 前言 Redis是现在最受欢迎的NoSQL数据库之一&#xff0c;下面将以最简洁的代码演示&#xff0c;在SpringBoot中使用redis。 2 下载安装Redis 2.1 下载 Redis3.x windows安装版下载地址 2.2 安装到任意位置 一直Next到完即可。 2.3 启动 打开安装目录&#xff0c;点击…

【数据结构】堆——堆排序与海量TopK问题

目录 前言一、堆排序1.1 整体思路1.2 代码部分1.3 建堆的时间复杂度1.4 堆排序的总结 二、向下调整算法的时间复杂度三、向上调整算法的复杂度四、海量TopK问题4.1 TopK题目 总结 前言 上一篇我们学习了堆的数据结构&#xff0c;现在我们来看看堆的日常应用和排序 一、堆排序 …

内网安全-横向移动【3】

1.域横向移动-内网服务-Exchange探针 Exchange是一个电子右键服务组件&#xff0c;由微软公司开发。它不仅是一个邮件系统&#xff0c;还是一个消息与协作系统。Exchange可以用来构建企业、学校的邮件系统&#xff0c;同时也是一个协作平台&#xff0c;可以基于此开发工作流、…