首页 > 编程语言 >智能算法(一)——基本粒子群算法

智能算法(一)——基本粒子群算法

时间:2024-07-16 17:01:44浏览次数:10  
标签:粒子 particle 基本粒子 self 算法 position 智能算法 best

基本粒子群算法原理

1. 算法概述

粒子群算法通过模拟一群粒子(代表潜在的解)在解空间中的运动来寻找最优解。每个粒子都具有两个关键属性:速度和位置,其中速度是矢量,包括速度大小和方向,位置表示粒子当前所在的坐标。粒子群算法通过不断迭代更新粒子的速度和位置,逐步逼近最优解。

2. 算法步骤

粒子群算法的基本步骤可以归纳如下:
1.初始化粒子群:根据问题的维度和约束条件,随机初始化粒子的位置和速度。其中位置表示解向量,速度表示方向和速度。
2.计算粒子适应度:根据问题的定义,计算每个粒子的适应度。适应度函数根据问题的不同而变化,可以是目标函数的取值或其他综合评价指标。
3.更新粒子速度和位置:通过利用粒子当前的位置、速度和历史最优解来更新粒子的速度和位置。速度的更新过程包括加速度项和惯性项两部分,其中加速度项的大小与粒子所处位置与个体最优解、群体最优解的距离有关,惯性项保持原有的速度方向并控制其范围。位置的更新则通过当前位置和速度得到新的位置。
4.更新个体最优解和群体最优解:将每个粒子的适应度与其历史最优解进行比较并更新。个体最优解是粒子自身找到的最优解,群体最优解是所有粒子中的最优解。
5.判断停止条件:根据预定的停止条件判断是否终止算法。停止条件可以是达到最大迭代次数、适应度值达到一定阈值或范围满足一定条件等。
6.返回最优解:将群体最优解或个体最优解作为最终结果返回。

3. 算法特点

简单易实现:粒子群算法原理简单,实现起来相对容易,适合解决多维、高维的优化问题。
鲁棒性强:粒子群算法对初始解和参数设置不敏感,具有较强的鲁棒性。
高效性:粒子群算法能够快速地找到接近最优解的区域,避免了陷入局部最优解的问题。

4. 参数优化

粒子群算法的性能受到多个参数的影响,如惯性权重w、个体认知因子c1和群体认知因子c2等。通过调整这些参数,可以平衡算法的全局搜索能力和局部搜索能力,从而提高算法的寻优精度和效率。

5. 改进与优化

为了进一步提高粒子群算法的性能,研究者们提出了多种改进和优化策略,如动态惯性权重、随机惯性权重、社会认知机制、认知模型等。这些策略通过引入新的机制或调整算法参数,增强了算法的全局搜索能力、局部搜索能力或探索能力。

6. 应用领域

粒子群算法广泛应用于多维、高维函数的优化问题,如神经网络训练、函数逼近等。同时,在组合优化问题、机器学习领域以及控制工程领域等也有广泛的应用。

综上所述,基本粒子群算法通过模拟生物群体的行为规律,利用粒子间的信息共享和协作机制来寻找最优解。其简单易实现、鲁棒性强和高效性的特点使得该算法在多个领域得到了广泛的应用和发展。

7.举例

下面是一个使用粒子群优化(PSO)算法来解决Rosenbrock函数最小化问题的Python示例代码。此外,我还将包括一个使用matplotlib库来绘制每次迭代后找到的最佳解(即最小函数值)的图形。

1)Rosenbrock函数

Rosenbrock函数是一个非凸函数,通常用于测试优化算法的性能,因为它在全局最小值附近有一个平坦的区域,这使得算法难以收敛到全局最小值。

Rosenbrock函数是一个用于测试优化算法性能的非凸函数,其定义如下:
请添加图片描述
其中,最常见的参数设置为 a=1 和 b=100,但其他值也可以用于测试不同的搜索难度。在这个定义中,x 和 y 是二维空间中的坐标,函数 f(x,y) 返回一个标量值,表示在该点的函数值。

