粒子群优化算法(PSO)附代码_粒子群优化算法代码-程序员宅基地

技术标签: 算法  最优化方法及MATLAB代码实现  

1 算法介绍

粒子群优化算法(Particle Swarm Optimization,PSO)是一种经典的群智能算法,该算法灵感源自于鸟类飞行和觅食的社会活动,鸟群通过个体之间的信息交互来寻找全局最优点。PSO算法具有原理简单、较少的参数设置和容易实现等优点,因此近年来受到学者们的广泛关注和研究。

粒子群算法模拟鸟群的捕食过程,将待优化问题看作是捕食的鸟群,解空间看作是鸟群的飞行空间,空间的每只鸟的位置即是粒子群算法在解空间的一个粒子,也就是待优化问题的一个解。

粒子群算法有以下几点假设:

  1. 粒子被假定为没有体积没有质量,本身的属性只有速度和位置。

  2. 每个粒子在解空间中运动,它通过速度改变其方向和位置。

  3. 通常粒子将追踪当前的最优粒子以经过最少代数的搜索到最优解。

在算法的进化过程中,粒子一直都跟踪两个极值:一个是到个体历史最优位置,一个是种群历史最优位置。

2 算法模型

粒子群算法的核心思想是利用群体中的个体对信息的共享,从而使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得问题的最优解。

在这里插入图片描述
粒子群算法的个体位置变化按两个基本公式:

v i d t + 1 = ω v i d t + c 1 r 1 ( p i d t − x i d t ) + c 2 r 2 ( p g d t − x i d t ) x i d t + 1 = x i d t + v i d t + 1 \begin{aligned} v_{i d}^{t+1} &=\omega v_{i d}^{t}+c_{1} r_{1}\left(p_{i d}^{t}-x_{i d}^{t}\right)+c_{2} r_{2}\left(p_{g d}^{t}-x_{i d}^{t}\right) \\ x_{i d}^{t+1} &=x_{i d}^{t}+v_{i d}^{t+1} \end{aligned} vidt+1xidt+1=ωvidt+c1r1(pidtxidt)+c2r2(pgdtxidt)=xidt+vidt+1

式中,r1和r2是介于(0,1)之间的随机数,c1和c2代表学习因子,取值一般为c1=c2=2。

根据速度更新公式可知,粒子的速度由三个部分构成:第一部分是对粒子之前速度的继承,体现了粒子运动的惯性;第二部分是自我认知,表示粒子自身之前的飞行经验对之后飞行方向的影响;第三部分是社会认知,表示种群中所有粒子的飞行经验对每个粒子之后飞行方向的影响。

3 实现步骤

Step1:初始化种群:包括搜索空间的上限和下限,两个学习因子c1,c2,算法的最大迭代次数T,每个粒子速度的上限和下限。随机初始化种群中每个粒子的位置和速度.

Step2:根据适应度函数计算每个粒子的适应值fitness,保存每个粒子的最优位置,保存个体最佳适应度值和群体迄今的最好位置.

Step3:根据速度、位置更新公式来更新速度和位置.

Step4:计算更新后每个粒子的适应度值,将每个粒子的最佳适应度值与其历史最优位置时的适应度值比较,如果较好,则将其当前的位置作为该粒子的最优位置.

Step5:对每个粒子,将它的最优位置对应的适应度值与种群最佳适应度值对比,如果更优,则更新种群最优位置和最佳适应度值.

Step6:判断搜索到的结果是否满足停止条件(达到最大迭代次数或满足精度要求),若满足停止条件则输出最优值,否则转到Step3继续运行直到满足条件为止.

在这里插入图片描述

4 MATLAB代码实现PSO算法

优化问题:求解函数最小值。

F = ∑ i = 1 D x i 2 F=\sum_{i=1}^{D} x_{i}^{2} F=i=1Dxi2

4.1. main.m

复制以下代码,粘贴到MATLAB,可直接运行出结果

% 主程序 PSO
clear
close all
clc
 
SearchAgents_no = 30 ; % 种群规模
dim = 10 ; % 粒子维度
Max_iter = 1000 ; % 迭代次数
ub = 5 ;
lb = -5 ;
c1 = 1.5 ; % 学习因子1
c2 = 1.5 ; % 学习因子2
w = 0.8 ; % 惯性权重
vmax = 3 ; % 最大飞行速度
pos = lb + rand(SearchAgents_no,dim).*(ub-lb) ; % 初始化粒子群的位置
v = - vmax +2*vmax* rand(SearchAgents_no,dim) ; % 初始化粒子群的速度
% 初始化每个历史最优粒子
pBest = pos ; 
pbestfit = zeros(SearchAgents_no,1);
for i = 1:SearchAgents_no
pbestfit(i) = sum(pos(i,:).^2) ; 
end
%初始化全局历史最优粒子
[gBestfit,index] = min(pbestfit) ;
gBest = pos(index,:) ;
Convergence_curve = zeros(Max_iter,1);
 
