当前位置: 首页 > article >正文

人工智能算法之粒子群优化算法

人工智能算法之粒子群优化算法

在这里插入图片描述

粒子群优化算法(PSO)是一种群体智能优化算法,由Kennedy和Eberhart在1995年提出,灵感来源于鸟群、鱼群等生物群体行为。PSO通过群体中个体的交互及对周围环境的感知,快速找到最优解。PSO算法广泛应用于函数优化、机器学习、神经网络训练等多个领域,具有实现简单、参数少、收敛速度快等优点。

粒子群优化算法的基本原理

PSO算法的核心思想是通过群体协作和共享信息,找到问题的最优解。在PSO算法中,每个个体称为“粒子”,每个粒子代表一个潜在的解。粒子在搜索空间中移动,并通过迭代更新其速度和位置来寻找最优解。在迭代过程中,每个粒子根据其个体最佳位置全局最佳位置来调整其速度和位置,从而不断逼近最优解。

在PSO算法中,每个粒子具有以下属性:

  1. 位置 xi :粒子在搜索空间中的当前位置,表示一个潜在解。
  2. 速度 vi :粒子的移动速度,决定粒子的位置更新方向和步长。
  3. 个体最佳位置 pi :粒子自身历史搜索中找到的最佳位置。
  4. 全局最佳位置 g :整个粒子群体中找到的最佳位置。

粒子的位置和速度会根据以下公式进行更新:

  1. 速度更新公式
    在这里插入图片描述

    其中:

在这里插入图片描述

  • 为粒子 i 在第 k+1 次迭代时的速度;
  • w 为惯性权重,用于平衡粒子的探索能力和开发能力;
  • c1 和 c2 为学习因子,控制粒子追随个体最佳位置和全局最佳位置的程度;
  • r1 和 r2 为[0, 1]的随机数,增加随机性;
  • pi 表示粒子 i 的个体最佳位置;
  • g 表示全局最佳位置;
  • 为粒子 i 在第 k 次迭代的位置。

在这里插入图片描述

  1. 位置更新公式
    在这里插入图片描述

    其中 在这里插入图片描述
    为粒子 i 在第 k+1 次迭代的位置。

PSO算法的参数

  • 惯性权重 ( w ):决定粒子当前速度的影响程度。较大的 w 值有助于探索搜索空间,较小的 w 值有助于开发局部区域。
  • **学习因子 c1 和 c2 **:分别控制粒子向自身最佳位置和全局最佳位置靠拢的力度。
  • 粒子数量:粒子的数量越多,算法的全局搜索能力越强,但计算量也会增大。

粒子群优化算法的伪代码

  1. 初始化粒子群的每个粒子位置和速度。
  2. 计算每个粒子的适应度值。
  3. 更新每个粒子的个体最佳位置和全局最佳位置。
  4. 更新粒子的速度和位置。
  5. 如果满足终止条件(如达到最大迭代次数),则结束;否则,返回步骤2继续迭代。

粒子群优化算法的Python实现

以下代码演示了PSO算法在二维函数上的优化过程,目标是找到函数的最小值。我们选择优化一个简单的Rosenbrock函数:

在这里插入图片描述

Rosenbrock函数常用作算法测试函数,函数的最小值为0,位于点( (a, a^2) )。

Python代码实现
import numpy as np

# 定义Rosenbrock函数
def rosenbrock(x, y, a=1, b=100):
    return (a - x) ** 2 + b * (y - x ** 2) ** 2

# 粒子类
class Particle:
    def __init__(self, bounds):
        self.position = np.array([np.random.uniform(bounds[0][0], bounds[0][1]),
                                  np.random.uniform(bounds[1][0], bounds[1][1])])
        self.velocity = np.array([np.random.uniform(-1, 1), np.random.uniform(-1, 1)])
        self.best_position = self.position.copy()
        self.best_score = float('inf')

    def update_velocity(self, global_best_position, w, c1, c2):
        r1, r2 = np.random.rand(), np.random.rand()
        cognitive_component = c1 * r1 * (self.best_position - self.position)
        social_component = c2 * r2 * (global_best_position - self.position)
        self.velocity = w * self.velocity + cognitive_component + social_component

    def update_position(self, bounds):
        self.position += self.velocity
        # 保持在边界范围内
        self.position = np.clip(self.position, [bounds[0][0], bounds[1][0]], [bounds[0][1], bounds[1][1]])

