粒子群算法的基本原理和Matlab实现

1.案例背景

1.1 PSO算法介绍

        粒子群优化算法(Particle Swarm Optimization,PSO)是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早是由Kennedy和 Eberhart 在1995年提出的。PSO算法源于对鸟类捕食行为的研究,鸟类捕食时,每只鸟找到食物最简单有效的方法就是搜寻当前距离食物最近的鸟的周围区域。
        PSO算法是从这种生物种群行为特征中得到启发并用于求解优化问题的,算法中每个粒子都代表问题的一个潜在解,每个粒子对应一个由适应度函数决定的适应度值。粒子的速度决定了粒子移动的方向和距离,速度随自身及其他粒子的移动经验进行动态调整,从而实现个体在可解空间中的寻优。
        PSO算法首先在可解空间中初始化一群粒子,每个粒子都代表极值优化问题的一个潜在最优解,用位置、速度和适应度值三项指标表示该粒子特征,适应度值由适应度函数计算得到,其值的好坏表示粒子的优劣。粒子在解空间中运动,通过跟踪个体极值 Pbest和群体极值Gbest更新个体位置;个体极值Pbest是指个体所经历位置中计算得到的适应度值最优位置,群体极值Gbest是指种群中的所有粒子搜索到的适应度最优位置。粒子每更新一次位置,就计算一次适应度值,并且通过比较新粒子的适应度值和个体极值、群体极值的适应度值更新个体极值 Pbest和群体极值 Gbest位置。
        假设在一个D维的搜索空间中,有n个粒子组成的种群X=(X1,X1 ,…,Xn),其中第i个粒子表示为一个D维的向量Xi=[xi1,xi22,…,xiD],代表第i个粒子在D维搜索空间中的位置,亦代表问题的一个潜在解。根据目标函数即可计算出每个粒子位置X对应的适应度值。第i个粒子的速度为Vi=[Vi1 ,Vi2.…,ViD],其个体极值为Pi=[Pi1,Pi2,…,PiD],种群的全局极值为Pg=[Pg1,Pg2,…,PgD]。
        在每一次迭代过程中,粒子通过个体极值和全局极值更新自身的速度和位置,更新公式如下:

1.2 非线性函数

        算例中的非线性函数为:

        从函数图形可以看出,该函数有很多局部极小值点,最小值点为0,最小值位置为(0,0)。

2.模型建立

        基于PSO算法的函数极值寻优算法流程图如图35-2所示。

        其中,粒子和速度初始化对初始粒子位置和粒子速度赋予随机值。根据式(35-3)计算粒子适应度值。根据初始粒子适应度值确定个体极值和群体极值。根据式(35-1)与式(35-2)更新粒子速度和位置。根据新种群中粒子适应度值更新个体极值和群体极值。
        对于本案例来说,适应度函数为Ackley函数表达式,适应度值为函数值。种群粒子数为20,每个粒子的维数为2,算法迭代进化次数为100。

3.编程实现

        根据PSO算法原理,在 MATLAB中编程实现基于 PSO算法的函数极值寻优算法。

3.1 适应度函数

function y = fun(x)
%函数用于计算粒子适应度值
%x           input           输入粒子 
%y           output          粒子适应度值 y=-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+exp(1);%y=x(1)^2-10*cos(2*pi*x(1))+10+x(2)^2-10*cos(2*pi*x(2))+10;

3.2 主函数

