粒子群优化函数--particleswarm函数的用法与讨论

news/2024/9/21 12:26:52/文章来源:https://www.cnblogs.com/dlmuwxw/p/18369846

particleswarm函数是matlab自带的粒子群优化算法,其使用自适应的邻域模式搜索最优解,比我们之前自己写的代码要好得多,本章我们来讨论一下其思想与参数设置

目录
  • 一、自适应的邻域模式
    • 1.全局模式与邻域模式
    • 2.全局模式的优劣
    • 3.邻域模式的优劣
    • 4.何为“自适应”
  • 二、预设参数的选取
    • 1.粒子个数SwarmSize
    • 2.惯性权重与学习因子
    • 3.邻域内粒子的比例MinNeighborsFraction
  • 三、自动退出迭代循环
    • 1.最大停滞迭代次数与容忍度
    • 2.最大迭代次数
    • 3.可视化迭代图形
    • 4.混合函数求解
  • 四、代码求解极值问题
    • 1.函数语法
    • 2.问题提出
    • 3.代码求解
  • 五、修改函数的参数
    • 1.绘制最佳的函数值随迭代次数的变化图
    • 2.展示函数的迭代过程
    • 3.修改粒子数量
    • 4.在粒子群算法结束后继续调用其他函数进行混合求解
    • 5.最大的迭代次数
    • 6.领域内粒子的比例
    • 7.函数容忍度与最大停滞迭代数
  • 六、函数参数修改的建议

一、自适应的邻域模式

在我们前面对粒子群算法的优化讨论中,核心思想就是根据不同的情况,修改惯性权重w,与c1和c2。而matlab自带的算法使用的调整参数的方法则更加先进

1.全局模式与邻域模式

在观察鸟群觅食的过程中注意到,通常飞鸟并不一定看到鸟群中其他所有飞鸟的位置和方向,往往只是看到相邻的飞鸟的位置和方向。因此他在研究粒子群算法时,同时开发了两种模式:全局模式(gbest)和邻域模式(lbest)

2.全局模式的优劣

全局模式是指粒子群在搜索过程中将所有其他粒子都视为邻域粒子,它可以看做是邻域模式的极端情况,基本粒子群算法即属于全局模式。其优点是粒子邻域个体多,粒子群内的信息交流速度快,使得粒子群算法具有较快的收敛速度,但在一定程度上会降低粒子多样性,易陷人局部最优。

3.邻域模式的优劣

邻域模式是指粒子群在搜索过程中只将其周围部分粒子视为邻域粒子,这种模式使得粒子群可以被分割成多个不同的子群体,有利于在多个区域进行搜索,避免算法陷人局部最优。

4.何为“自适应”

自适应体现在:如果适应度开始停滞时,粒子群搜索会从邻域模式向全局模式转换。一旦适应度开始下降,则又恢复到邻域模式,以免陷入局部最优。当适应度的停滞次数足够大时,惯性系数开始逐渐变小,从而利于局部搜索。搜索初期使用邻域模式较好,后期使用全局模式

二、预设参数的选取

1.粒子个数SwarmSize

默认设置为:min{100,10*nvars}, nvars是变量个数

2.惯性权重与学习因子

惯性权重InertiaRange默认设置的范围为:[0.1,1.1],个体学习因子SelfAdjustmentWeight与社会学习因子SocialAdjustmentWeight默认设置为:1.49 (和压缩因子的系数几乎相同)

3.邻域内粒子的比例MinNeighborsFraction

默认设置为:0.25,由于采取的是邻域模式,因此定义了一个“邻域最少粒子数目”:minNeighborhoodSize = max{2,(粒子数目*邻域内粒子的比例)的整数部分},在迭代开始后,每个粒子会有一个邻域,初始时邻域内的粒子个数(记为Q)就等于“邻域最少粒子数目”,后续邻域内的粒子个数Q会自适应调整。

三、自动退出迭代循环

