讲解最到位的粒子群算法,附matlab代码求解函数最优值

讲解最到位的粒子群算法,附matlab代码求解函数最优值从鸟群觅食行为到粒子群算法粒子群算法的核心例:求解函数最小值粒子群算法的驱动因素从鸟群觅食行为到粒子群算法鸟群寻找食物的过程中,鸟与鸟之间存在着信息的交换,每只鸟搜索目前离食物最近的鸟的周围区域是找到食物的最简单有效的办法。粒子群算法(以下简称PSO)就是模拟鸟群觅食行为的一种彷生算法。解=粒子=鸟(鸟的位置象征着离食物的距离,粒子的位置也象征着…

大家好,又见面了,我是你们的朋友全栈君。

从鸟群觅食行为到粒子群算法

这里写图片描述

鸟群寻找食物的过程中,鸟与鸟之间存在着信息的交换,每只鸟搜索目前离食物最近的鸟的周围区域是找到食物的最简单有效的办法。

粒子群算法(以下简称PSO)就是模拟鸟群觅食行为的一种彷生算法 。 解=粒子=鸟 (鸟的位置象征着离食物的距离,粒子的位置也象征着离最优解的距离,是评价解质量的唯一标准), 找食物=找最优解,一个西瓜=一个粒子找到的历史最优解,一块肉=整个粒子群找到历史最优解 ,

就像鸟的飞行路线会受到自己曾经寻找到的最优食物和鸟群曾经找到过的最优食物的双重影响一样,算法中,每一次迭代,粒子通过两个”极值”(全局历史最优解gBest和个体历史最优解pBest)来更新自己的速度,该速度又是更新粒子位置的关键,而粒子的位置象征着离最优解的距离,也是评价该粒子(解)的唯一标准 。

粒子群算法的核心

该算法的核心是如何根据pBest与gBest来更新粒子的速度和位置,标准粒子群给出了如下的更新公式:

$ V_{t+1} =w \cdot V_t +c_1r_1\cdot(pBest-X_t) +c_2r_2\cdot(gBest-X_t) $

X t + 1 = X t + V t + 1 X_{t+1} = X_t+V_{t+1} Xt+1=Xt+Vt+1

$其中 , t:代数 , X是位置,V是速度,w是惯性权重,c是学习因子,r是随机数 $

这里写图片描述

如上图所示,假设这是一个在2维平面内寻找最优解的待求解问题,某一时间的某一粒子 X t X_t Xt处在原点位置 。则该粒子更新后的速度如上图所示 。 更新公式可以分为三个部门:

  • Part.1 : “惯性”或”动量”部分,反映粒子有维持自己先前速度的趋势
  • Part.2 : “认知”部门 , 反映粒子有向自身历史最优位置逼近的趋势
  • Part.3 : “社会”部门 , 反映粒子有向去群体历史最优位置逼近的趋势

例 : 求解函数最小值

​ 求$f(x)=\sum_{i=1}{n}x_i2,(-20 \leq x\leq 20,n=10) $ 的最小值 ?

% author zhaoyuqiang
clear all ;
close all ;
clc ;
N = 100 ; % 种群规模
D = 10 ; % 粒子维度
T = 100 ; % 迭代次数
Xmax = 20 ;
Xmin = -20 ;
C1 = 1.5 ; % 学习因子1
C2 = 1.5 ; % 学习因子2
W = 0.8 ; % 惯性权重
Vmax = 10 ; % 最大飞行速度
Vmin = -10 ; % 最小飞行速度
popx = rand(N,D)*(Xmax-Xmin)+Xmin ; % 初始化粒子群的位置(粒子位置是一个D维向量)
popv = rand(N,D)*(Vmax-Vmin)+Vmin ; % 初始化粒子群的速度(粒子速度是一个D维度向量) 
% 初始化每个历史最优粒子
pBest = popx ; 
pBestValue = func_fitness(pBest) ; 
%初始化全局历史最优粒子
[gBestValue,index] = max(func_fitness(popx)) ;
gBest = popx(index,:) ;
for t=1:T
    for i=1:N
        % 更新个体的位置和速度
        popv(i,:) = W*popv(i,:)+C1*rand*(pBest(i,:)-popx(i,:))+C2*rand*(gBest-popx(i,:)) ;
        popx(i,:) = popx(i,:)+popv(i,:) ;
        % 边界处理,超过定义域范围就取该范围极值
        index = find(popv(i,:)>Vmax | popv(i,:)<Vmin);
        popv(i,index) = rand*(Vmax-Vmin)+Vmin ; %#ok<*FNDSB>
        index = find(popx(i,:)>Xmax | popx(i,:)<Xmin);
        popx(i,index) = rand*(Xmax-Xmin)+Xmin ;
        % 更新粒子历史最优
        if func_fitness(popx(i,:))>pBestValue(i)    
           pBest(i,:) = popx(i,:) ;
           pBestValue(i) = func_fitness(popx(i,:));
        end
       if pBestValue(i) > gBestValue
            gBest = pBest(i,:) ;
            gBestValue = pBestValue(i) ;
       end
    end
    % 每代最优解对应的目标函数值
    tBest(t) = func_objValue(gBest); %#ok<*SAGROW>
end
figure
plot(tBest);
xlabel('迭代次数') ;
ylabel('适应度值') ;
title('适应度进化曲线') ;

完整代码下载:https://download.csdn.net/download/g425680992/10502951

这里写图片描述

粒子群算法的驱动因素

粒子群算法是一种随机搜索算法 。粒子的下一个位置受到自身历史经验和全局历史经验的双重影响,全局历史经验时刻左右着粒子的更新,群体中一旦出现新的全局最优,则后面的粒子立马应用这个新的全局最优来更新自己,大大提高了效率,相比与一般的算法(如遗传算法的交叉),这个更新过程具有了潜在的指导,而并非盲目的随机 。

自身历史经验和全局历史经验的比例尤其重要,这能左右粒子的下一个位置的大体方向,所以,粒子群算法的改进也多种多样,尤其是针对参数和混合其他算法的改进 。

总体来说,粒子群算法是一种较大概率收敛于全局最优解的,适合在动态、多目标优化环境中寻优的一种高效率的群体智能算法。

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

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

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


相关推荐

  • nginx启动成功_centos重启服务器命令

    nginx启动成功_centos重启服务器命令文章目录启动Nginx停止nginxservice服务脚本Nginx开机自启启动Nginxnginx安装完成后,切换到nginx安装目录中的sbin目录(如果在执行./configure没有指定额外的参数,则sbin目录为默认目录,否则切换到自定义目录),通过执行该目录下nginx编译后的二进制文件即可启动程序。cd/usr/local/nginx/sbin/nginx./nginx执行上面的操作后,成功启动nginx,程序是没有任何提示的。我们可以使用ps命令查看nginx的运行状态

    2022年8月13日
    4
  • gb50174-2017数据中心机房等级标准_计算机机房设计标准GB50174

    gb50174-2017数据中心机房等级标准_计算机机房设计标准GB501742.0.1数据中心datacenter为集中放置的电子信息设备提供运行环境的建筑场所,可以是一栋或几栋建筑物,也可以是一栋建筑物的一部分,包括主机房、辅助区、支持区和行政管理区等。2.0.2灾备数据中心businessrecoverydatacenter用于灾难发生时,接替生产系统运行,进行数据处理和支持关键业务功能继续运作的场所,包括限制区、普通区和专用区。2.0.3主机房c…

    2022年10月2日
    0
  • 操作系统存储管理之虚拟存储与分页式虚拟存储系统

    操作系统存储管理之虚拟存储与分页式虚拟存储系统虚拟存储实现思路在实际运行过程,把有关作业的全部信息都装入主存储器后,作业执行时实际上不是同时使用全部信息的,有些部分运行一遍便再也不用,甚至有些部分在作业执行的整个过程中都不会被使用到(如错误处理部分)。进程在运行时不用的,或暂时不用的,或某种条件下才用的程序和数据,全部驻留于内存中是对宝贵的主存资源的一种浪费,大大降低了主存利用率。于是,提出了这样的问题:作业提交时,先全部进入辅助存储器,作

    2022年9月26日
    0
  • Qt自定义控件–电池

    Qt自定义控件–电池Qt自定义控件-电池如有建议或发现bug,还请大佬们指出。持续更新如需要,留言。

    2022年5月16日
    39
  • 用js来实现那些数据结构13(树01-二叉搜索树的实现)

    前一篇文章我们学会了第一个非顺序数据结构hashMap,那么这一篇我们来学学树,包括树的概念和一些相关的术语以及二叉搜索树的实现。唉?为什么不是树的实现,不是二叉树的实现。偏偏是二叉搜索树的实现?嗯,

    2022年3月25日
    38
  • 语义分割(Semantic Segmentation)方法「建议收藏」

    语义分割(Semantic Segmentation)方法「建议收藏」翻译来自:https://gist.github.com/khanhnamle1994/e2ff59ddca93c0205ac4e566d40b5e88语义分割方面的资源:https://github.com/mrgloom/awesome-semantic-segmentation1.什么是语义分割语义分割是当今计算机视觉领域的关键问题之一。从宏观上看,语义分割是一项高层次的任务,…

    2022年6月8日
    24

发表回复

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

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