pso粒子群优化算法_粒子群算法优化神经网络

pso粒子群优化算法_粒子群算法优化神经网络粒子群优化算法(PSO),多图含爬山代码实操

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

粒子群优化算法(PSO)

Particle Swarm Optimization

1、 算法起源

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

2、 算法描述

2.1、 百科定义

粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization),缩写为 PSO, 是近年来由J. Kennedy和R. C. Eberhart等开发的一种新的进化算法(Evolutionary Algorithm – EA)。PSO 算法属于进化算法的一种,和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的“交叉”(Crossover) 和“变异”(Mutation) 操作,它通过追随当前搜索到的最优值来寻找全局最优。这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性。粒子群算法是一种并行算法。

2.2、 通俗点描述

如同前面的描述,PSO模拟的是鸟群的捕食行为。设想这样一个场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区域。

鸟群在整个搜寻的过程中,通过相互传递各自的信息,让其他的鸟知道自己的位置,通过这样的协作,来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终,整个鸟群都能聚集在食物源周围,即找到了最优解。

PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。

PSO 初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪**两个”极值”**来更新自己。**第一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest。另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。**另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。

3、 粒子的属性

3.1 算法核心

粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。

鸟被抽象为没有质量和体积的微粒(点),并延伸到N维空间,粒子i在N维空间的位置表示为矢量Xi=(x1,x2,…,xN),飞行速度表示为矢量Vi=(v1,v2,…,vN)。每个粒子都有一个由目标函数决定的适应值(fitness value),并且知道自己到目前为止发现的最好位置(pbest)和现在的位置Xi。这个可以看作是粒子自己的飞行经验。除此之外,每个粒子还知道到目前为止整个群体中所有粒子发现的最好位置(gbest)(gbest是pbest中的最好值),这个可以看作是粒子同伴的经验。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。

3.2 速度和位置的更新

PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。

在这里插入图片描述

第①部分称为【记忆项】,表示上次速度大小和方向的影响;

第②部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;

第③部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。

以上面两个公式为基础,再来看一个公式:
在这里插入图片描述

4、 标准PSO算法流程

4.1、 标准PSO算法的流程

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

2)评价每个微粒的适应度;

3)对每个微粒,将其适应值与其经过的最好位置pbest作比较,如果较好,则将其作为当前的最好位置pbest;

4)对每个微粒,将其适应值与其经过的最好位置gbest作比较,如果较好,则将其作为当前的最好位置gbest;

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

6)未达到结束条件则转第2)步。

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

4.2、 PSO流程图解

在这里插入图片描述

4.3、 学习因子c1、c2分析

公式(2)和(3)中pbest和gbest分别表示微粒群的局部和全局最优位置。

  • 当C1=0时,则粒子没有了认知能力,变为只有社会的模型(social-only):

v i = ω × v i + c 2 × r a n d ( ) × ( g b e s t i − x i ) v_i = \omega × v_i+c_2 × rand() × (gbest_i – x_i) vi=ω×vi+c2×rand()×(gbestixi)

​ 称为全局PSO算法。粒子有扩展搜索空间的能力,具有较快的收敛速度,但由于缺少局部搜 索,对于复杂问题 比标准PSO 更易陷入局部最优。

  • 当C2=0时,则粒子之间没有社会信息,模型变为只有认知(cognition-only)模型:

v i = ω × v i + c 1 × r a n d ( ) × ( p b e s t i − x i ) v_i = \omega × v_i+c_1 × rand() × (pbest_i – x_i) vi=ω×vi+c1×rand()×(pbestixi)

​ 称为局部PSO算法。由于个体之间没有信息的交流,整个群体相当于多个粒子进行盲目的随 机搜索,收敛速度慢,因而得到最优解的可能性小。

5、代码实操

找到三维图示的最高点坐标:
在这里插入图片描述

% 函数表达式
function y = fit( x )
    y  = 3*(1-x(1)).^2.*exp(-(x(1).^2) - (x(2)+1).^2) - 10*(x(1)/5 - x(1).^3 - x(2).^5).*exp(-x(1).^2-x(2).^2) - 1/3*exp(-(x(1)+1).^2 - x(2).^2);
end
% main.m
clc
clear
close all
%% 参数初始化
c1 = 1.5;       % 学习因子
c2 = 1.5;
w=0.7;          % 惯性权重
D=2;           % 粒子维度 
maxgen = 20;   % 迭代次数
sizepop = 5;  % 种群大小
Vmax = 1.5;     % 速度的范围
Vmin = -1.5;  
popmax = 3;     % 搜索的范围
popmin = -3;
%% 种群初始化
for i = 1:sizepop
    % 随机产生一个种群
    pop(i,:) = rand(1,D)*2*popmax-popmax;    % 初始化位置
    V(i,:) = 0.5 * rands(1,D);   % 初始化速度
    % 适应度计算
    fitness(i) = fit(pop(i,:));
