📜  粒子群优化 (PSO) – 概述

📅  最后修改于: 2022-05-13 01:58:08.376000             🧑  作者: Mango

粒子群优化 (PSO) – 概述

在考虑尽可能低的成本的同时,为给定系统的特定参数找到最佳值以满足所有设计要求的过程称为优化。优化问题可以在所有科学领域中找到。

传统的优化算法(确定性算法)有一些局限性,例如:

  • 单一解决方案
  • 收敛到局部最优
  • 未知的搜索空间问题

为了克服这些限制,许多学者和研究人员开发了几种元启发式方法来解决复杂/未解决的优化问题。示例:粒子群优化、灰狼优化、蚁群优化、遗传算法、布谷鸟搜索算法等。

粒子群优化 (PSO) 简介一文解释了随机优化算法的基础知识,并解释了粒子群优化 (PSO) 背后的直觉。本文旨在深入研究粒子群优化 (PSO)。

算法的灵感

粒子群优化 (PSO) 是一种强大的元启发式优化算法,其灵感来自自然界中观察到的群行为,例如鱼类和鸟类的训练。 PSO 是对简化社会系统的模拟。 PSO 算法的初衷是以图形方式模拟鸟群优雅但不可预测的编舞。



在自然界中,鸟类的任何可观察范围都被限制在某个范围内。然而,拥有不止一只鸟可以让群中的所有鸟都知道适应度函数的更大表面。

让我们用数学建模,上述原理使群找到适应度函数的全局最小值

数学模型

  • 粒子群优化中的每个粒子都有一个相关的位置、速度、适应度值。
  • 每个粒子跟踪particle_bestFitness_valueparticle_bestFitness_position。
  • 维护 global_bestFitness_position 和 global_bestFitness_value 的记录。

图 1:存储 Swarm 种群的数据结构

图 2:存储 Swarm 第 i 个粒子的数据结构

算法

问题参数:

  • 维数 (d)
  • 下限 (minx)
  • 上限 (maxx)

算法的超参数:

  • 粒子数(N)
  • 最大迭代次数 (max_iter)
  • 惯性 (w)
  • 粒子的认知(C1)
  • 群体的社会影响(C2)

算法:  

Step1: Randomly initialize Swarm population of N particles Xi ( i=1, 2, …, n)
Step2: Select hyperparameter values
           w, c1 and c2
Step 3: For Iter in range(max_iter):  # loop max_iter times  
            For i in range(N):  # for each particle:
               a. Compute new velocity of ith particle
                    swarm[i].velocity = 
                         w*swarm[i].velocity + 
                         r1*c1*(swarm[i].bestPos - swarm[i].position) +
                         r2*c2*( best_pos_swarm - swarm[i].position) 
               b. If velocity is not in range [minx, max] then clip it
                    if swarm[i].velocity < minx:
                        swarm[i].velocity = minx
                    elif swarm[i].velocity[k] > maxx:
                        swarm[i].velocity[k] = maxx
               c. Compute new position of ith particle using its new velocity
                    swarm[i].position += swarm[i].velocity
               d. Update new best of this particle and new best of Swarm
                     if swarm[i].fitness < swarm[i].bestFitness:
                        swarm[i].bestFitness = swarm[i].fitness
                        swarm[i].bestPos = swarm[i].position

                     if swarm[i].fitness < best_fitness_swarm
                        best_fitness_swarm = swarm[i].fitness
                        best_pos_swarm = swarm[i].position
             End-for
         End -for
Step 4: Return best particle of Swarm