Python实现粒子群算法的示例

粒子群算法是一种基于鸟类觅食开发出来的优化算法,它是从随机解出发,通过迭代寻找最优解,通过适应度来评价解的品质。

PSO算法的搜索性能取决于其全局探索和局部细化的平衡,这在很大程度上依赖于算法的控制参数,包括粒子群初始化、惯性因子w、最大飞翔速度和加速常数与等。

PSO算法具有以下优点:

不依赖于问题信息,采用实数求解,算法通用性强。

需要调整的参数少,原理简单,容易实现,这是PSO算法的最大优点。

协同搜索,同时利用个体局部信息和群体全局信息指导搜索。

收敛速度快, 算法对计算机内存和CPU要求不高。

更容易飞越局部最优信息。对于目标函数仅能提供极少搜索最优值的信息,在其他算法无法辨别搜索方向的情况下,PSO算法的粒子具有飞越性的特点使其能够跨过搜索平面上信息严重不足的障碍,飞抵全局最优目标值。比如Generalized Rosenbrock函数全局最小值在原占附近.但是此函数全局最优值与可到达的局部最优值之间右一条独长的山路,曲面山谷中点的最速下降方向几乎与到函数最小值的最佳方向垂直,找到全局最小值的可能性微乎其微, 但是PSO算法完全有可能找到全局最优值。

同时, PSO算法的缺点也是显而易见的:

算法局部搜索能力较差,搜索精度不够高。

算法不能绝对保证搜索到全局最优解。

PSO算法设计的具体步骤如下:

  • 初始化粒子群(速度和位置)、惯性因子、加速常数、最大迭代次数、算法终止的最小允许误差。
  • 评价每个粒子的初始适应值。
  • 将初始适应值作为当前每个粒子的局部最优值,并将各适应值对应的位置作为每个粒子的局部最优值所在的位置。
  • 将最佳初始适应值作为当前全局最优值,并将最佳适应值对应的位置作为全局最优值所在的位置。
  • 依据公式更新每个粒子当前的飞翔速度。
  • 对每个粒子的飞翔速度进行限幅处理,使之不能超过设定的最大飞翔速度。
  • 依据公式更新每个粒子当前所在的位置。
  • 比较当前每个粒子的适应值是否比历史局部最优值好,如果好,则将当前粒子适应值作为粒子的局部最优值,其对应的位置作为每个粒子的局部最优值所在的位置。
  • 在当前群中找出全局最优值,并将当前全局最优值对应的位置作为粒子群的全局最优值所在的位置。
  • 重复步骤(5)~(9),直到满足设定的最小误差或最大迭代次数
  • 输出粒子群的全局最优值和其对应的位置以及每个粒子的局部最优值和其对应的位置。

本文中我们假设要求解一个维度为10的向量,这里的适应度函数采用简单的线性误差求和。

#基本粒子群算法
#vi+1 = w*vi+c1*r1*(pi-xi)+c2*r2*(pg-xi)  速度更新公式
#xi+1 = xi + a*vi+1  位置更新公式(一般a=1)
#w = wmax -(wmax-wmin)*iter/Iter 权重更新公式
#iter当前迭代次数 Iter最大迭代次数 c1、c2学习因子 r1、r2随机数 pi粒子当前最优位置 pg粒子群全局最优
#初始化 wmax=0.9 wmin=0.4 通常c1=c2=2 Iter对于小规模问题(10,20)对于大规模(100,200)
#算法优劣取决于w、c1和c2,迭代结束的条件是适应度函数的值符合具体问题的要求
#初始化粒子群,包括尺寸、速度和位置
#本算法假设想要的输出是长度为10的矩阵,y=[1.7]*10,适应度函数f(x)= |x-y| <=0.001符合要求

import numpy as np

swarmsize = 500
partlen = 10
wmax,wmin = 0.9,0.4
c1 = c2 = 2
Iter = 400

def getwgh(iter):
  w = wmax - (wmax-wmin)*iter/Iter
  return w

def getrange():
  randompv = (np.random.rand()-0.5)*2
  return randompv

