Particle Swarm Optimization粒子群优化算法(PSO算法)概念及实战

这篇具有很好参考价值的文章主要介绍了Particle Swarm Optimization粒子群优化算法(PSO算法)概念及实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Particle Swarm Optimization

粒子群算法(PSO算法)

定义

粒子群算法,又称粒子群优化算法(Particle Swarm Optimization),缩写为 PSO, 是近年来发展起来的一种新的进化算法(Evolutionary Algorithm - EA),由Eberhart 博士和Kennedy 博士于1995年提出,其源于对鸟群捕食的行为研究。

算法思想

PSO模拟鸟群的捕食行为。

设想这样一个场景:一群鸟在随机搜索食物,在这个区域里只有一块食物,所有的鸟都不知道食物在那里,但是它们知道当前的位置离食物还有多远,那么找到食物的最优策略是什么呢?

最简单有效的就是搜寻目前离食物最近的鸟的周围区域。都向这片区域靠拢。

抽象

PSO中,将问题的搜索空间类比于鸟类的飞行空间,将每只鸟抽象为一个无质量无体积的微粒,用以表征优化问题的一个候选解,我们称之为“粒子”,优化所需要寻找的最优解则等同于要寻找的食物。

所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离,然后粒子们就追随当前的最优粒子在解空间中搜索。