%% 该代码为基于PSO的函数极值寻优%% 清空环境
clc
clear%% 参数初始化
%粒子群算法中的两个参数
c1 = 1.49445;
c2 = 1.49445;maxgen=500;   % 进化次数  
sizepop=100;   %种群规模Vmax=1;
Vmin=-1;
popmax=5;
popmin=-5;%% 产生初始粒子和速度
for i=1:sizepop%随机产生一个种群pop(i,:)=5*rands(1,2);    %初始种群V(i,:)=rands(1,2);  %初始化速度%计算适应度fitness(i)=fun(pop(i,:));   %染色体的适应度
end%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:);   %全局最佳
gbest=pop;    %个体最佳
fitnessgbest=fitness;   %个体最佳适应度值
fitnesszbest=bestfitness;   %全局最佳适应度值%% 迭代寻优
for i=1:maxgenfor j=1:sizepop%速度更新V(j,:) = 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,:)+0.5*V(j,:);pop(j,find(pop(j,:)>popmax))=popmax;pop(j,find(pop(j,:)<popmin))=popmin;%适应度值fitness(j)=fun(pop(j,:)); endfor j=1:sizepop%个体最优更新if fitness(j) < fitnessgbest(j)gbest(j,:) = pop(j,:);fitnessgbest(j) = fitness(j);end%群体最优更新if fitness(j) < fitnesszbestzbest = pop(j,:);fitnesszbest = fitness(j);endend yy(i)=fitnesszbest;    end
%% 结果分析
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

3.3 运行说明

        首先将适应度函数代码单独保存为fun.m文件,然后新建一个文件存放主函数,运行即可得到结果:

        最终得到的最优个体适应度值为0.00000328,对应的粒子位置为(7.07633222538084e-05  ,  -0.000102163303292990),PSO算法寻优得到最优值接近函数实际最优值,说明PSO算法具有较强的函数极值寻优能力。

4 案例扩展

4.1自适应变异

        粒子群优化算法收敛快,具有很强的通用性,但同时存在着容易早熟收敛、搜索精度较低、后期迭代效率不高等缺点。借鉴遗传算法中的变异思想,在 PSO算法中引人变异操作,即对某些变量以一定的概率重新初始化。变异操作拓展了在迭代中不断缩小的种群搜索空间,使粒子能够跳出先前搜索到的最优值位置,在更大的空间中开展搜索,同时保持了种群多样性,提高算法寻找到更优值的可能性。因此,在普通粒子群算法的基础上引入了简单变异算子,基本思想就是粒子每次更新之后,以一定概率重新初始化粒子,MATLAB代码如下


%% 该代码为基于变异粒子群算法的函数极值寻优算法
%% 清空环境
clc
clear%% 参数初始化
%粒子群算法中的两个参数
c1 = 1.49445;
c2 = 1.49445;maxgen=500;   % 进化次数  
sizepop=100;   %种群规模Vmax=1;
Vmin=-1;
popmax=5;
popmin=-5;%% 产生初始粒子和速度
for i=1:sizepop%随机产生一个种群pop(i,:)=5*rands(1,2);    %初始种群V(i,:)=rands(1,2);  %初始化速度%计算适应度fitness(i)=fun(pop(i,:));   %染色体的适应度
end%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:);   %全局最佳
gbest=pop;    %个体最佳
fitnessgbest=fitness;   %个体最佳适应度值
fitnesszbest=bestfitness;   %全局最佳适应度值%% 迭代寻优
for i=1:maxgenfor j=1:sizepop%速度更新V(j,:) = 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,:)+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,2);end%适应度值fitness(j)=fun(pop(j,:)); endfor j=1:sizepop%个体最优更新if fitness(j) < fitnessgbest(j)gbest(j,:) = pop(j,:);fitnessgbest(j) = fitness(j);end%群体最优更新if fitness(j) < fitnesszbestzbest = pop(j,:);fitnesszbest = fitness(j);endend yy(i)=fitnesszbest;    end
%% 结果分析
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
web browser www.matlabsky.com

4.2 惯性权重的选择

        惯性权重w体现的是粒子当前速度多大程度上继承先前的速度,Shi.Y最先将惯性权重w引人到 PSO算法中,并分析指出一个较大的惯性权值有利于全局搜索,而一个较小的惯性权值则更利于局部搜索。为了更好地平衡算法的全局搜索与局部搜索能力,其提出了线性递减惯性权重(Linear Decreasing Inertia Weight,LDIW),即