def initswarm():
  vswarm,pswarm = np.zeros((swarmsize,partlen)),np.zeros((swarmsize,partlen))
  for i in range(swarmsize):
    for j in range(partlen):
      vswarm[i][j] = getrange()
      pswarm[i][j] = getrange()
  return vswarm,pswarm

def getfitness(pswarm):
  pbest = np.zeros(partlen)
  fitness = np.zeros(swarmsize)
  for i in range(partlen):
    pbest[i] = 1.7

  for i in range(swarmsize):
    yloss = pswarm[i] - pbest
    for j in range(partlen):
      fitness[i] += abs(yloss[j])
  return fitness

def getpgfit(fitness,pswarm):
  pgfitness = fitness.min()
  pg = pswarm[fitness.argmin()].copy()
  return pg,pgfitness

vswarm,pswarm = initswarm()
fitness = getfitness(pswarm)
pg,pgfit = getpgfit(fitness,pswarm)
pi,pifit = pswarm.copy(),fitness.copy()

for iter in range(Iter):
  if pgfit <= 0.001:
    break
  #更新速度和位置
  weight = getwgh(iter)
  for i in range(swarmsize):
    for j in range(partlen):
      vswarm[i][j] = weight*vswarm[i][j] + c1*np.random.rand()*(pi[i][j]-pswarm[i][j]) + c2*np.random.rand()*(pg[j]-pswarm[i][j])
      pswarm[i][j] = pswarm[i][j] + vswarm[i][j]
  #更新适应值
  fitness = getfitness(pswarm)
  #更新全局最优粒子
  pg,pgfit = getpgfit(fitness,pswarm)
  #更新局部最优粒子
  for i in range(swarmsize):
    if fitness[i] < pifit[i]:
      pifit[i] = fitness[i].copy()
      pi[i] = pswarm[i].copy()

for j in range(swarmsize):
  if pifit[j] < pgfit:
    pgfit = pifit[j].copy()
    pg = pi[j].copy()
print(pg)
print(pgfit)

下面的结果分别是迭代300次和400次的结果。

可以看到400次迭代虽然适应度没有达到预期,得到的向量已经很接近期望的结果了。

写在最后:粒子群算法最重要的参数就是惯性权重和学习因子,针对这两个参数有了新的优化粒子群算法(IPSO)。还有初始化粒子群时速度和位置范围的确定,包括种群的大小和迭代次数的选择,这些都是‘摸着石头过河',没有标准答案。