Rosenbrock函数的全局最小值位于 x=1,y=1,此时 f(1,1)=0。然而,由于函数在全局最小值附近有一个平坦的、狭长的、抛物线形的山谷,这使得算法很难收敛到全局最小值,尤其是当使用基于梯度的优化方法时。

Rosenbrock函数图像为:
请添加图片描述

2.基本粒子群算法寻找最优值代码

import numpy as np
import matplotlib.pyplot as plt

# Rosenbrock函数
def rosenbrock(x):
    return np.sum(100.0 * (x[1:] - x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0)

class Particle:
    def __init__(self, bounds, dim):
        self.position = np.random.uniform(bounds[:, 0], bounds[:, 1], dim)
        self.velocity = np.zeros(dim)
        self.best_position = self.position.copy()
        self.best_value = float('inf')

class ParticleSwarmOptimizer:
    def __init__(self, num_particles, bounds, dim, w=0.5, c1=1.0, c2=2.0):
        self.num_particles = num_particles
        self.bounds = bounds
        self.dim = dim
        self.w = w  # 惯性权重
        self.c1 = c1  # 自我认知系数
        self.c2 = c2  # 社会认知系数
        self.particles = [Particle(bounds, dim) for _ in range(num_particles)]
        self.global_best_value = float('inf')
        self.global_best_position = np.zeros(dim)

    def update_particles(self):
        for particle in self.particles:
            # 计算当前位置的适应度
            fitness = rosenbrock(particle.position)

            # 更新粒子的个体最佳位置
            if fitness < particle.best_value:
                particle.best_value = fitness
                particle.best_position = particle.position.copy()

                # 更新全局最佳位置
            if fitness < self.global_best_value:
                self.global_best_value = fitness
                self.global_best_position = particle.position.copy()

                # 更新速度和位置
            r1, r2 = np.random.rand(), np.random.rand()
            cognitive_component = self.c1 * r1 * (particle.best_position - particle.position)
            social_component = self.c2 * r2 * (self.global_best_position - particle.position)
            particle.velocity = self.w * particle.velocity + cognitive_component + social_component
            particle.position += particle.velocity

            # 确保粒子不超出边界
            particle.position = np.clip(particle.position, self.bounds[:, 0], self.bounds[:, 1])

    def optimize(self, num_iterations):
        best_values = []
        for _ in range(num_iterations):
            self.update_particles()
            best_values.append(self.global_best_value)
        return best_values

    # 设置PSO参数
num_particles = 30
bounds = np.array([[-2.0, 2.0], [-2.0, 2.0]])  # 假设我们在二维空间内搜索
dim = bounds.shape[0]

# 创建PSO对象
pso = ParticleSwarmOptimizer(num_particles, bounds, dim)

# 执行优化
best_values = pso.optimize(100)

# 绘制结果
plt.plot(best_values)
plt.xlabel('Iteration')
plt.ylabel('Best Value (Rosenbrock Function)')
plt.title('Particle Swarm Optimization on Rosenbrock Function')
plt.grid(True)
plt.show()

在这个示例中,我定义了一个Particle类来表示粒子群中的每个粒子,以及一个ParticleSwarmOptimizer类来管理整个粒子群和优化过程。rosenbrock函数是我们要最小化的目标函数。

在ParticleSwarmOptimizer类中,我实现了PSO算法的核心逻辑,包括粒子的初始化、速度和位置的更新、以及个体和全局最佳位置的更新。我还添加了一个边界检查机制,以确保粒子不会超出搜索空间的边界。

最后,我使用matplotlib库绘制了随着迭代次数

3.代码运行的结果:

请添加图片描述

标签:粒子,particle,基本粒子,self,算法,position,智能算法,best
From: https://blog.csdn.net/j_jiajia/article/details/140459230

相关文章

  • 「代码随想录算法训练营」第十二天 | 二叉树 part2
    226.翻转二叉树题目链接:https://leetcode.cn/problems/invert-binary-tree/题目难度:简单文章讲解:https://programmercarl.com/0226.翻转二叉树.html视频讲解:https://www.bilibili.com/video/BV1sP4y1f7q7题目状态:通过个人思路:类似二叉树的层序遍历的变形,创建一个队列,先......
  • 【人工智能】高级搜索技术(模拟退火搜索算法和遗传算法解决旅行商问题)
    目录一、旅行商问题1.需求分析2.数据结构、功能模块设计与说明2.1数据结构(1)模拟退火搜索算法(2)遗传算法2.2功能模块设计(1)模拟退火搜索算法(2)遗传算法3.核心代码与测试结果说明(1)模拟退火搜索算法(2)遗传算法4.心得体会一、旅行商问题现有一个商人,准备从广州......
  • 数据结构和算法——3.列表(List)
    列表(List)线性表的定义➢线性表:简称表,是n(n≥0)个具有相同类型的数据元素的有限序列➢线性表的长度:线性表中数据元素的个数➢空表:长度等于零的线性表,记为:......
  • 【贪心算法】力扣1833.雪糕的最大数量
    夏日炎炎,小男孩Tony想买一些雪糕消消暑。商店中新到n支雪糕,用长度为n的数组costs表示雪糕的定价,其中costs[i]表示第i支雪糕的现金价格。Tony一共有coins现金可以用于消费,他想要买尽可能多的雪糕。注意:Tony可以按任意顺序购买雪糕。给你价格数组costs和......
  • 路径规划 | 基于DQN深度强化学习算法的路径规划(Matlab)
    目录效果一览基本介绍程序设计参考文献效果一览基本介绍DQN路径规划算法基于深度强化学习算法的路径规划matlab2023b栅格环境,走迷宫,可以通过窗口界面方便观察交互过程,代码注释详尽。程序设计完整源码和数据私信博主回复基于DQN深度强化学习算法的路径规划(Ma......
  • 代码随想录算法训练营第23天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树
    代码随想录算法训练营第22天|669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树修剪二叉搜索树:https://leetcode.cn/problems/trim-a-binary-search-tree/description/代码随想录:https://programmercarl.com/0669.修剪二叉搜索树.html#......
  • 从前端程序员到大模型算法岗的华丽转身
    在当今科技飞速发展的时代,前端程序员们正面临着前所未有的机遇与挑战。随着人工智能技术的崛起,大模型算法岗逐渐成为前端程序员们转型的新选择。本文将探讨从前端程序员转行大模型算法岗的机遇与挑战,以及如何顺利实现这一华丽转身。机遇:技术升级:大模型算法岗涉及机器学习......
  • 数据结构和算法--2.算法复杂度
    算法复杂度算法分析➢同一算法用不同语言实现,用不同编译器,或是在不同计算机上运行,效率均不同➢使用绝对时间衡量算法效率不合适➢基本操作重复执行的次数作为算法的时间度量判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)的阶数算法......
  • 助力智慧交通,基于YOLO家族最新端到端实时目标检测算法YOLOv10全系列【n/s/m/b/l/x】参
    交通标志检测是交通标志识别系统中的一项重要任务。与其他国家的交通标志相比,中国的交通标志有其独特的特点。卷积神经网络(CNN)在计算机视觉任务中取得了突破性进展,在交通标志分类方面取得了巨大的成功。CCTSDB数据集是由长沙理工大学的相关学者及团队制作而成的,其有交通标志样......
  • 排序算法
    排序算法sort.h#pragmaonce#include<iostream>#include<vector>usingnamespacestd;voidBubbleSortPositive(std::vector<int>&nums);voidinsertSortPositive(vector<int>&array);voidSelectionSort(vector<int>&......