4.3 动态粒子群算法

        基本 PSO算法在很多领域的静态优化问题中得到了广泛的应用,但是在实际环境中遇到的问题一般比较复杂,且往往随时间变化,也就是说问题最优解是动态改变的。例如,在物流配送过程中,由于受到客户优先级、交通状况等因素变化的影响,物流配送问题也相应地发生变化。对于这种需要跟踪动态极值的问题,基本 PSO算法难以解决。为了跟踪动态极值,最常用的方法是对基本 PSO算法做两方面的关键改进:第一是引入探测机制,使种群或粒子获得感知外部环境变化的能力;第二是引入响应机制,在探测到环境的变化后,采取某种响应方式对种群进行更新,以适应动态环境。可以采用带敏感粒子的 PSO算法实现动态环境寻优。带敏感粒子的PSO算法在环境中随机选择一个或若干个位置,这些位置称为敏感粒子,每次迭代中计算敏感粒子的适应度值,当发现适应度值变化时,认为环境已发生变化,敏感粒子适应度值变化超过一定阈值时 PSO算法作出响应。响应的方式是按比例重新初始化粒子位置和粒子速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621866.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【集合学习ConcurrentHashMap】ConcurrentHashMap集合学习

ConcurrentHashMap集合学习 一、JDK1.7 和 1.8 版本ConcurrenHashMap对比分析 JDK 1.7版本 在JDK 1.7版本ConcurrentHashMap使用了分段锁的方式&#xff08;对Segment进行加锁&#xff09;&#xff0c;其实际结构为&#xff1a;Segment数组 HashEntry数组 链表。由很多个 …

I^2C总线简介

总共有五种工作状态&#xff1a; A&#xff1a;总线非忙状态 该状态时数据线&#xff08;SDA&#xff09;和时钟线&#xff08;SCL&#xff09;都保持高电平。 B&#xff1a;启动状态 当时钟线&#xff08;SCL&#xff09;为高电平状态时&#xff0c;数据线&#xff08;SDA&…

Docker镜像列表中的none:none是什么

在构建过Docker镜像的电脑上查看本地镜像列表&#xff0c;有可能看到下图红框中的镜像&#xff0c;在列表中展示为<none>:<none>&#xff1a; 这种镜像在Docker官方文档中被称作dangling images&#xff0c;指的是没有标签并且没有被容器使用的镜像。 官方解释 …

三、JVM监控及诊断工具-GUI篇

目录 一、工具概述二、jconsole&#xff08;了解即可&#xff09;1、基本概述2、启动3、三种连接方式4、作用 三、Visual VM 一、工具概述 二、jconsole&#xff08;了解即可&#xff09; 1、基本概述 从Java5开始&#xff0c;在JDK中自带的Java监控和管理控制台用于对JVM中内…

系统架构设计高级技能 · Web架构

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 Web架构 一、Web架构介绍1.1 Web架构涉及技术1.2 单台服务…

计算机组成原理 | 第一章 计算机系统概述

目录 计算机发展历程 计算机系统层次结构 计算机的性能指标 计算机发展历程 电子计算机的发展已经历了4代&#xff0c;这4代计算机的主要元件分别是电子管、晶体管、中小规模集成电路、大规模集成电路。微型计算机的发展以微处理器技术为标志。可以在计算机中直接执行的语…

快到家了【经济学人】

Refugees Almost home China has successfully absorbed many refugees from Vietnam. But it is ill-prepared for another influx Oct 10th 2015 | QIAOGANG, GUANGXI PROVINCE | From the print edition 来源&#xff1a;Economist 翻译&#xff1a;Z.K. IN A restaurant…

军事物联网如何改变未来战争模式?

军事物联网如何改变未来战争模式&#xff1f; 2017-05-08 17:45:17.0 你是否听说&#xff0c;在物联网的世界里&#xff0c;每一粒沙子都将拥有自己的IP地址。 互联网为我们创造了虚拟世界&#xff0c;与其一字之差的物联网&#xff0c;却为我们开辟了一个从虚拟转向现实的窗口…

去越南旅游,2万人民币能承担几天的花销?

2万人民币可以兑换6600多万越南盾,三年前我有一个同学带着一万块人民币,当时在越南生活了差不多三个月的时间。他之所以会去越南,主要是当时听人家说在越南农村好找老婆,并且彩礼会非常的少,所以就带着一万块钱先去看一看。虽然人回来的时候瘦了点黑了点,但是三个多月只花…