Matlab自带的粒子群函数可以设置几种自动退出迭代循环的方法

1.最大停滞迭代次数与容忍度

MaxStallIterations and FunctionTolerance;前者为最大停滞迭代次数,默认为20,也就是说迭代20次后,适应度没有优化则退出迭代。后者为容忍度,默认为1e-6;
Exit Flag=1;其为跳出参数

2.最大迭代次数

MaxIterations;默认值为200*nvars,若超过这个数,则退出迭代
Exit Flag=0;

3.可视化迭代图形

OutputFcn or PlotFcn;在迭代的过程中看到图形,可以随时暂停和停止
Exit Flag=-1;

4.混合函数求解

MaxTime;如果是第一种方式退出迭代的话,我们可以将粒子群算法得到的解作为初始值,继续调用其他的函数来进行混合求解,例如我们熟悉的fmincon函数(我测试发现以第二种退出好像也可以调用求他函数混合求解)
Exit Flag=-5

四、代码求解极值问题

1.函数语法

由于matlab只能求最小值问题,如果求最大值的话要在目标函数前加负号
[x,fval,exitflag,output] = particleswarm(@Obj_fun2, narvs, x_lb, x_ub)
输入的第一个参数是我们的一个函数文件,用@符号来引导;第二个参数则是变量的个数;第三第四个分别为上下界。
输出的前两个变量即为我们的变量取值与函数值。第三个变量是一个常数,其意义是告诉我们迭代是从种情况跳出的;
第四个变量为一个结构体,我们只需要关注两个信息。(1)iterations为迭代的次数(2)message,告诉我们以何种方式跳出迭代

2.问题提出

求解函数y = x12+x22-x1x2-10x1-4*x2+60在[-15,15]内的最小值(最小值为8)

3.代码求解

narvs = 2; % 变量个数
x_lb = [-15 -15]; % x的下界(长度等于变量的个数,每个变量对应一个下界约束)
x_ub = [15 15]; % x的上界
[x,fval,exitflag,output] = particleswarm(@Obj_fun2, narvs, x_lb, x_ub)  

五、修改函数的参数

1.绘制最佳的函数值随迭代次数的变化图

options = optimoptions('particleswarm','PlotFcn','pswplotbestf')   
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

2.展示函数的迭代过程

在matlab下方的输出框展示每次迭代的结果

options = optimoptions('particleswarm','Display','iter');
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

3.修改粒子数量

options = optimoptions('particleswarm','SwarmSize',50); %默认的是:min(100,10*nvars)
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

4.在粒子群算法结束后继续调用其他函数进行混合求解

options = optimoptions('particleswarm','HybridFcn',@fmincon);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

5.最大的迭代次数

options = optimoptions('particleswarm','MaxIterations',10000); %,默认的是200*nvars
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

6.领域内粒子的比例

options = optimoptions('particleswarm','MinNeighborsFraction',0.2); %默认是0.25 
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

7.函数容忍度与最大停滞迭代数

options = optimoptions('particleswarm','FunctionTolerance',1e-12,'MaxStallIterations',100); % 默认1e-6与20
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

六、函数参数修改的建议

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FLink1.17-Kafka实时同步到MySQL实践