PSO初始化为一群随机粒子(随机解、一群鸟),然后通过迭代找到最优解。在每一次迭代中,粒子(鸟)通过跟踪两个“极值”来更新自己的位置。一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest,另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。(gBest是pBest中最好值

算法介绍

•在找到这两个最优值时,粒子根据如下的公式来更新自己的速度和位置:
V = w × V + c 1 × r a n d ( ) × ( p B e s t − P r e s e n t ) + c 2 × r a n d ( ) × ( g B e s t − P r e s e n t ) P r e s e n t = P r e s e n t + V V = w \times V \\ \qquad + c_1 \times rand() \times ( pBest - Present ) \\ \qquad + c_2 \times rand() \times ( gBest - Present ) \\ Present = Present + V V=w×V+c1×rand()×(pBestPresent)+c2×rand()×(gBestPresent)Present=Present+V

  • V 是例子速度 velocity
  • Present 是粒子当前位置
  • pBest 个体极值 最优解
  • gBest 全局极值 最优解
  • rand() 是(0,1)之间的随机数
  • c_1、c_2 是学习因子 使粒子具有自我总结和向群体中优秀个体学习的能力,从而向群体内或邻域内最优点靠近,c_1和 c_2 通常等于2,并且范围在 0 和 4 之间
  • w 是加权系数(惯性权重)决定了对粒子当前速度继承多少,合适的选择可以使粒子具有均衡的探索能力和开发能力,惯性权重的取法有常数法、线性递减法、自适应法等。
  • Vmax: 最大速度,决定粒子在一个循环中最大的移动距离, 通常设定为粒子的范围宽度,例如,粒子 (x1, x2, x3) ,x1 属于 [-10, 10], 那么 x1的Vmax 的大小就是 20。
  • 粒子数(鸟的个数): 一般取 1~40. 其实对于大部分的问题10个粒子已经足够可以取得好的结果;
  • 粒子的长度(维度): 这是由优化问题决定, 就是问题解的长度(决策变量个数);
  • 粒子的范围: 由优化问题决定,每一维可以设定不同的范围;
  • 中止条件: 最大循环数以及最小错误要求。

将粒子延伸到N维空间,粒子i在N维空间里的位置表示为一个矢量,每个粒子的飞行速度也表示为一个矢量。

举例

对于问题 f(x) = x1^2 + x22+x32 求解,粒子可以直接编码为 (x1, x2, x3),而适应度函数就是f(x),接着我们就可以利用前面的过程去寻优,寻优过程是一个迭代过程, 中止条件一般为设置为达到最大循环数或者最小错误要求。

粒子群优化算法英文介绍,机器学习,数学建模,算法,人工智能,机器学习,数学建模

例题

找下式的极大值
f ( x , y ) = s i n x 2 + y 2 x 2 + y 2 + e c o s 2 π x + c o s 2 π y 2 − 2.71289 f(x,y)=\frac{sin\sqrt{x^2+y^2}}{\sqrt{x^2+y^2}}+e^{\frac{cos2\pi x+cos2\pi y}{2}}-2.71289 f(x,y)=x2+y2 sinx2+y2 +e2cos2πx+cos2πy2.71289

这里我们使用的工具是Python,我将从头到尾演示一下这整个过程

导入需要用的包

import random
import numpy as np
import math
import matplotlib.pyplot as plt

初始化粒子以及例子速度

这里我们选用了20个粒子,把粒子的x和y初始化在[-2,2]上,活动范围也都是[-2,2],速度都是0,v_max设置为[10,10]

pBest我用来记录fitness value最大的位置,所以我先使pBest = particles,gBest 在这里取第一个pBest的值,如果一次迭代都没有的话那就会出错。

fxyRecord 用来记录每一轮迭代的fitness value的最大值,indexBest用来记录当前使fitness value最大的那个粒子的index

c1和c2学习因子都选用了2,w惯性权重选用了0.8

number_of_particles = 20
particles = np.random.rand(number_of_particles*2)*2
particles=particles.reshape((number_of_particles,2))
rangeParticle = np.array([[-2,2],[-2,2]])
velocities = np.zeros((number_of_particles, 2))
v_max = np.array([10,10])

pBest = particles.copy()
gBest = pBest[0]

fxyRecord = np.array([])
indexBest = 0

c1 = 2
c2 = 2
w = 0.8

epoch = 0

粒子适应度检测

首先我们要给出fitness value的计算函数

def f(x,y):
    sqrtx2plusy2 =math.sqrt(math.pow(x,2)+math.pow(y,2))
    firstTerm = math.sin(sqrtx2plusy2)/sqrtx2plusy2
    secondTerm  = math.exp((math.cos(2*math.pi*x) + math.cos(2*math.pi*y))/2)
    return firstTerm+secondTerm-2.71289

让每个粒子都计算出他当前的fitness value,并即使更新pBest和gBest,并用fxyRecord和indexBest记录其结果。

for index in range(number_of_particles):
    present = particles[index]
    x = present[0]
    y = present[1]
    fxy=f(x,y)
    if f(pBest[index][0],pBest[index][1]) < fxy:
        pBest[index] = np.array([x,y])
    if f(gBest[0],gBest[1]) < fxy:
        gBest =np.array([x,y])
        indexBest = index
fxyRecord=np.append(fxyRecord,f(gBest[0],gBest[1]))

粒子速度位置更新

根据当前的V、当前的位置(present)、pBest、gBest以及公式计算出下一个V,记得限制V的大小,然后保存这个计算出来的V作为当前的V

根据计算出的V 计算出下一个位置,同样需要限制粒子位置的范围(如果粒子的某个维度如果超过了range,在这里我设置这个粒子的这个维度的位置为被超过的这个range的值,这里其实还有各种各样的方案,比如反弹什么的,这个可以加入很多自己的畅想),然后保存这个计算出来的位置作为当前的位置

for index in range(number_of_particles):
    present = particles[index]
    x = present[0]
    y = present[1]
    V = w*velocities[index] + c1*random.random()*(pBest[index]-present)+c2*random.random()*(gBest-present)

    # limit velocity
    if V[0]<v_max[0]*-1/2:
        V[0]=v_max[0]*-1/2
    elif V[0]>v_max[0]*1/2:
        V[0]=v_max[0]*1/2

    if V[1]<v_max[1]*-1/2:
        V[1]=v_max[1]*-1/2
    elif V[1]>v_max[1]*1/2:
        V[1]=v_max[1]*1/2
    velocities[index]=V
    
    particles[index]=present+V

    # limit coordinates
    if particles[index][0]<rangeParticle[0][0]:
        particles[index][0]=rangeParticle[0][0]
    elif particles[index][0]>rangeParticle[0][1]:
        particles[index][0]=rangeParticle[0][1]

    if particles[index][1]<rangeParticle[1][0]:
        particles[index][1]=rangeParticle[1][0]
    elif particles[index][1]>rangeParticle[1][1]:
        particles[index][1]=rangeParticle[1][1]

可视化

我通过绘制出粒子的位置以及迭代次数与fitness value对应的diagram来表现这个算法,使其相对直观一些,函数如下

def show(epoch):
    fig = plt.figure(figsize=(9,4))
    columns = 2
    rows = 1
    fig.add_subplot(rows, columns, 2)

    x_major_locator=plt.MultipleLocator(math.floor(epoch/10)+1)
    ax=plt.gca()
    ax.xaxis.set_major_locator(x_major_locator)
    plt.plot(fxyRecord)


    fig.add_subplot(rows, columns, 1)
    plt.xlim(np.array(gBest[0]+rangeParticle[0]/(epoch+1)))
    plt.ylim(np.array(gBest[1]+rangeParticle[1]/(epoch+1)))
    plt.scatter(particles.T[0],particles.T[1],s=10)
    plt.scatter(gBest[0],gBest[1],c='r',s=15)

尝试一下可视化

show(epoch)
epoch+=1
print(f"第{epoch}轮 极大值为:{f(gBest[0],gBest[1])} 对应粒子index:{indexBest} x:{gBest[0]} y:{gBest[1]}")

粒子群优化算法英文介绍,机器学习,数学建模,算法,人工智能,机器学习,数学建模

多运行几轮,逐一观察

粒子群优化算法英文介绍,机器学习,数学建模,算法,人工智能,机器学习,数学建模

粒子群优化算法英文介绍,机器学习,数学建模,算法,人工智能,机器学习,数学建模

粒子群优化算法英文介绍,机器学习,数学建模,算法,人工智能,机器学习,数学建模
粒子群优化算法英文介绍,机器学习,数学建模,算法,人工智能,机器学习,数学建模

粒子群优化算法英文介绍,机器学习,数学建模,算法,人工智能,机器学习,数学建模
粒子群优化算法英文介绍,机器学习,数学建模,算法,人工智能,机器学习,数学建模

可见该算法还是相对容易陷入局部最优的问题,最好还是结合其他算法,来避免这个问题。

经过多次实验可以得到以下结果

粒子群优化算法英文介绍,机器学习,数学建模,算法,人工智能,机器学习,数学建模文章来源地址https://www.toymoban.com/news/detail-601905.html

到了这里,关于Particle Swarm Optimization粒子群优化算法(PSO算法)概念及实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 粒子群优化算法(PSO)附代码

    粒子群优化算法(Particle Swarm Optimization,PSO)是一种经典的群智能算法,该算法灵感源自于鸟类飞行和觅食的社会活动,鸟群通过个体之间的信息交互来寻找全局最优点。PSO算法具有原理简单、较少的参数设置和容易实现等优点,因此近年来受到学者们的广泛关注和研究。 粒子

    2023年04月08日
    浏览(45)
  • 粒子群算法PSO优化LSTM超参数

    LSTM 航空乘客预测单步预测的两种情况。 简单运用LSTM 模型进行预测分析。 加入注意力机制的LSTM 对航空乘客预测采用了目前市面上比较流行的注意力机制,将两者进行结合预测。 多层 LSTM 对航空乘客预测 简单运用多层的LSTM 模型进行预测分析。 双向LSTM 对航空乘客预测双向

    2024年02月07日
    浏览(46)
  • 单目标应用:粒子群优化算法(PSO)求解微电网优化MATLAB

    微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 (1)部分代码 (2)部分结果

    2024年02月06日
    浏览(62)
  • 改进的沙猫群优化算法(Modified Sand Cat Swarm Optimization,MSCSO)(原文作者)

      沙猫群优化算法(Sand Cat Swarm Optimization, SCSO)的灵感受自然界中沙猫(沙丘猫)行为的启发。沙猫拥有检测低频噪声的能力,无论猎物在地面还是在地下,沙猫都能找到猎物。由于这一重要的特性,它可以快速地捕捉猎物。沙猫群优化算法模拟了沙猫的两个主要行为:搜寻猎物

    2024年02月07日
    浏览(66)
  • 智能优化算法之粒子群算法(PSO)的实现(Python附源码)

    粒子群算法(Particle Swarm Optimization,PSO)是于1995年被Kennedy等人提出的一种模拟自然界中鸟群进行觅食过程的一种群智能优化算法,该算法将待求解问题的每一个候选解视作鸟群中的每一个个体的具体位置信息,每个候选解对应的最优适应度值作为每个个体在该位置处所能搜

    2024年02月04日
    浏览(51)
  • Python实现PSO粒子群优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一种基于种群的随机优化技术,由Eberhart和Kennedy于1995年提出。粒子群算法模仿昆虫、

    2024年02月13日
    浏览(38)
  • Python实现PSO粒子群优化算法优化LightGBM分类模型(LGBMClassifier算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一种基于种群的随机优化技术,由Eberhart和Kennedy于1995年提出。粒子群算法模仿昆虫、

    2024年02月15日
    浏览(49)
  • 智能优化之粒子群算法(PSO)(Matlab,python,C++实现)

    一、算法简介 粒子群算法(Particle swarm optimization, PSO)是一种仿生算法,它是一种 在求解空间中寻找最优解 的简单算法。它与其他优化算法的不同之处在于,它只需要 目标函数,不依赖于目标的梯度或任何微分形式。它也有很少的超参数。 由Kennedy和Eberhart于1995年提出; 群体

    2024年02月16日
    浏览(56)
  • 粒子群算法PSO优化支持向量机(PSO-SVM)的数据回归预测 matlab代码

    %%  清空环境变量 warning off             % 关闭报警信息 close all               % 关闭开启的图窗 clear                   % 清空变量 clc                     % 清空命令行 tic %%  导入数据 P_train = xlsread(\\\'data\\\',\\\'training set\\\',\\\'B2:G191\\\')\\\'; T_train= xlsread(\\\'data\\\',\\\'training set\\\',\\\'H2:H191\\\')\\\';

    2024年02月02日
    浏览(52)
  • C# PSO 粒子群优化算法 遗传算法 随机算法 求解复杂方程的最大、最小值

    复杂方程可以自己定义,以下是看别人的题目,然后自己来做 以下是计算结果

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包