for t=1:Max_iter
    for i=1:SearchAgents_no
        % 更新个体的位置和速度
        v(i,:) = w*v(i,:)+c1*rand*(pBest(i,:)-pos(i,:))+c2*rand*(gBest-pos(i,:)) ;
        pos(i,:) = pos(i,:)+v(i,:) ;
        % 边界处理
        v(i,:) = min(v(i,:), vmax);
        v(i,:) = max(v(i,:), -vmax);
        pos(i,:) =min(pos(i,:), ub);
        pos(i,:) =max(pos(i,:), lb);
        % 更新个体最优
        f1 = sum(pos(i,:).^2);
        if f1<pbestfit(i)    
           pBest(i,:) = pos(i,:) ;
           pbestfit(i) = f1;
        end
        % 更新全局最优
       if pbestfit(i) < gBestfit
            gBest = pBest(i,:) ;
            gBestfit = pbestfit(i) ;
       end
    end
    % 每代最优解对应的目标函数值
    Convergence_curve(t) = gBestfit; 
    disp(['Iteration = ' num2str(t)  ', Evaluations = ' num2str(gBestfit)]);
end
 
figure('unit','normalize','Position',[0.3,0.35,0.4,0.35],'color',[1 1 1],'toolbar','none')
subplot(1,2,1);
x = -5:0.1:5;y=x;
L=length(x);
f=zeros(L,L);
for i=1:L
    for j=1:L
       f(i,j) = x(i)^2+y(j)^2;
    end
end
surfc(x,y,f,'LineStyle','none');
xlabel('x_1');
ylabel('x_2');
zlabel('F')
title('Objective space')
 
subplot(1,2,2);
semilogy(Convergence_curve,'Color','r','linewidth',1.5)
title('Convergence_curve')
xlabel('Iteration');
ylabel('Best score obtained so far');
 
axis tight
grid on
box on
legend('PSO')
display(['The best solution obtained by PSO is : ', num2str(gBest)]);
display(['The best optimal value of the objective funciton found by PSO is : ', num2str(gBestfit)]);
 
        
 
 
 

4.2. 运行结果

在这里插入图片描述

The best solution obtained by PSO is : -5.9693e-08  4.4549e-07 -1.8445e-08 -1.4353e-07 -2.0883e-07  -2.622e-08   2.743e-08 -1.0503e-08 -7.5957e-08 -6.4972e-07
The best optimal value of the objective funciton found by PSO is : 6.9603e-13
>> 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45955094/article/details/120103806

智能推荐

Element-ui 对话框el-dialog点击关闭事件处理_el-dialog关闭事件-程序员宅基地

文章浏览阅读2w次,点赞8次,收藏9次。默认关闭的处理使用:visible.sync="dialogVisible"进行处理<el-dialog title="提示" :visible.sync="dialogVisible" width="30%" :before-close="handleClose"> <span>这是一段信息</span> <span slot="footer" class="dialog-footer"> <el-button @c_el-dialog关闭事件

Go必知必会系列:中间件与拦截器-程序员宅基地

文章浏览阅读1.7k次。在 Go 中,中间件(Middleware)是指用来连接两个或多个服务的组件或者模块。它通常被用于实现安全、验证、数据转换、监控等功能。

WebAssembly完全入门——了解wasm的前世今身-程序员宅基地

文章浏览阅读58次。前言接触WebAssembly之后,在google上看了很多资料。感觉对WebAssembly的使用、介绍、意义都说的比较模糊和笼统。感觉看了之后收获没有达到预期,要么是文章中的例子自己去实操不能成功,要么就是不知所云、一脸蒙蔽。本着业务催生技术的态度,这边文章就诞生了。前部分主要是对WebAssembly的背景做一些介绍,WebAssembly是怎么出现的,优势在哪儿。如果想直接开始撸代码试试..._-s use_xx wasm

创建一个conda环境及将其用于复现别人代码的全过程以及遇到的问题_如何创建别人论文的代码依赖项的conda环境-程序员宅基地

文章浏览阅读3k次,点赞12次,收藏59次。用于小白复现别人论文的代码condawin+r,输入cmd进入命令行,输入conda的情况下出现'conda' 不是内部或外部命令,也不是可运行的程序 或批处理文件。如何用conda查看,创建,切换,管理环境1.查看环境2.创建环境3.切换环境4.管理环境5.删除环境6.环境克隆使用我们搭建的环境来复现别人的代码复现别人代码7.如何安装不同位的Pythonanaconda的安装我就不说了,有很多的教程。主要是第一次跑代码时发现,有时候复现别人的代码会出现一会去安装环境,一会儿去安装环境,conda一个很_如何创建别人论文的代码依赖项的conda环境