# 粒子群优化算法
def pso(func, bounds, num_particles, max_iter, w=0.5, c1=2, c2=2):
    # 初始化粒子群
    particles = [Particle(bounds) for _ in range(num_particles)]
    global_best_position = np.array([0.0, 0.0])
    global_best_score = float('inf')
    
    for iteration in range(max_iter):
        for particle in particles:
            # 计算适应度值
            score = func(particle.position[0], particle.position[1])
            # 更新个体最佳
            if score < particle.best_score:
                particle.best_score = score
                particle.best_position = particle.position.copy()
            # 更新全局最佳
            if score < global_best_score:
                global_best_score = score
                global_best_position = particle.position.copy()
        
        # 更新粒子的速度和位置
        for particle in particles:
            particle.update_velocity(global_best_position, w, c1, c2)
            particle.update_position(bounds)
        
        # 输出当前迭代的全局最佳值
        print(f"Iteration {iteration+1}: Best score = {global_best_score}, Best position = {global_best_position}")
    
    return global_best_position, global_best_score

# 参数设置
bounds = [(-5, 5), (-5, 5)]  # 搜索空间范围
num_particles = 30           # 粒子数量
max_iter = 100               # 最大迭代次数

# 执行PSO算法
best_position, best_score = pso(rosenbrock, bounds, num_particles, max_iter)
print(f"Global best position: {best_position}, Global best score: {best_score}")

代码解读

  1. 粒子类Particle 类表示一个粒子,包括位置、速度、个体最佳位置和个体最佳得分等属性。粒子可以通过update_velocity方法更新速度,通过update_position方法更新位置。

  2. 适应度计算:粒子的位置在每次迭代中会被用来计算目标函数的值,并比较以找到更优解。

  3. 个体最佳与全局最佳更新:在每次迭代中,每个粒子都会更新自身的个体最佳位置,而整个种群的全局最佳位置也会相应更新。

  4. 速度和位置更新:根据粒子自身的个体最佳位置和全局最佳位置,使用惯性权重、学习因子和随机数更新粒子的速度,接着更新位置并限制其在边界范围内。

  5. 输出结果:代码输出每次迭代的最佳分数和位置,最终返回整个种群的全局最佳位置和分数。

参数对PSO算法的影响

  1. 惯性权重 ( w ):较大的 w 值鼓励粒子在搜索空间中进行广泛搜索,较小的 w 值有助于集中搜索。

  2. **学习因子 c1 和 c2 **:分别表示粒子

对个体最佳位置和全局最佳位置的追随程度。增大 c1 有利于个体开发,而增大 c2 则有利于全局搜索。

  1. 粒子数量:较多的粒子会提高算法的搜索能力,但也会增加计算成本。

在这里插入图片描述


http://www.kler.cn/a/372804.html

相关文章:

  • Java集合常见面试题总结(5)
  • JavaScript中this的指向和改变this指向的方法 - 2024最新版前端秋招面试短期突击面试题【100道】
  • Spring Boot集成iText实现电子签章
  • 中欧科学家论坛暨第六届人工智能与先进制造国际会议(AIAM 2024)在德国法兰克福成功举办,两百余名中外科学家共襄盛举
  • C语言之环形缓冲区概述及实现
  • HCIP--2 TCP有关笔记
  • Yii2 init 初始化脚本分析
  • 无人机遗传算法详解!
  • Virtual Private Network (VPN) Lab
  • 在MacOS玩RPG游戏 - RPGViewerPlus
  • 【论文笔记】xGen-MM (BLIP-3): A Family of Open Large Multimodal Models
  • 【Android】Kotlin教程(5)
  • react基础之redux快速上手环境准备
  • 【Docker知识】Docker进阶-容器镜像深度解读
  • SQL 高级技巧
  • BERT的中文问答系统23
  • 使用Virtual Audio Cable捕获系统音频输出并使用Python处理
  • pc电脑屏幕分辨率尺寸
  • MetaArena推出《Final Glory》:引领Web3游戏技术新风向
  • Flutter鸿蒙next 封装对话框详解
  • 实现链式结构的二叉树
  • C++ 之 VS2010 和MySQL数据库的链接问题
  • 【K8S系列】Kubernetes 中 Service 无法访问及解决方案【已解决】
  • 单片机如何入门?
  • Android adb命令获取设备id
  • CentOS 9 Stream 上安装 Visual Studio Code