1.组件版本组件版本Kafka3.7.0Flink1.17.0MySQL8.0.32 2.Kafka生产数据 ./kafka-console-producer.sh --broker-list hadoop01:9092,hadoop02:9092,hadoop03:9092 --topic kafka_test_table2 >{"id":123,"test_age":33} >{"id":125,&…

[Paper Reading] Reconstructing Hands in 3D with Transformers

名称 Reconstructing Hands in 3D with Transformers 时间:CVPR2024 机构:UC Berkeley, University of Michigan, New York University TL;DR 本文提出一种使用Transformer来做Hand Tracking的算法名为HaMeR(Hand Mesh Recorvery),优势是大数据规模(利用多数据集的2D/3D标签…

“就是打一打”清华程思元打出百度之星20年史上罕见两连冠

8月18日,被称为“技术界奥斯卡”的2024百度之星程序设计大赛(以下简称“百度之星” )落下帷幕。近千人同场敲代码、中学生几乎垄断奖项、背靠背冠军诞生……百度之星像中国编程次世代的技术嘉年华,越来越多人加入其中。近千学霸角逐“编程奥斯卡”,初小学生比例创新高 百度…

企业级Scrum敏捷赋能课程:为企业量身定制的敏捷开发培训,旨在提升团队协作与项目交付能力,实现敏捷管理的落地。

​ ​ 课程简介: Scrum 是一种广泛应用的敏捷开发方法,用于项目管理和产品研发。该课程为期两天,专为研发管理者、项目经理、产品经理和研发团队设计。通过案例讲解和沙盘演练,学员将深入理解Scrum的核心理念,如产品价值驱动、以用户为中心、快速迭代和增量交付,掌握自管…

使用对比!SLS 数据加工 SPL 与旧版 DSL 场景对照

这里我们继续讨论在不同的数据处理需求中,新版数据加工 SPL 与旧版数据加工 DSL 的使用对照。对于数据同步的场景,即不需要做任何数据处理,新版 SPL 与旧版 DSL 均传入空逻辑即可,以下不再赘述。作者:灵圣 概述 如前一篇《SLS 数据加工全面升级,集成 SPL 语法》所述,SLS…

Jenkins与gitlab持续集成配置webhook报500错误

Hook execution failed: Failed to open TCP connection to localhost:8585 (Connection refused - connect(2) for "localhost" port 8585) 在点击push events进行测试Jenkins时,出现上图,是因为gitlab没有打开一项权限,做如下设置即可

在孩子成长路上,爱与智慧的陪伴是送给孩子最好的礼物

如今智能设备的普及、社交媒体的兴起和娱乐方式的碎片化,使我们时刻被各种信息和刺激包围,这种环境对正处于成长期的儿童影响尤为显著,他们更容易被快节奏、高刺激的内容吸引,导致专注力下降,从而影响学习和认知能力的发展。针对这一现实挑战,数业智能心大陆推出了AI儿童…

TXT 记录解析怎么做?

在当今数字化的时代,网络技术的应用越来越广泛,而域名系统(DNS)则是网络通信中至关重要的一部分。TXT 记录作为 DNS 中的一种记录类型,有着特定的用途和解析方法。 那么,TXT 记录解析究竟该怎么做呢? 一、了解 TXT 记录的概念 TXT 记录,即文本记录,是一种可以存储任意…

Kubernetes基础命令

Kubernetes 提供 kubectl 是使用 Kubernetes API 与 Kubernetes 集群的控制面进行通信的命令行工具。 这个工具叫做 kubectl。 针对配置信息,kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。 你可以通过设置 KUBECONFIG 环境变量或设置 --kubeconfig 参数来指…

CRMEB多商户版前端页面安装依赖要点

CRMEB多商户版CRMEB_Mer_v2.3.2(20240710源码包).zip安装环境如下(很重要)平台管理-admin端安装依赖yarn install平台商户-mer端安装依赖yarn install平台客服-service端安装依赖npm install

打砖块小游戏html小游戏

这里提供一个打砖块小游戏html代码,有需要的小伙伴可以自己试试。body内容 点击查看代码 <select id="difficulty"><option value="easy">简单</option><option value="medium">中等</option><option value=&…

LLM应用实战: 产业治理多标签分类

本期的干货就是分享关于如何基于LLM实现数量多、层级多的多标签分类的实战经验,各位读者可以参考借鉴。1. 背景 许久未见,甚是想念~ 近期本qiang~换了工作,处于新业务适应期,因此文章有一段时间未更新,理解万岁! 现在正在着手的工作是产业治理方面,主要负责其中一个功能…