粒子群算法(Particle Swarm Optimization)

2024-05-14 02:52

本文主要是介绍粒子群算法(Particle Swarm Optimization),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

算法背景

粒子群优化算法(Particle Swarm Optimization,PSO)的灵感来源于鸟群或鱼群的觅食行为。想象一下,你在公园里看到一群鸟,它们在空中飞翔,寻找食物。每只鸟都不知道食物在哪里,但它们会根据周围其他鸟的位置和过去自己找到食物的经验来调整自己的飞行方向。如果一只鸟发现了食物,其他鸟很快也会朝着这个方向飞去。在这个过程中,整个鸟群像一个搜索系统,通过个体间的信息共享,找到最佳的觅食地点。

这个觅食的过程非常像一个优化问题:每只鸟(粒子)都在寻找食物(最优解),它们根据自己和同伴的经验(位置信息),在整个空间(搜索空间)中移动,最终找到食物的位置(最优解的位置)。

有读者可以感觉粒子群算法与麻雀算法有些相似。粒子群算法(PSO)和麻雀搜索算法(SSA)都是受自然界中群体行为启发的优化算法,它们都模仿了生物群体的社会行为来寻找最优解。然而,PSO是基于鸟群的觅食行为,而SSA则是模仿了麻雀的觅食和警戒行为,两者在模拟策略和行为细节上有所不同。

算法应用

粒子群优化算法(PSO)是一种非常灵活和多用途的优化算法,它在许多领域都有广泛的应用。以下是一些主要的应用场景:

  1. 工程优化:在工程领域,PSO常被用于设计优化、结构优化、电力系统优化等。比如,可以用它来优化建筑的结构设计,使其在成本和稳定性之间达到最佳平衡。
  2. 机器学习和数据挖掘:在机器学习中,PSO可以用于选择最佳的特征组合、调整算法的参数,甚至是用于训练神经网络。
  3. 网络和计算机科学:在网络设计、路由优化、云计算资源分配等领域,PSO也显示出了其有效性。比如,它可以用于优化网络中的数据流,确保信息快速且准确地传输。
  4. 经济学和金融:在金融市场分析、投资组合优化等方面,PSO也被广泛应用。它可以帮助投资者决定在何处投资,以及如何分配他们的资产,以获得最大的收益。
  5. 生物医学应用:在生物医学领域,PSO被用于生物信息学、药物设计和医疗影像分析等方面,帮助研究人员解决复杂的生物医学问题。

算法计算流程

粒子群优化算法 (PSO) 的计算流程可以详细分为以下几个步骤:
1. 初始化粒子群:
– 随机生成一组粒子 (解的候选者),每个粒子代表搜索空间中的一个潜在解。
– 为每个粒子指定一个随机的位置 (即解的值) 和速度。
2. 评估粒子的适应度:
– 对每个粒子的当前位置进行评估,根据优化问题的目标函数计算其适应度(如何接近最优解)。

3. 更新速度和位置:
– 对于每个粒子,根据下面的公式更新其速度:

标准的粒子群速度更新公式如下:

v_i^\mathrm{new~}=w\cdot v_i^\mathrm{old~}+c_1\cdot rand_1\cdot\left(\mathrm{~pbest~}_i-x_i^\mathrm{old~}\right)+c_2\cdot rand_2\cdot\left(g\mathrm{~best~}-x_i^\mathrm{old~}\right)

其中:
– v_{i}^{new} 是粒子 i 在新的迭代中的速度。
– w是惯性权重,用于控制前一速度对当前速度的影响。
v_{i}^{\mathrm{old}}是粒子 i 在前一迭代中的速度。
– c_{1} 和 c_{2} 是加速常数,用于调整个体和社会学习行为的相对影响。
– rand_{1}和  rand_{2}是两个介于 0 和 1 之间的随机数。
pbset_{i}是粒子 i 到目前为止找到的最优位置。
– gbest 是整个群体到目前为止找到的最优位置。
x_{i}^{old} 是粒子 i 在前一迭代中的位置。
– 更新粒子的位置:

x_i^\text{new }=x_i^\text{old }+v_i^\text{new}

4. 更新个体和全局最优解:
– 对于每个粒子,如果当前位置比之前遇到的最佳位置更优,则更新其个体最优解 (pbest)。
– 同时,从所有粒子中找出具有最佳适应度的位置,更新为全局最优解 (gbest)。

5. 迭代和终止条件:
– 重复步骤2-4,直到满足终止条件(如达到最大迭代次数或解的质量达到预定阈值) 。
6. 输出结果:
– 算法结束时,全局最优解 gbest 即为找到的最优解。

注意,粒子群优化算法 (PSO) 中的速度更新公式设计得非常巧妙,它反映了算法的核心思想: 通过模拟鸟群的社会行为来指导搜索过程。公式的设计考虑了以下几个关键因素:
1. 惯性权重 w :
– 这部分表示粒子的当前速度对其未来速度的影响,即粒子的惯性。较大的惯性权重有助于粒子探索更远的区域,促进全局搜索;较小的权重有利于粒子在局部区域进行详细搜索,促进局部优化。
2. 个体经验 c_1\cdot rand_1\cdot\left(\mathrm{~pbest~}_i-x_i^\mathrm{old~}\right) :
– 这部分反映了粒子自身的历史最佳位置 (个体经验) 对其速度的影响。粒子会考虑自己之前找到的最优位置(pbest),并朝这个方向调整速度。这里的随机数 rand 1 保证了搜索的随机性和多样性。
3. 社会经验c_2\cdot rand_2\cdot\left(g\mathrm{~best~}-x_i^\mathrm{old~}\right) :
– 这部分考虑了群体中其他粒子的信息。每个粒子也会朝着当前群体中已知的最优位置 (gbest) 移动。这里的随机数 rand 2 同样增加了搜索的随机性和多样性。
4. 学习因子 c1 和 c2 :
– 这两个学习因子分别表示个体经验和社会经验对速度更新的影响程度。这些因子的值决定了算法是倾向于利用个体的过去经验还是群体的共同经验。

总的来说,速度更新公式通过结合个体历史信息和群体共享信息,以及通过引入随机因素来增加搜索的多样性,从而有效地指导粒子群体在解空间中的搜索行为,这既保证了全局搜索能力,又保留了局部搜索的细致性。通过调整公式中的参数,可以控制算法的探索和开发能力,使其适应不同类型的优化问题。

算法示例推导

上述函数求解的python代码实现如下:

import numpy as np
import matplotlib.pyplot as plt
# 粒子群优化算法(PSO)求解 f(x, y) = x^2 + y^2
# 目标函数
def objective_function(position):x, y = positionreturn x**2 + y**2
# 参数设置
n_particles = 50
n_iterations = 10
dim = 2  # 搜索空间的维度,这里是二维空间
w = 0.5  # 惯性权重
c1 = 0.8  # 个体学习因子
c2 = 0.9  # 社会学习因子
# 初始化粒子群
particle_position = np.random.rand(n_particles, dim) * 10 - 5  # 初始位置
particle_velocity = np.random.rand(n_particles, dim) * 2 - 1  # 初始速度
pbest_position = particle_position.copy()  # 个体最优位置
pbest_value = np.full(n_particles, float('inf'))  # 个体最优值
gbest_value = float('inf')  # 全局最优值
gbest_position = np.array([float('inf'), float('inf')])  # 全局最优位置
# 迭代过程
for i in range(n_iterations):for j in range(n_particles):# 计算每个粒子的适应度值fitness = objective_function(particle_position[j])# 更新个体最优if fitness < pbest_value[j]:pbest_value[j] = fitnesspbest_position[j] = particle_position[j].copy()# 更新全局最优if fitness < gbest_value:gbest_value = fitnessgbest_position = particle_position[j].copy()for j in range(n_particles):# 更新速度particle_velocity[j] = (w * particle_velocity[j] + c1 * np.random.rand() * (pbest_position[j] - particle_position[j]) + c2 * np.random.rand() * (gbest_position - particle_position[j]))# 更新位置particle_position[j] += particle_velocity[j]
# 输出结果
print(f"全局最优位置:{gbest_position}")
print(f"全局最优值:{gbest_value}")
# 重新执行粒子群优化算法,进行5次迭代
# 重新初始化粒子位置和速度
particle_position = initial_particle_position.copy()  # 粒子位置
particle_velocity = np.random.rand(n_particles, dim) * 2 - 1  # 初始速度
pbest_position = particle_position.copy()  # 个体最优位置
pbest_value = np.full(n_particles, float('inf'))  # 个体最优值
gbest_value = float('inf')  # 全局最优值
gbest_position = np.array([float('inf'), float('inf')])  # 全局最优位置
# 执行5次迭代的过程
for _ in range(5):for j in range(n_particles):fitness = objective_function(particle_position[j][0], particle_position[j][1])if fitness < pbest_value[j]:pbest_value[j] = fitnesspbest_position[j] = particle_position[j].copy()if fitness < gbest_value:gbest_value = fitnessgbest_position = particle_position[j].copy()for j in range(n_particles):particle_velocity[j] = (w * particle_velocity[j] + c1 * np.random.rand() * (pbest_position[j] - particle_position[j]) + c2 * np.random.rand() * (gbest_position - particle_position[j]))particle_position[j] += particle_velocity[j]
# 创建3D图形
fig = plt.figure(figsize=(12, 6))
# 初始状态
ax1 = fig.add_subplot(1, 2, 1, projection='3d')
ax1.plot_surface(x, y, z, cmap='viridis', alpha=0.6)
ax1.scatter(initial_particle_position[:, 0], initial_particle_position[:, 1], objective_function(initial_particle_position[:, 0], initial_particle_position[:, 1]), color='r', s=10)
ax1.set_title('初始状态')
ax1.set_xlabel('X axis')
ax1.set_ylabel('Y axis')
ax1.set_zlabel('Z axis')
# 优化后的状态(5次迭代后)
ax2 = fig.add_subplot(1, 2, 2, projection='3d')
ax2.plot_surface(x, y, z, cmap='viridis', alpha=0.6)
ax2.scatter(particle_position[:, 0], particle_position[:, 1], objective_function(particle_position[:, 0], particle_position[:, 1]), color='r', s=10)
ax2.set_title('优化后的状态(5次迭代)')
ax2.set_xlabel('X axis')
ax2.set_ylabel('Y axis')
ax2.set_zlabel('Z axis')
plt.show()

最后,我分别可视化了粒子群优化算法初始状态和优化5轮后的状态,对比表明粒子群优化算法的效果。

图片[1]-粒子群算法(Particle Swarm Optimization)-VenusAI

  • 左图(初始状态):展示了目标函数的表面,并标记了初始化时粒子群的位置(红色点)。这些点代表粒子群初始时的随机分布。
  • 右图(优化后的状态 – 5次迭代):同样展示了目标函数的表面,并标记了经过5次迭代后粒子群的位置(红色点)。可以看到,粒子群的位置相比于初始状态有了明显的聚集,部分粒子开始靠近函数的最小值点(原点)。

这两幅图形象地说明了粒子群优化算法的工作原理:从随机搜索开始,经过多次迭代,粒子逐渐聚焦于搜索空间中的优化区域。虽然只进行了5次迭代,但我们已经可以看到粒子群朝着问题的最优解方向的逐渐聚集。随着更多迭代的进行,粒子群将更加集中地趋向于全局最优解。

这篇关于粒子群算法(Particle Swarm Optimization)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987550

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

最大公因数:欧几里得算法

简述         求两个数字 m和n 的最大公因数,假设r是m%n的余数,只要n不等于0,就一直执行 m=n,n=r 举例 以18和12为例 m n r18 % 12 = 612 % 6 = 06 0所以最大公因数为:6 代码实现 #include<iostream>using namespace std;/