1.简介
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。

2.基本思想
粒子群算法是模拟群体智能所建立起来的一种优化算法,粒子群算法可以用鸟类在一个空间内随机觅食为例,所有的鸟都不知道食物具体在哪里,但是他们知道大概距离多远,最简单有效的方法就是搜寻目前离食物最近的鸟的周围区域。对粒子群优化算法操作的一个简单解释如下:每一个粒子都代表了当前优化任务的一个可能解决方案。在每次迭代过程中,每个粒子都会朝着自己的最优解的方向加速,也会朝着种群中任何粒子迄今为止发现的全局最佳位置的方向加速。这意味着,如果一个粒子发现了一个更好的解,所有其他粒子都会靠近它,在这个过程中不断地搜索最优解。可以总结出粒子群算法地三条简单规则:(1)飞离最近的个体,以避免碰撞;(2)飞向目标;(3)飞向群体的中心。

假设存在一个维度为S的搜索空间,由m​个粒子组成粒子种群,其中第i​个粒子用一个S​维的向量表示,具体为Xi=(xi1,xi2,…,xiS)​

代入目标函数就可以算出其适应度值,适应度值的大小对应着粒子位置即可行解的好坏。另外,第i​个粒子移动的速度是S 维向量,记为Vi=(vi1,vi2,…,viS)
第i​个粒子搜索到的最优位置为Pi=(pi1,pi2,…,piS)​整个粒子群搜索到的最优位置为Pg=(pg1,pg2,…,pgS)​

3.算法流程
标准PSO算法的流程:

Step1:初始化一群微粒(群体规模为m),包括随机位置和速度;

Step2:评价每个微粒的适应度;

Step3:对每个微粒,将其适应值与其经过的最好位置Pi
作比较,如果较好,则将其作为该粒子当前的最好位置Pi

Step4:对每个微粒,将其适应值与全局最好位置Pg

作比较,如果较好,则将其作为当前全局最好位置Pg

Step5:根据(2)、(3)式调整微粒速度和位置;

Step6:未达到结束条件则转Step2。

迭代终止条件根据具体问题一般选为最大迭代次数kkk或(和)微粒群迄今为止搜索到的最优位置满足预定最小适应阈值。

4.流程图

5.代码实现

%% 清空环境
clc
clear

%% 参数初始化
%粒子群算法中的三个参数
c1 = 1.49445;%加速因子
c2 = 1.49445;

maxgen=1000; % 进化次s数
sizepop=200; %种群规模
%惯性权重

Vmax=1; %限制速度围
Vmin=-1;
popmax=5; %变量取值范围
popmin=-5;
dim=10; %适应度函数维数

func=1; %选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank
Drawfunc(func);%画出待优化的函数,只画出二维情况作为可视化输出

%% 产生初始粒子和速度
for i=1:sizepop
%随机产生一个种群
pop(i,:)=popmax*rands(1,dim); %初始种群
V(i,:)=Vmax*rands(1,dim); %初始化速度
%计算适应度
fitness(i)=fun(pop(i,:),func); %粒子的适应度
end

%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
gbest=pop(bestindex,:); %全局最佳
pbest=pop; %个体最佳
fitnesspbest=fitness; %个体最佳适应度值
fitnessgbest=bestfitness; %全局最佳适应度值

%% 迭代寻优
for i=1:maxgen
%w = 0.9 - 0.5*(i/maxgen)*(i/maxgen);
fprintf('第%d代,',i);
fprintf('最优适应度%f\n',fitnessgbest);
for j=1:sizepop
w = 0.9 - 0.5*(i/maxgen)*(i/maxgen);
%速度更新
V(j,:) = w*V(j,:) + c1*rand*(pbest(j,:) - pop(j,:)) + c2*rand*(gbest - pop(j,:)); %根据个体最优pbest和群体最优gbest计算下一时刻速度
V(j,find(V(j,:)>Vmax))=Vmax; %限制速度不能太大
V(j,find(V(j,:)<Vmin))=Vmin;

%种群更新
pop(j,:)=pop(j,:)+0.5*V(j,:); %位置更新
pop(j,find(pop(j,:)>popmax))=popmax;%坐标不能超出范围
pop(j,find(pop(j,:)<popmin))=popmin;