以上就是Python实现粒子群算法的示例的详细内容,更多关于Python 粒子群算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • python3实现单目标粒子群算法

    本文实例为大家分享了python3单目标粒子群算法的具体代码,供大家参考,具体内容如下 关于PSO的基本知识......就说一下算法流程 1) 初始化粒子群: 随机设置各粒子的位置和速度,默认粒子的初始位置为粒子最优位置,并根据所有粒子最优位置,选取群体最优位置. 2) 判断是否达到迭代次数: 若没有达到,则跳转到步骤3).否则,直接输出结果. 3) 更新所有粒子的位置和速度: 4) 计算各粒子的适应度值. 将粒子当前位置的适应度值与粒子最优位置的适应度值进行比较,决定是否更新粒子最优位置:将所

  • python实现粒子群算法

    粒子群算法 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,CAS中的成员称为主体.比如研究鸟群系统,每个鸟在这个系统中就称为主体.主体有适应性,它能够与环境及其他的主体进行交流,并且根据交流的过程"学习"或"积累经验"改变自身结构与行为.整个系统的演变或进化包括:新层次的产生(小鸟的出生):分化和多样性的出现(鸟群中的鸟分成许多小的群):新的主题的出现(鸟寻找食物过程中,不断发现新的食物). P

  • Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位置).最好的策略就是结合自己的经验在距离鸟群中距离食物最近的区域搜索. 利用粒子群算法解决实际问题本质上就是利用粒子群算法求解函数的最值.因此需要事先把实际问题抽象为一个数学函数,称之为适应度函数.在粒子群算法中,每只鸟都可以看成是问题的一个解,这里我们通常把鸟称之为粒子,每个粒子都拥有: 位置,可

  • Python实现粒子群算法的示例

    粒子群算法是一种基于鸟类觅食开发出来的优化算法,它是从随机解出发,通过迭代寻找最优解,通过适应度来评价解的品质. PSO算法的搜索性能取决于其全局探索和局部细化的平衡,这在很大程度上依赖于算法的控制参数,包括粒子群初始化.惯性因子w.最大飞翔速度和加速常数与等. PSO算法具有以下优点: 不依赖于问题信息,采用实数求解,算法通用性强. 需要调整的参数少,原理简单,容易实现,这是PSO算法的最大优点. 协同搜索,同时利用个体局部信息和群体全局信息指导搜索. 收敛速度快, 算法对计算机内存和CPU要

  • Python实现鸡群算法的示例代码

    目录 算法简介 Python实现鸡和鸡群 鸡群更新 优化迭代 测试 算法简介 鸡群算法,缩写为CSO(Chicken Swarm Optimization),尽管具备所谓仿生学的背景,但实质上是粒子群算法的一个变体. 简单来说,粒子群就是一群粒子,每个粒子都有自己的位置和速度,而且每个粒子都要受到最佳粒子的吸引,除了这两条规则之外,粒子之间完全平等,彼此之间除了位置和速度之外,完全相等. 当然,粒子群算法本身也是有仿生学背景的,据说灵感来自于鸟群觅食,这个当然不重要,无非是一群平等的粒子变成了一

  • Python代码实现粒子群算法图文详解

    目录 1.引言 2.算法的具体描述: 2.1原理 2.2标准粒子群算法流程 3.代码案例 3.1问题 3.2绘图 3.3计算适应度 3.4更新速度 3.5更新粒子位置 3.6主要算法过程 结果 总结 1.引言 粒子群优化算法起源于对鸟群觅食活动的分析.鸟群在觅食的时候通常会毫无征兆的聚拢,分散,以及改变飞行的轨迹,但是在不同个体之间会十分默契的保持距离.所以粒子群优化算法模拟鸟类觅食的过程,将待求解问题的搜索空间看作是鸟类飞行的空间,将每只鸟抽象成一个没有质量和大小的粒子,用这个粒子来表示待求解

  • Python实现蚁群算法

    目录 1.引言 2蚁群算法理论 3算法理论图解 4人工蚁群优化过程 5 基本蚁群算法及其流程 5.1  蚁群算法公式 5.2蚁群算法程序概括 5.3流程图 6案例实现 6.1案例1 6.2Python实现 6.3结果 6.4案例2 6.5Python实现 6.6结果 1.引言 在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的群体行为进行模拟,进而提出了群智能算法.其中,模拟蚁群觅食过程的蚁群优化算法(Ant Colony Optimization,

  • python manim实现排序算法动画示例

    目录 什么是 manim 冒泡排序介绍 算法步骤 初始化元素 代码说明 元素交换动画 实现代码 什么是 manim Manim 是一个用于精确编程动画的引擎,专为创建解释性数学视频而设计. 注意,有两个主要版本的 manim.该存储库最初是 3Blue1Brown 的作者的个人项目,目的是为这些视频制作动画,此处提供了视频专用代码.2020 年,一群开发人员将其分叉成现在的社区版,目标是更稳定.更好地测试.更快地响应社区贡献,以及更友好地开始使用. 主要版本如下: 3b1b/manim [最新版

  • python实现经典排序算法的示例代码

    以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想. 冒泡排序 内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后会将次大的元素移到最大元素的左边,每次内层循环结束都会将一个元素排好序. def bubble_sort(arr): length = len(arr) for i in range(length): for j in range(length - i - 1): if arr[j] > arr[j

  • Python实现七大查找算法的示例代码

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素.     查找表(Search Table):由同一类型的数据元素构成的集合     关键字(Key):数据元素中某个数据项的值,又称为键值     主键(Primary Key):可唯一的标识某个数据元素或记录的关键字 查找表按照操作方式可分为:         1.静态查找表(Static Search Table):只做查找操作的查找表.它的主要操作是:         ①

随机推荐