首页 > 其他分享 >粒子群优化函数--particleswarm函数的用法与讨论

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

时间:2024-08-20 18:04:24浏览次数:12  
标签:粒子 函数 迭代 particleswarm -- 邻域 options

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

目录

一、自适应的邻域模式

在我们前面对粒子群算法的优化讨论中,核心思想就是根据不同的情况,修改惯性权重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)

六、函数参数修改的建议

标签:粒子,函数,迭代,particleswarm,--,邻域,options
From: https://www.cnblogs.com/dlmuwxw/p/18369846

相关文章

  • FLink1.17-Kafka实时同步到MySQL实践
    1.组件版本组件版本Kafka3.7.0Flink1.17.0MySQL8.0.32 2.Kafka生产数据./kafka-console-producer.sh--broker-listhadoop01:9092,hadoop02:9092,hadoop03:9092--topic  kafka_test_table2>{"id":123,"test_age":33}&......
  • 2024.8.20(playbook剧本安装nginx、roles)
    一、playbook 剧本安装nginx[root@m0~]#mkdir/etc/ansible/playbook[root@m0~]#vim/etc/ansible/playbook/nginx.yml----hosts:group02remote_user:roottasks:-name:卸载httpdyum:......
  • FFmpeg的入门实践系列一
    欢迎诸位来阅读在下的博文~在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力!江山如画,客心如若,欢迎到访,一展风采文章目录参考环境本系列的适用人群FFmpeg的简介FFmpeg的下载与编译1.下载FFmpeg通过官方网站下载:通过Git克隆仓库:2.解压源......
  • 汇编语言之门:深入I/O操作的迷宫
    标题:汇编语言之门:深入I/O操作的迷宫在计算机的微观世界中,汇编语言以其与硬件的紧密联系而著称。输入输出(I/O)操作是汇编语言程序中与外部世界交互的重要手段。本文将带你深入探索汇编语言中的I/O操作,揭示其背后的原理,并展示如何通过代码实现基本的I/O功能。汇编语言与I/O操......
  • 汇编语言之门:深入I/O操作的迷宫
    标题:汇编语言之门:深入I/O操作的迷宫在计算机的微观世界中,汇编语言以其与硬件的紧密联系而著称。输入输出(I/O)操作是汇编语言程序中与外部世界交互的重要手段。本文将带你深入探索汇编语言中的I/O操作,揭示其背后的原理,并展示如何通过代码实现基本的I/O功能。汇编语言与I/O操......
  • 题解:CF997A Convert to Ones
    题意给定一个长度为\(n\)的01字符串,有以下两种操作:将一个子串翻转,花费\(X\)将一个子串进行取反,花费\(Y\)求把原字符串变为全是\(1\)的字符串的最小代价。思路只有\(2\)操作的情况下贪心策略。考虑到任意范围取反的花费相同,我们可以将相同的部分合并,如下图合并......
  • 题解:P10696 [SNCPC2024] 写都写了,交一发吧
    前置知识位运算按位与的运算规则:二进制下,相同位的两个数字都为\(1\),则为\(1\);若有一个不为\(1\),则为\(0\)。分析由按位与的运算规则可以得到:\(A\&A=A\),而题目中的两次提交可以是相同的,所以两次都只需要取\(n\)个数中最大的数即可。ACcode#include<bits/stdc++.h>us......
  • 题解:UVA486 English-Number Translator
    这是一道模拟题。前置知识数级思路当读取到了thousand和million时,计数器要乘上对应的值并累加到最终答案里,并且把计数器归零(因为该数级已经计算完了)。当读取到hundred时,只要计数器乘上\(100\)。否则如果是其他数,则直接累加到计数器即可。ACcode#include<bits/st......
  • MySQL-MGR实战指南:打造企业级高可用数据库集群
    文章目录前言MGR的介绍事务处理流程:实验测试环境:结束语前言在数字化时代,企业的数据安全和业务连续性至关重要。想象一下,当关键业务数据存储在数据库中,而数据库突然出现故障,或者面临硬件故障、网络中断、自然灾害等不可预知的灾难性事件时,企业如何确保数据的完整性和......
  • ssm高校毕业选题管理系统的设计与实现+jsp
    文章目录目录文章目录论文目录项目介绍开发环境系统实现论文参考论文目录目 录1绪论1.1 研究背景1.2目的和意义1.3论文结构安排2 相关技术2.1SSM框架介绍2.2 B/S结构介绍2.3Mysql数据库介绍3系统分析3.1 系统可行性分析3.1.1技术......