if rand>0.98 %加入变异种子,用于跳出局部最优值
pop(j,:)=rands(1,dim);
end

%更新第j个粒子的适应度值
fitness(j)=fun(pop(j,:),func);

end

for j=1:sizepop

%个体最优更新
if fitness(j) < fitnesspbest(j)
pbest(j,:) = pop(j,:);
fitnesspbest(j) = fitness(j);
end

%群体最优更新
if fitness(j) < fitnessgbest
gbest = pop(j,:);
fitnessgbest = fitness(j);
end
end
yy(i)=fitnessgbest;

end
%% 结果分析
figure;
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

6.参数对实验结果的影响

6.1 惯性权重w

由于惯性权重w过大全局寻优能力强,局部寻优能力弱;过小全局寻优能力弱,局部寻优能力强。所以,动态w能在搜索过程中线性变化可以比固态w求得更好的结果。

这里将设置函数w = 0.9 - 0.5*(i/maxgen)*(i/maxgen)   (maxgen是迭代次数)

运行结果

由图可知在迭代到600次左右收敛,最优适应度为1.989918

6.2 学习因子c1,c2

令c1=c2 = 0.89886,运行结果

由图可知迭代到680次左右,种群适应度为0,无法求得最优解

令c1=c2=2.55987  运行结果

   由图可知迭代50次左右  得到最优解5.969754

6.3种群规模sizepop对结果影响

令sizepop=20  运行结果

    由图可知当迭代到160次左右收敛  得到最优解

    令sizepop=1000  运行结果

由图可知迭代到970次左右收敛  求解速度慢

  6.4 适应度函数维数dim对结果的影响

  令dim=3  运行结果

    

      由图可知过早收敛无法取得最优解

令dim=100  运行结果

      由图可知迭代550次左右收敛

6.5 最大速度vmax对实验结果的影响

令vmax=0.1  运行结果

    

      由图可知迭代到50次左右时收敛  过早得到最优解

令vmax=20   运行结果

    

       由图可知迭代到700次左右收敛

    6.6经过大量的实验令w=0.78812,c1=c2=1.49618 是一组比较好的组合

运行结果

     

6.7总结

①惯性权重w:w越大,微粒飞行速度越大,微粒将会以更长的步长进行全局搜索;w较小,则微粒步长小,趋向于精细的局部搜索;因此,采用动态改变w的值;在搜索初期设w取0.9,然后随着迭代次数的不断增加,逐渐降低w的值;从而达到全局最优。

②学习因子c1,c2:c1,c2具有自我总结和向优秀个体学习的能力,从而使微粒向群体内最优点靠近。c1,c2分别调节微粒向个体最优或者群体最优方向飞行的最大步长,决定微粒个体经验和群体经验对微粒自身运行轨迹的影响。学习因子较小时,可能使微粒不在最优区域移动,无法得到最优解;学习因子较大时,可使微粒迅速向最优区域移动,过早收敛。

③种群规模sizepop:种群规规模过小,算法收敛速度快,但是容易陷入局部最优;种群规模过大,算法收敛速度较慢;导致计算时间增加,而且群体数目增加到一定数目时,再增加微粒数目不再有显著的效果。

④适应度函数维数dim:维度过小,算法早熟,陷入局部最优;维度过大,求解精度提高,但算法速度慢,比较耗时。

⑤最大速度vmax:vmax过大,粒子运动速度快,微粒探索能力强,但容易越过最优的搜索空间,错过最优解;Vmax较小,容易进入局部最优,可能会使微粒无法运动足够远的距离以跳出局部最优,从而也可能找不到最优解

7.PSO算法优缺点

优点:没有交叉和变异运算,靠粒子速度完成搜索,并在迭代中只有传递最优信息,搜索速度快,需要调整的参数不多,易于实现

缺点:缺乏速度的动态调节,容易陷入局部最优,导致收敛精度低和不易收敛;不能有效解决离散及组合优化问题;对于不同问题,参数不好选择,不能高效取得最优解。

 