end
%% 个体极值和群体极值
[bestfitness,bestindex] = max(fitness);   % 默认将第一代的最大适应度值设置为最佳
zbest = pop(bestindex,:);   % 全局最佳
gbest = pop;                % 个体最佳
fitnessgbest = fitness;     % 个体最佳适应度值
fitnesszbest = bestfitness;   % 全局最佳适应度值
%% 迭代寻优
for i = 1: maxgen
       for j = 1:sizepop
            % 速度更新
            V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));  
            % 速度越界检查
            V(j,find(V(j,:)>Vmax)) = Vmax;   
            V(j,find(V(j,:)<Vmin)) = Vmin;
            % 种群更新
            pop(j,:) = pop(j,:) + V(j,:);
            % 个体范围越界检查
            pop(j,find(pop(j,:)>popmax)) = popmax;
            pop(j,find(pop(j,:)<popmin)) = popmin;
            % 适应度值计算
            fitness(j) = fit(pop(j,:)); 
       end
       for j = 1:sizepop
        % 个体最优更新
        if fitness(j) > fitnessgbest(j)
            gbest(j,:) = pop(j,:);
            fitnessgbest(j) = fitness(j);
        end
        % 全局最优更新
        if fitness(j) > fitnesszbest
            zbest = pop(j,:);
            fitnesszbest = fitness(j);
        end
       end 
    % 记录每一代的最优值
    bestx(i) = zbest(1);
    besty(i) = zbest(2);
    yy(i) = fitnesszbest;   
    disp(['迭代次数:',num2str(i),',最大值为:',num2str(yy(i)),',坐标:',num2str(bestx(i)),',',num2str(besty(i))]);
end
%% 输出结果并绘图

x = -3:0.01:3;
y = -3:0.01:3;
[X,Y]=meshgrid(x,y);
z = 3*(1-X).^2.*exp(-(X.^2) - (Y+1).^2) - 10*(X/5 - X.^3 - Y.^5).*exp(-X.^2-Y.^2) - 1/3*exp(-(X+1).^2 - Y.^2);
mesh(x,y,z);
hold on
plot3(bestx,besty,yy,'r.','MarkerSize',10);

输出结果:

在这里插入图片描述

红点为每轮迭代的最优粒子点。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183795.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux 渗透工具_适用于Linux的十大最佳渗透测试工具[通俗易懂]

    linux 渗透工具_适用于Linux的十大最佳渗透测试工具[通俗易懂]linux渗透工具ThisarticlecoverssomeofthebestpenetrationtestingtoolsforLinuxCybersecurityisabigconcernforbothsmallandbigorganizations.Inanagewheremoreandmorebusinessesaremov…

    2022年8月12日
    5
  • 帮谷歌推广Webp图片格式之:Webp的格式转换

    帮谷歌推广Webp图片格式之:Webp的格式转换

    2022年2月9日
    84
  • Linux,DNS服务器配置

    Linux,DNS服务器配置安装bind,bind-chroot,DNS基本配置:找对地,起对名,写对内容。启动DNS服务器并更改本机DNS服务器地址,测试DNS服务器,易错点分析。

    2022年6月4日
    29
  • 卷王指南,大学计算机专业,面临分专业,计科,软工,大数据,物联网,网络工程,该选什么?

    卷王指南,大学计算机专业,面临分专业,计科,软工,大数据,物联网,网络工程,该选什么?同学们好,我是王老师——二哥呀!(笑喷)好巧!前几天有同学私信问过我这个问题:大学计算机专业,面临分专业,计科,软工,大数据,物联网,网络工程,该选什么?再加上高考结束后填报志愿,想必CSDN上有很多同学挺迷茫的。我就来(主观地)一一分析下,从后往前。网络工程,听起来还算是蛮高端大气上档次的,大家可以去百度百科或者维基百科看一下这个专业的解释。我的理解是网络工程是将计算机以及其他设备串联完成网络通信,以及智能化监控的学科。主要的分支有:路由交换、网络安全、无线网络等等。我之前在的一个公司(十年

    2022年6月9日
    44
  • 静态代理详解[通俗易懂]

    静态代理详解[通俗易懂]1.什么是静态代理?代理这个词是来源于Java设计模式中的代理模式,代理模式最简单的理解就是通过第三方来代理我们的工作比如中介,房东需要将自己的房子租出去,而租客需要租房子,三者关系如此租客租房子一般都找不到房东,房东也不会轻易将自己暴露给广大租客,因此就需要中介来充当这个中间关系因此租客就只能通过中介来进行租房子这个工作,不需要通过房东,这就叫做代理—-就是中介代理房东来处理租房子这件事情那么我们应用于Java中又是什么样的情况呢?首先创建一个主题接口(别问为什么创建接口,J.

    2022年10月16日
    3
  • .netcore 文件上传转为base64位字符串

    .netcore 文件上传转为base64位字符串.netcore 文件上传转为base64位字符串

    2022年4月22日
    322

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号