Stars POJ - 2352 二维偏序问题CDQ分治_树状数组二维偏序-程序员宅基地

文章浏览阅读246次。Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and ..._树状数组二维偏序

CS229 吴恩达机器学习 习题大作业答案 problem sets 04 PS04(第6题,欢迎指教)强化学习 Reinforcement Learning MDP 马尔可夫决策_cs229 吴恩达机器学习 习题答案-程序员宅基地

文章浏览阅读1.1k次。6. Reinforcement Learning: The inverted pendulum首先写出simulator(作业中已提供,直接复制过来):import matplotlib.pyplot as pltimport matplotlib.patches as patchesfrom math import sin, cos, piclass CartPole: def __init__(self, physics): self.physics = physi_cs229 吴恩达机器学习 习题答案

随便推点

马化腾的电商梦,只能靠它来实现了~-程序员宅基地

文章浏览阅读655次,点赞23次,收藏18次。腾讯总裁刘炽平也曾称,腾讯在电商方面仍有非常大的发展空间,但仍希望能够循序渐进,一步一个脚印,逐渐打造适合自身的基础设施,在用户体验与商家投资回报率中找寻最佳平衡点。而视频号的话,没有什么引流品之类的低价品,只做利润品,商家拿着低价引流品去对接视频号主播,只会被主播看不起,认为没有实力。从视频号小店本身来看,当流量持续从商家的私域引入到小店成交,并促成源源不断的交易后,更便于养成用户在小店持续购买的习惯。现在已经在做视频号店铺的商家,和已经在做视频号的带货达人,都表示抖快淘目前是一片红海,

YOLOv5红外车辆检测pytorch实现_yolov5识别红外图像-程序员宅基地

文章浏览阅读343次。数据集收集与预处理: 首先,为了训练YOLOv5模型,需要收集大量标注有车辆目标的红外图像数据集。这些数据集应覆盖各种不同的场景和条件,以提高模型的泛化能力。然后,对图像进行预处理操作,包括图像大小调整、归一化、数据增强等,以提高模型的鲁棒性和适应性。模型架构: YOLOv5采用了一种基于卷积神经网络(CNN)的轻量级架构。它包括主干特征提取网络和检测头两个主要部分。特征金字塔网络: 为了在不同尺度下检测车辆目标,YOLOv5引入了特征金字塔网络。_yolov5识别红外图像

评估回归模型的指标:MSE、RMSE、MAE、R2、偏差和方差-程序员宅基地

文章浏览阅读2.6w次,点赞19次,收藏167次。在回归任务(对连续值的预测)中,常见的评估指标(Metric)有:平均绝对误差(Mean Absolute Error,MAE)、均方误差(Mean Square Error,MSE)、均方根误差(Root Mean Square Error,RMSE)和平均绝对百分比误差(Mean Absolute Percentage Error,MAPE),其中用得最为广泛的就是MAE和MSE。下面依次来..._r2分数

TinyBERT论文及代码详细解读-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏10次。General DistillationData Augmentation主要基于BERT预训练模型以及词向量(文中选择的Glove词向量)进行词级别的替换,实现数据增强。在官方代码中进行了17(NαN_\alphaNα​)倍的增强,以GLUE/QQP数据集为例效果如下:id qid1 qid2 question1 question2 is_duplicate402555 536040 536041 how do i control my 40-something emotions _tinybert

基于贝塞尔曲线的变道轨迹规划_贝塞尔曲线 自动紧急换道-程序员宅基地

文章浏览阅读9k次,点赞14次,收藏118次。基于贝塞尔曲线的变道轨迹规划车辆的换道与超车是驾驶员常见的驾驶操作之一,无人驾驶车辆在行驶过程中也会频繁的面临此工况,车辆行驶过程中必须根据行驶环境中车车之间的相对速度与距离,以及车辆周边其他环境的变化信息,相应做出调整进而完成驾驶要求。在这个过程中,车辆必须对安全换道和超车的通过性做出准确评估,从而使车辆安全的运行。因此,无人车的轨迹规划是保证车辆安全行驶的重要组成部分。..._贝塞尔曲线 自动紧急换道

fedora14 15 16 apache mysql php yum安装_fedora 15如何安装zlib-程序员宅基地

文章浏览阅读714次。fedora14 15 16 apache mysql php yum安装2010年06月26日 星期六 10:14LAMP是Linux, Apache, MySQL, PHP的缩写.这篇教程将教你如何在一台Fedora 服务器上安装Apache2web服务器+PHP(mod_php) +MySQL .我已经测试无误,你可以放心使用。1. 前言_fedora 15如何安装zlib

推荐文章

热门文章

相关标签