粒子群算法详解

article/2025/10/1 10:10:46

一.产生背景

   

粒子群算法(particleswarm optimization,PSO)由Kennedy和Eberhart在1995年提出,该算法对于Hepper的模拟鸟群(鱼群)的模型进行修正,以使粒子能够飞向解空间,并在最好解处降落,从而得到了粒子群优化算法。

遗传算法类似,也是一种基于群体叠代的,但并没有遗传算法用的交叉以及变异,而是粒子在解空间追随最优的粒子进行搜索。

PSO的优势在于简单,容易实现,无需梯度信息,参数少,特别是其天然的实数编码特点特别适合于处理实优化问题。同时又有深刻的智能背景,既适合科学研究,又特别适合工程应用。

设想这样一个场景:一群鸟在随机的搜索食物。在这个区域里只有一块食物,所有的鸟都不知道食物在哪。但是它们知道自己当前的位置距离食物还有多远。

                         那么找到食物的最优策略是什么

最简单有效的就是搜寻目前离食物最近的鸟的周围区域

二.算法介绍
(1)简述

每个寻优的问题解都被想像成一只鸟,称为“粒子”。所有粒子都在一个D维空间进行搜索。

所有的粒子都由一个fitness-function确定适应值以判断目前的位置好坏。

每一个粒子必须赋予记忆功能,能记住所搜寻到的最佳位置

每一个粒子还有一个速度以决定飞行的距离和方向。这个速度根据它本身的飞行经验以及同伴的飞行经验进行动态调整。 

(2) 基本PSO算法

  a.  D维空间中,有m个粒子;

  粒子i位置:xi=(xi1,xi2,…xiD)

  粒子i速度:vi=(vi1,vi2,…viD),1≤i≤m,1 ≤d ≤D

  粒子i经历过的历史最好位置:pi=(pi1,pi2,…piD)

  群体内(或领域内)所有粒子所经历过的最好位置:

  pg =(pg1,pg2,…pgD)

  PS:一般来说,粒子的位置和速度都是在连续的实数空间内进行取值。


   b.基本PSO公式


(3)基本PSO算法流程图


关于每个粒子的更新速度和位置的公式如下:


三.简单应用

  

(1)•编码:因为问题的维数为5,所以每个粒子为5维的实数向量。
(2)•初始化范围:根据问题要求,设定为[-30,30]。根据前面的参数分析,我们知道,可以将最大速度设定为Vmax=60。
(3)•种群大小:为了说明方便,这里采用一个较小的种群规模,m=5。
(4)•停止准则:设定为最大迭代次数100次。
(5)•惯性权重:采用固定权重0.5。
(6)邻域拓扑结构:使用星形拓扑结构,即全局版本的粒子群优化算法

算法执行的过程如下:









四.代码实现:运用粒子群算法解决 TSP问题
1.matlab实现
close all;
clear all;PopSize=500;%种群大小
CityNum = 14;%城市数OldBestFitness=0;%旧的最优适应度值Iteration=0;%迭代次数
MaxIteration =2000;%最大迭代次数
IsStop=0;%程序停止标志 
Num=0;%取得相同适应度值的迭代次数c1=0.5;%认知系数
c2=0.7;%社会学习系数
w=0.96-Iteration/MaxIteration;%惯性系数,随迭代次数增加而递减%节点坐标
node=[16.47 96.10; 16.47 94.44; 20.09 92.54; 22.39 93.37; 25.23 97.24;...22.00 96.05; 20.47 97.02; 17.20 96.29; 16.30 97.38; 14.05 98.12;...16.53 97.38; 21.52 95.59; 19.41 97.13; 20.09 94.55];%初始化各粒子,即产生路径种群
Group=ones(CityNum,PopSize);   
for i=1:PopSizeGroup(:,i)=randperm(CityNum)';
end
Group=Arrange(Group);%初始化粒子速度(即交换序)
Velocity =zeros(CityNum,PopSize);   
for i=1:PopSizeVelocity(:,i)=round(rand(1,CityNum)'*CityNum); %round取整
end%计算每个城市之间的距离
CityBetweenDistance=zeros(CityNum,CityNum);   
for i=1:CityNumfor j=1:CityNumCityBetweenDistance(i,j)=sqrt((node(i,1)-node(j,1))^2+(node(i,2)-node(j,2))^2);end
end%计算每条路径的距离
for i=1:PopSize   EachPathDis(i) = PathDistance(Group(:,i)',CityBetweenDistance);
endIndivdualBest=Group;%记录各粒子的个体极值点位置,即个体找到的最短路径
IndivdualBestFitness=EachPathDis;%记录最佳适应度值,即个体找到的最短路径的长度
[GlobalBestFitness,index]=min(EachPathDis);%找出全局最优值和相应序号 %初始随机解
figure;
subplot(2,2,1);
PathPlot(node,CityNum,index,IndivdualBest);
title('随机解');%寻优
while(IsStop == 0) & (Iteration < MaxIteration) %迭代次数递增Iteration = Iteration +1;  %更新全局极值点位置,这里指路径for i=1:PopSize   GlobalBest(:,i) = Group(:,index);end%求pij-xij ,pgj-xij交换序,并以概率c1,c2的保留交换序pij_xij=GenerateChangeNums(Group,IndivdualBest);  pij_xij=HoldByOdds(pij_xij,c1); pgj_xij=GenerateChangeNums(Group,GlobalBest);pgj_xij=HoldByOdds(pgj_xij,c2);%以概率w保留上一代交换序Velocity=HoldByOdds(Velocity,w);Group = PathExchange(Group,Velocity); %根据交换序进行路径交换Group = PathExchange(Group,pij_xij);Group = PathExchange(Group,pgj_xij);for i = 1:PopSize    % 更新各路径总距离EachPathDis(i) = PathDistance(Group(:,i)',CityBetweenDistance);endIsChange = EachPathDis<IndivdualBestFitness;%更新后的距离优于更新前的,记录序号IndivdualBest(:, find(IsChange)) = Group(:, find(IsChange));%更新个体最佳路径IndivdualBestFitness = IndivdualBestFitness.*( ~IsChange) + EachPathDis.*IsChange;%更新个体最佳路径距离[GlobalBestFitness, index] = min(EachPathDis);%更新全局最佳路径,记录相应的序号if GlobalBestFitness==OldBestFitness %比较更新前和更新后的适应度值;Num=Num+1; %相等时记录加一;elseOldBestFitness=GlobalBestFitness;%不相等时更新适应度值,并记录清零;Num=0;end    if Num >= 20 %多次迭代的适应度值相近时程序停止IsStop=1;endBestFitness(Iteration) =GlobalBestFitness;%每一代的最优适应度end%最优解
subplot(2,2,2);
PathPlot(node,CityNum,index,IndivdualBest);
title('优化解');
%进化曲线
subplot(2,2,3);
plot((1:Iteration),BestFitness(1:Iteration));
grid on;
title('进化曲线');
%最小路径值
GlobalBestFitness运行结果如下:

2.java 实现
package pso;
import java.awt.*;
import java.awt.event.*;
import java.io.ByteArrayInputStream;
import java.io.InputStream;import javax.swing.*;
import javax.swing.event.*;
public class Pso extends Frame implements Runnable
{private static int particleNumber;  //粒子的数量private static int iterations;      //迭代的次数private static int k=1;             //记录迭代的次数final private static float C1=2;    //学习因子final private static float C2=2;final private static float WMIN=-200;final private static float WMAX=200;final private static float VMAX=200;private static float r1;           //随机数0-1之间private static float r2;private static float x[][];private static float v[][];private static float xpbest[][];private static float pbest[];      private static float gbest=0;private static float xgbest[];private static float w;           //惯性因子private static float s;private static float h;private static float fit[];public Sounds sound;//粒子群的迭代函数
public void lzqjs()
{w=(float)(0.9-k*(0.9-0.4)/iterations);for(int i=0;i<particleNumber;i++){fit[i]= (float)(1/(Math.pow(x[i][0],2)+Math.pow(x[i][1],2))); //求适值函数最大值System.out.print("粒子"+i+"本次适应值函数f为:" + fit[i]);System.out.println();if(fit[i]>pbest[i]){pbest[i]=fit[i];xpbest[i][0]=x[i][0];xpbest[i][1]=x[i][1];}if(pbest[i]>gbest){gbest=pbest[i];xgbest[0]=xpbest[i][0];xgbest[1]=xpbest[i][1];}}for(int i=0;i<particleNumber;i++){for(int j=0;j<2;j++){//粒子速度和位置迭代方程:v[i][j]=(float)(w*v[i][j]+C1*Math.random()*(xpbest[i][j]-x[i][j])+C2*Math.random()*(xgbest[j]-x[i][j]));x[i][j]=(float)(x[i][j]+v[i][j]);}System.out.print("粒子"+i+"本次X1的速度变化幅度:"+v[i][0]+";本次X2的速度变化幅度:"+v[i][1]);System.out.println();System.out.print("粒子"+i+"本次X1为:"+x[i][0]+";本次X2为:"+x[i][1]);System.out.println();}
}public static void main(String[] args){particleNumber=Integer.parseInt(JOptionPane.showInputDialog("请输入粒子个数1-500)"));iterations=Integer.parseInt(JOptionPane.showInputDialog("请输入迭代次数"));x=new float [particleNumber][2];v=new float [particleNumber][2];fit=new float [particleNumber];    //存储适值函数值pbest=new float [particleNumber];  //存储整个粒子群的最有位置xpbest=new float [particleNumber][2];xgbest=new float [2];for(int i=0;i<particleNumber;i++){//对数组的初始化操作pbest[i]=0;xpbest[i][0]=0;xpbest[i][1]=0;}xgbest[0]=0;xgbest[1]=0;System.out.println("开始初始化:");for(int i=0;i<particleNumber;i++){for(int j=0;j<2;j++){//任意给定每个位置一定的位置值和速度值x[i][j]=(float)(WMAX*Math.random()+WMIN);v[i][j]=(float)(VMAX*Math.random());}System.out.print("粒子"+i+"本次X1的变化幅度:"+v[i][0]+";本次X2的变化幅度:"+v[i][1]);System.out.println();System.out.print("粒子"+i+"本次X1为:"+x[i][0]+";本次X2为:"+x[i][1]);System.out.println();}System.out.println("初始化数据结束,开始迭代.....");Pso threada=new Pso();threada.setTitle("基于粒子群的粒子位置动态显示");threada.setSize(800,800);threada.addWindowListener(new gbck());threada.setVisible(true);Thread threadc=new Thread(threada);threadc.start();}static class gbck extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}}//开启的额外线程用于声音的播放public void run(){repaint();for(int i=0;i<iterations;i++){sound();}}public void paint(Graphics g){g.setColor(new Color(0,0,0));for(int i=0;i<particleNumber;i++){g.drawString("*",(int)(x[i][0]+200),(int)(x[i][1]+200));}g.setColor(new Color(255,0,0));g.drawString("全局最优适应度函数值:"+gbest+"      参数1:"+xgbest[0]+"     参数2:"+xgbest[1]+"    迭代次数:"+ k,50,725);try{lzqjs();  //开始迭代if(k>=iterations){Thread.sleep((int)(5000));System.exit(0);}k=k+1;  //每次迭代一次加1操作Thread.sleep((int)(1000));}catch(InterruptedException e){System.out.println(e.toString());}repaint();}public  void sound(){sound =new Sounds("050.wav");InputStream stream =new ByteArrayInputStream(sound.getSamples());// play the soundsound.play(stream);// exit}
}
运行的结果如下:


算法代码地址:http://download.csdn.net/detail/u012017783/9700118(Matlab ,java两个版本)


http://chatgpt.dhexx.cn/article/Ljn9K0hD.shtml

相关文章

高铁列车粒子群算法及改进粒子群算法多目标单目标运行优化设计

问题介绍 根据表1、2、3 所列数据&#xff0c;以能耗、运行时间、舒适性为目标分别设计列车运行速度—距离曲线&#xff1b;完成单目标以及多目标优化下的列车运行对比&#xff1b;选择其中一种方案&#xff0c;设计列车速度跟踪控制算法并进行性能分析。 1 列车参数设置表优化…

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

1、粒子群优化算法概述 粒子群优化算法(PSO&#xff1a;Particle swarm optimization) 是一种进化计算技术&#xff08;evolutionary computation&#xff09;。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想&#xff1a;是通过群体中个体之间的协作和信息共享来寻找最优…

基于群智能的三维路径规划算法 2 —— 粒子群算法

目录 1 PSO算法的基本理论2 PSO算法程序设计流程3 MATLAB编程实现4 算法举例5 函数1 unifrnd函数 1 PSO算法的基本理论 将三个散点看做一个粒子 惯性分量就是 v i − 1 d v^d_{i-1} vi−1d​ 粒子群&#xff08;PSO&#xff09;算法是依托群鸟觅食的模型寻找最优解。群体特征…

粒子群算法(2)

上一期&#xff1a;粒子群算法&#xff08;1&#xff09; 线性递减惯性权重 惯性权重w体现的是粒子继承先前的速度的能力&#xff0c;Shi,Y最先将惯性权重w引入到粒子群算法中&#xff0c;并分析指出一个较大的惯性权值有利于全局搜索&#xff0c;而一个较小的权值则更利于局部…

粒子群算法简介

粒子群算法简介 前言 本文内容借鉴于 刘衍民的博士论文:“粒子群算法的研究及应用”. 现有的大多数群智能算法,如:乌鸦算法、鸽子算法、蚁群算法、萤火虫算法和灰狼优化算法等&#xff0c;都可以归类为粒子群算法.(个人觉得,这些算法就是整个稀奇古怪的名字,颇有舞文弄墨,强…

粒子群算法(1)

粒子群算法 1.入门 粒子群算法&#xff0c;其全称为粒子群优化算法(Particle Swarm Optimization,PsO)。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。 2.什么是启发式算法&#xff1f; 启发式算法百度百科上的定义:一个基于直观或经验构造的算法,在可…

粒子群优化算法

背景 1995 年&#xff0c;Kennedy 和 Eberhart 两位博士共同 提出了粒子群优化算法 (Particle swarm optimization&#xff0c; PSO) PSO 算法中&#xff0c;将鸟群的个体位置或食物当作优化问题的解&#xff0c;利用群体中个体与最优个体以及个体之间的信息交互&#xff0c;引…

粒子群算法

粒子群算法简介 粒子群算法&#xff0c;其全称为粒子群优化算法(Particle Swarm Optimization,PSO) 。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。粒子群算法属于启发式算法也叫智能优化算法&#xff0c;其基本思想在于通过群体中个体之间的协作和信息…

粒子群(PSO)算法的理解与应用

最近在学习粒子群算法&#xff0c;看了很多资料都有点摸不清头脑&#xff0c;直到看了一篇博客中超级简洁的粒子群C实现代码&#xff0c;才明白粒子群算法的原理&#xff0c;真心感谢博主&#xff0c;在此贴出博主的博客地址&#xff1a; http://blog.sina.com.cn/s/blog_4ed02…

6套粒子群算法(内含matlab代码)

粒子群算法(1)----粒子群算法简介 一、粒子群算法的历史 粒子群算法源于复杂适应系统&#xff08;Complex Adaptive System,CAS&#xff09;。CAS理论于1994年正式提出&#xff0c;CAS中的成员称为主体。比如研究鸟群系统&#xff0c;每个鸟在这个系统中就称为主体。主体有适…

粒子群算法(PSO)详解

1 粒子群PSO算法简介 1.1 维基百科的解释 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;&#xff0c;或称粒子群优化&#xff0c;是属于人工智能算法&#xff0c;公元1995年由肯尼迪&#xff08;Kennedy&#xff09;与埃伯哈特&#xf…

优化算法——粒子群算法(PSO)

一、粒子群算法的概述 粒子群算法(PSO)属于群智能算法的一种&#xff0c;是通过模拟鸟群捕食行为设计的。假设区域里就只有一块食物&#xff08;即通常优化问题中所讲的最优解&#xff09;&#xff0c;鸟群的任务是找到这个食物源。鸟群在整个搜寻的过程中&#xff0c;通过相互…

粒子群算法(PSO) 介绍

算法理解 粒子群算法&#xff0c;又叫鸟群算法&#xff0c;可见是受鸟群捕食行为的启发。它属于遗传算法、群智算法。粒子群算法关注于粒子的两个属性&#xff1a;位置和速度。每个粒子在空间中单独搜寻&#xff0c;它们记得自己找到的过最优解&#xff0c;也知道整个粒子群当…

【优秀作业】粒子群算法

粒子群优化算法 一、概述 粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;的思想来源于对鸟捕食行为的模仿&#xff0c;最初&#xff0c;Reynolds.Heppner 等科学家研究的是鸟类飞行的美学和那些能使鸟群同时突然改变方向&#xff0c;分散…

Dex加固与反编译

编译与反编译 编译 将java代码转换为Dalvik字节码 将res资源文件、AndroidManifest.xml等配置文件编译为二进制文件 反编译 将DEX文件转换为jar包或者Smali文件 将二进制资源文件还原为资源源码文件 编译与反编译是相对的过程&#xff0c;转换过程分别由编译器和反编译器实…

编译与反编译

编译&#xff1a;高级语言转换成计算机认识的低级语言 编译的主要的目的是将便于人编写、阅读、维护的高级语言所写作的源代码程序&#xff0c;翻译为计算机能解读、运行的低级语言的程序&#xff0c;也就是可执行文件。 反编译&#xff1a;Java的反编译&#xff0c;一般是将…

反编译网站

最近帮一个公司反编译了一个他们在用的网站&#xff0c;是一个印照片&#xff0c;然后群(384389229)里面的伙伴们&#xff08;专指&#xff1a;魂牵悲梦&#xff09;&#xff0c;叫我写个反编译的教程出来&#xff0c;由于前面时间很忙&#xff0c;一拖再拖到了现在终于有空就写…

编译/反编译

1.Android APK 1.软件 1.apktool 1.作用&#xff1a;反编译apk或重新打包apk 2.dex2jar 1.作用&#xff1a;将Android的可执行文件.dex转换为.jar 3.jd-gui 1.作用&#xff1a;方便阅读jar文件的代码工具 2.步骤 1.通过apktool将apk软件反编译2.使用dex2jar将classes.dex文件转…

反编译(Decompilers)

工具下载 调试工具反汇编工具反编译工具PE相关工具编译工具编辑工具.NET工具脱壳工具加壳工具补丁工具监视软件代码计算 密码学工具其它 反编译&#xff08;Decompilers&#xff09; VFP程序 UnFoxAll 3.0专业增强版  优点&#xff1a;界面和功能较实用缺点&#xff1a;支持到…

反编译器

转自&#xff1a;https://blog.csdn.net/kongwei521/article/details/54927689 在项目开发过程中&#xff0c;估计也有人和我遇到过同样的经历&#xff1a;运行环境出现了重大Bug亟需解决、或者由于电脑挂了、旧代码覆盖新代码&#xff0c;而在这种情况下&#xff0c;我们不能…