基于springboot学生社团管理系统/基于Java的高校社团管理系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

QChart——折线

Qchart的图形显示依附于QChartView&#xff0c;创建一个QChartView继承类&#xff0c;通过窗口部件的提升进行图表的显示 一、简单认识QLineSeries QLineSeries属于折线类&#xff0c;它继承于QXYSeries类&#xff0c;可以使用QXYSeries类所有方法&#xff0c;对折线进行属性设…

前端需要理解的性能优化知识

优化的目的是展示更快、交互响应快、页面无卡顿情况。 1 性能指标 2 分析方法 使用 ChromeDevTool 作为性能分析工具来观察页面性能情况。其中Network观察网络资源加载耗时及顺序&#xff0c;Performace观察页面渲染表现及JS执行情况&#xff0c;Lighthouse对网站进行整体评分…

基于android的学生公寓后勤系统/学生公寓管理系统APP

摘 要 随着网络科技的发展&#xff0c;移动智能终端逐渐走进人们的视线&#xff0c;相关应用越来越广泛&#xff0c;并在人们的日常生活中扮演着越来越重要的角色。因此&#xff0c;关键应用程序的开发成为影响移动智能终端普及的重要因素&#xff0c;设计并开发实用、方便的应…

PCB设计常见问题

Fill Mode中存在3个选项 Solid&#xff08;Copper Regions&#xff09; Hatched&#xff08;Tracks/arcs&#xff09; None&#xff08;outlines&#xff09; 区别Solid&#xff08;Copper Regions&#xff09;过大电流的能力更强&#xff0c;且对于电路板存在的分布电容的干扰…

第三张鼠标键盘的高效使用

引言: 对于键盘的熟练使用更是一个网络时的基本技能所有要成为一个好的网络工程师我们应该熟练键盘操作已经能熟练的使用一些常用软件。––键盘和鼠标。速速度的唯一途径就是多演戏打字速快对今后的学习是有好处的。 一 鼠标和键盘 键盘和鼠标是两种常用的输入设备。 (一…

鼠标跟随的实现

鼠标跟随主要根据X,Y轴来计算 主要代码函数是 span[0].style.left event.clientX “px”; 计算X轴 span[0].style.top event.clientY “px”; 计算Y轴 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title>&…

虚拟机Ubuntu内鼠标闪烁终极解决方案

话说这个问题很早就遇到了&#xff0c;最近才解决&#xff0c;不免唏嘘。 由于造成鼠标闪烁的原因有很多&#xff0c;鼠标闪烁的特点也有很多&#xff0c;因此网上也充斥着很多解决方案&#xff0c;这里一并做一下梳理&#xff0c;以节约各位看众时间。 1.通用解决方法 这个方…

数据结构--树4.2.1(二叉树)

目录 一、二叉树的存储结构 二、二叉树的遍历 一、二叉树的存储结构 顺序存储结构&#xff1a;二叉树的顺序存储结构就是用一维数组存储二叉树中的各个结点&#xff0c;并且结点的存储位置能体现结点之间的逻辑关系。 链式存储结构&#xff1a;二叉树每个结点最多只有两个孩…

手把手带你学python自动化测试(五)——鼠标键盘操作

在浏览器中&#xff0c;通常会用到鼠标来进行操作&#xff0c;比如右键菜单中选择一个操作&#xff0c;在 selenium 中提供了下列鼠标相关操作。 ActionChains 类似提供了以下方法&#xff1a; context_click() 右击 double_click() 双击 drag_and_drop() 拖拽 鼠标右击 …

7,鼠标学习二

《鼠标学习一》描述的是鼠标在客户区情况下&#xff0c; 当鼠标在非客户区的时候呢&#xff1f; 窗口的非客户区包括&#xff1a;标题栏&#xff0c;菜单和窗口滚动条&#xff0c;系统一般不需要用户处理非客户区消息&#xff0c;只要将其发送个DefWindowProc即可&#xff0c…