PSO算法的更多相关文章

  1. PSO算法的改进(参数)

    ## 基本PSO的改进 虽然粒子群在求解优化函数时,表现了较好的寻优能力:通过迭代寻优计算,能够迅速找到近似解:但基本的PSO容易陷入局部最优,导致结果误差较大. 两个方面:1.将各种先进理论引入到P ...

  2. 基本PSO算法实现(Java)

    一.算法流程 Step1:初始化一群粒子(粒子个数为50个),包括随即位置和速度: Step2:计算每个粒子的适应度fitness: Step3:对每个粒子,将其适应度与其进过的最好位置(局部)pbe ...

  3. PSO:利用PSO算法优化二元函数,寻找最优个体适应度—Jason niu

    figure [x,y] = meshgrid(-5:0.1:5,-5:0.1:5); z = x.^2 + y.^2 - 10*cos(2*pi*x) - 10*cos(2*pi*y) + 20; ...

  4. 最基本PSO算法的C++实现

    按照James Kennedy & Russell Eberhart (1995)的版本,算法过程如下: [x*] = PSO() P = Particle_Initialization(); ...

  5. 一C++PSO(PSO)算法

    收集和变化PSO算法,它可用于参考实施: #include <cstring> #include <iostream> #include <cmath> #incl ...

  6. 粒子群算法(PSO)算法解析(简略版)

    粒子群算法(PSO) 1.粒子群算法(PSO)是一种基于群体的随机优化技术: 初始化为一组随机解,通过迭代搜寻最优解. PSO算法流程如图所示(此图是从PPT做好,复制过来的,有些模糊) 2.PSO模 ...

  7. 粒子群优化算法PSO及matlab实现

    算法学习自:MATLAB与机器学习教学视频 1.粒子群优化算法概述 粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群 ...

  8. ARIMA模型--粒子群优化算法(PSO)和遗传算法(GA)

    ARIMA模型(完整的Word文件可以去我的博客里面下载) ARIMA模型(英语:AutoregressiveIntegratedMovingAverage model),差分整合移动平均自回归模型, ...

  9. 计算智能(CI)之粒子群优化算法(PSO)(一)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 计算智能(Computational Intelligence , ...

随机推荐

  1. VBA消息框(MsgBox)(五)

    MsgBox函数显示一个消息框,并等待用户点击一个按钮,然后根据用户点击的按钮执行相关的操作. 语法 MsgBox(prompt[,buttons][,title][,helpfile,context ...

  2. Go微服务 grpc/protobuf

    了解grpc/protobuf gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers ...

  3. leetcode-88. 合并两个有序数组 · Aaray

    题面 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 样例 1. 输入: nums1 = [1,2,3,0,0,0], m ...

  4. 封装promise

    // new 做了什么 //1.创建一个新的空对象 //2.将构造函数中的this指向这个新空对象 //3.执行构造函数中的代码 //4.返回这个对象 //5.这个对象有一个__proto__指向构造 ...

  5. 使用apache的HttpClient进行http通讯,隐藏的HTTP请求头部字段是如何自动被添加的

    我们用apache的HttpClient这个库消费云端的Restful API时,一般都需要两次HTTP调用,第一次获得某种token,比如获取防止跨域请求伪造攻击Cross-site request ...

  6. Hadoop错误:PipeMapRed.waitOutputThreads(): subprocess failed with code 1

    有一种原因是python文件中有语法或逻辑错误

  7. SmtpClient 发送邮件

    利用SmtpClient 代码发送邮件. 简单测试代码: static void Main(string[] args) { MailMessage msg = new MailMessage(); ...

  8. 大数据之路week03--day05(线程 II)

    今天,咱们就把线程给完完全全的结束掉,但是不是说,就已经覆盖了全部的知识点,可以说是线程的常见的问题及所含知识基本都包含. 1.多线程(理解) (1)JDK5以后的针对线程的锁定操作和释放操作 Loc ...

  9. tableviewer自动调整列宽

    public void resizeTableColumn(TableColumn[] treeColumns) { for (TableColumn tc : treeColumns) tc.pac ...

  10. 11、Spring Boot 2.x 集成 HBase

    1.11 Spring Boot 2.x 集成 HBase 完整源码: Spring-Boot-Demos