16种常用智能优化算法改进策略---剩余篇,可用于改进所有智能算法,让小白也会改进智能算法。..._自适应变异与交叉策略以及种群寻优更新策略-程序员宅基地

技术标签: 人工智能  

俗话说,授人以鱼不如授人以渔。

智能算法的改进作为一个创新点,大家任何时候都可以拿来去水水论文,甚至专利。

网上关于智能算法改进的论文不计其数!但是,如果细数改进策略!也是能够数的过来的!

之前作者推出过两篇关于智能算法常用的改进策略。包含的改进策略有:

①莱维飞行,②随机游走,③螺旋飞行,④高斯随机游走,⑤三角形游走,⑥高斯变异,⑦t分布扰动变异,⑧自适应t分布扰动变异,⑨柯西变异,⑩差分变异。

为了方便大家对于策略代码编写的学习和移植,作者将这十余种策略全部用于经典的粒子群算法。

因此只要你理解了经典的粒子群算法,再与改进的粒子群算法进行对比,那么你就能马上理解这些策略是如何运用于智能优化算法的。举一反三,大家自然而然也就会改进其他算法了!

现附上之前推出的十种改进策略,链接如下:

常用智能优化算法改进策略---飞行游走篇(五种策略)可用于改进所有智能算法,让小白也会改进智能算法。

常用智能优化算法改进策略---变异篇(五种变异策略)可用于改进所有智能算法,让小白也会改进智能算法。

a9c5fe54b412812d0771d202b11f10a0.png

除了以上10种改进策略,本期作者将再推出6种常见的改进策略。

这6种改进策略分别是:

①纵横交叉,②透镜成像反向学习,③动态反向学习,④正余弦,⑤黄金正弦,⑥自适应收敛因子

算上上面的10种,加起来一共是16种智能算法改进策略。

学会这16种策略,当你再去查阅改进智能算法的相关文献,你就会惊奇的发现,很多文献的策略都逃不过这16种。

下面一一介绍今天新推出的6种改进策略!

为了方便大家对这最新的6种改进策略深入了解,作者同样将这6种策略用在简单易懂的粒子群算法中,以此来教大家如何运用这6种策略,今后也方便大家移植到别的智能算法中。

①纵横交叉

网上找到一篇文献,关于纵横交叉策略的介绍,写的还很不错。

5c041c80f332352481ccf5472a5c31ef.png

关于纵横交叉策略,作者想说的是,这个策略基本上对所有的智能算法都可以适用,而且,加入后都会有很大的改进效果,但缺陷就是,加入这个纵横交叉策略之后,会增加智能算法的复杂度。所以说,万物都讲究一个平衡制约,阴阳调衡哈!

如果说,你的实际工程案例的适应度函数模型比较简单,那么就可以尝试该策略,会有不错的效果。但是如果说,你的实际工程案例模型迭代一次都需要很长时间,那么就建议不要用该策略了,因为当程序跑完的时候,你也差不多该毕业了。

参考文献:梁昔明,张洋,龙文.含有纵横交叉策略的蜘蛛猴优化算法[J].数学的实践与认识,2022,52(12):144-158.

②透镜成像反向学习(反向学习)

反向学习策略,作为智能算法常用的改进策略,在很多改进智能算法的文献都能找到他的影子!

透镜成像反向学习主要的思想是以当前坐标为基准通过凸透镜成像的原理生成一个反向位置来扩大搜索范围,这样可以既能跳出当前位置,又可以扩大搜索范围,提高了种群的多样性。

a3c88413150afa2f47b2c031309ff58d.png

透镜成像反向学习策略示意图

基于透镜成像原理的反向学习公式如下:

2b4e8243786096171bc1c73906ecf3a2.png

a,b就是解的上下限,当k=1时候,该公式就是标准的反向学习

由上述可知,反向学习就是特殊的透镜成像反向学习,采用反向学习得到的是固定的反向解。而通过调整k 的大小,可以在透镜反向学习中获得动态变化的反向解,进一步提升算法的寻优能力。

参考文献:Di Wu, Honghua Rao, Changsheng Wen, et al. Modified Sand Cat Swarm Optimization Algorithm for SolvingConstrained Engineering Optimization Problems[J]. Mathematics. 2022, 10(22), 4350.

③动态反向学习

所谓动态反向学习,就在于a,b取值的巧妙,这里的a,b不再是初始化的时候给出的上下限,而是取每次迭代过程中,所有粒子位置每一维度的上下限。

b936d7132137d3e4bd892aed2a81ff74.png

式中,aij = min(xij( t) ) ,bij = max(xij( t) ) ,分别为当前搜索空间的最小值和最大值,其随迭代次数的改变而变化。k为反向系数。

参考文献:陈娟,赵嘉,肖人彬等.基于动态反向学习和莱维飞行的双搜索模式萤火虫算法[J].信息与控制,2023,52(05):607-615.DOI:10.13976/j.cnki.xk.2023.2352.

正余弦策略

大家在查阅很多很多改进的智能算法中,经常会见到融合正余弦的影子,这里也说一下正余弦策略(sinecosine algorithm,SCA)。通过利用正余弦模型震荡变化特性对粒子位置进行作用,维持粒子个体多样性,进而提高智能算法的全局搜索能力。SCA的中心思想是根据正余弦模型的振荡变化对整体和局部寻优,获取整体最优值。公式如下:

4b6442184c763d726dbbebbcd7f2ba85.png

参考文献:李爱莲,全凌翔,崔桂梅等.融合正余弦和柯西变异的麻雀搜索算法[J].计算机工程与应用,2022,58(03):91-99.

⑤融合黄金正弦

黄金正弦也是一种常用的改进策略。可以看到目前有很多人融合该算法改进智能算法。

27f0677d38d59e63ebfd1df8544669cf.png

Golden-SA 不是模拟自然现象设计的,而是利用数学中的正弦函数进行计算迭代寻优,并在位置更新过程中引入黄金分割数使“搜索”和“开发”达到良好的平衡。公式如下:

e4d1b760d6b62e0a9048580c276427b6.png

参考文献:肖子雅,刘升.精英反向黄金正弦鲸鱼算法及其工程优化研究[J].电子学报,2019,47(10):2177-2186.

⑥自适应收敛因子

这一个改进策略其实非常常见,也非常实用!在很多改进的算法里边都能看到。但是想要用好这一策略,需要大家不断的进行尝试。因为它会影响算法在不同阶段的收敛速度。

当然,这一阶段的公式,也是非常之丰富!但一般就是指数与非线性函数的组合。然后从一个数字增长或者降低到另一个数字。

比如:

24d80650ecc5307ca6c0bccce24930f3.png

95848c39ced074318696c09b14b2b213.png

7af0905ff1babb5495539120bb06ccad.png

449fd831e68af0340d42500addc2db96.png

类似这样的公式还有很多很多,这一点改进一般也是最简单的,大家在今后的学习中自行探索即可!这里的参考文献太多了,就不放了哈!

结果展示

在CEC2005函数集进行展示,设置迭代次数1000次,种群个数100个。

其中PSO为原始粒子群,WPSO为自适应收敛因子策略,Goldensine为黄金正弦策略,Reverselearn为透镜成像反向学习策略,DynamicReverselearn为动态反向学习策略,Sincos为正余弦策略,Crisscrossing为纵横交叉策略。

395f34c70ef021f0285b12016aaf47cc.png

7b3279ff063f087259cd5f119c45371c.png

90642ef7aabc7191bc90c3dcf0e660c0.png

1106982064e87d1141ca786c7fe0a1a2.png

c89a65f0944998cb9ac306eecc18be00.png

f1b539e62bb20ec9291adf49d4a678c6.png

14f68a17531871a3d16429c07a7c05d3.png

f8f02b54f83471b91a0f261c905b54b2.png

注意!本程序代码只是为了教大家如何使用这几种变异策略,如果看到改进后的算法没有原始算法效果好,请不要见怪!

但是可以看到的是,除了自适应收敛因子策略在一些函数表现不佳以外(也可能是作者加的这个公式不太好),其他的策略都比原始的粒子群算法要好。

友情提示:策略算法是给出了,但不是说只要你加入了策略,算法性能就一定能提升,关键还是要看这些策略的作用分别是什么,是帮助算法跳出最优解?是扩展搜索范围增强全局寻优能力?是加速算法收敛?只有明确了策略的功能和自己要改进算法的弊端,有效结合,才能提升自己的算法性能。要分析其原理并不断进行尝试!

代码展示

%%
clear
clc
close all
number='F15'; %选定优化函数,自行替换:F1~F23
[lb,ub,dim,fobj]=CEC2005(number);  % [lb,ub,D,y]:下界、上界、维度、目标函数表达式
SearchAgents=100;                      % population members 
Max_iterations=1000;                  % maximum number of iteration


%% 调用PSO算法
[fMin , bestX, PSO_Convergence_curve ] = PSO(SearchAgents, Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by PSO  for ' [num2str(number)],'  is : ', num2str(fMin)]);
fprintf ('Best solution obtained by PSO: %s\n', num2str(bestX,'%e  '));


%% 调用自适应权重因子的PSO
[Best_score,Best_pos,WPSO_curve]=WPSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);  % Calculating the solution of the given problem using WPSO
display(['The best optimal value of the objective funciton found by WPSO  for ' [num2str(number)],'  is : ', num2str(Best_score)]);
fprintf ('Best solution obtained by WPSO: %s\n', num2str(Best_pos,'%e  '));


%% 调用黄金正弦的PSO算法
[Alpha_score,Alpha_pos,Golden_sine_PSO_Convergence_curve]=Golden_sine_PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by Golden_sine_PSO  for ' [num2str(number)],'  is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by Golden_sine_PSO: %s\n', num2str(Alpha_pos,'%e  '));
%% 调用正余弦的PSO算法
[Alpha_score,Alpha_pos,Sin_cos_PSO_Convergence_curve]=Sin_cos_PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by Sin_cos_PSO  for ' [num2str(number)],'  is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by Sin_cos_PSO: %s\n', num2str(Alpha_pos,'%e  '));
%% 调用透镜成像反向学习的PSO算法
[Alpha_score,Alpha_pos,Reverse_learn_PSO_Convergence_curve]=Reverse_learn_PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by Reverse_learn_PSO  for ' [num2str(number)],'  is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by Reverse_learn_PSO: %s\n', num2str(Alpha_pos,'%e  '));
%% 调用纵横交叉的PSO算法
[Alpha_score,Alpha_pos,Crisscrossing_PSO_Convergence_curve]=Crisscrossing_PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by Crisscrossing_PSO  for ' [num2str(number)],'  is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by Crisscrossing_PSO: %s\n', num2str(Alpha_pos,'%e  '));
%% 调用动态反向学习的PSO算法
[Alpha_score,Alpha_pos,Dynamic_Reverse_learn_PSO_Convergence_curve]=Dynamic_Reverse_learn_PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by Dynamic_Reverse_learn_PSO  for ' [num2str(number)],'  is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by Dynamic_Reverse_learn_PSO: %s\n', num2str(Alpha_pos,'%e  '));
 %% Figure
figure1 = figure('Color',[1 1 1]);
G1=subplot(1,2,1,'Parent',figure1);
func_plot(number)
title(number)
xlabel('x')
ylabel('y')
zlabel('z')
subplot(1,2,2)
G2=subplot(1,2,2,'Parent',figure1);
CNT=20;
k=round(linspace(1,Max_iterations,CNT)); %随机选CNT个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:Max_iterations;
if ~strcmp(number,'F16')&&~strcmp(number,'F9')&&~strcmp(number,'F11')  %这里是因为这几个函数收敛太快,不适用于semilogy,直接plot
    semilogy(iter(k),PSO_Convergence_curve(k),'b-^','linewidth',1);
    hold on
    semilogy(iter(k),WPSO_curve(k),'c-*','linewidth',1);
    hold on
    semilogy(iter(k),Golden_sine_PSO_Convergence_curve(k),'r->','linewidth',1);
    hold on
    semilogy(iter(k),Reverse_learn_PSO_Convergence_curve(k),'g-v','linewidth',1);
    hold on
    semilogy(iter(k),Sin_cos_PSO_Convergence_curve(k),'k-p','linewidth',1);
    hold on
    semilogy(iter(k),Crisscrossing_PSO_Convergence_curve(k),'y-+','linewidth',1);
    hold on
    semilogy(iter(k),Dynamic_Reverse_learn_PSO_Convergence_curve(k),'m-s','linewidth',1);
    
else
    plot(iter(k),PSO_Convergence_curve(k),'b-^','linewidth',1);
    hold on
    plot(iter(k),WPSO_curve(k),'c-*','linewidth',1);
    hold on
    plot(iter(k),Golden_sine_PSO_Convergence_curve(k),'r->','linewidth',1);
    hold on
    
    plot(iter(k),Reverse_learn_PSO_Convergence_curve(k),'g-v','linewidth',1);
    hold on
    plot(iter(k),Sin_cos_PSO_Convergence_curve(k),'k-p','linewidth',1);
   
    hold on
    plot(iter(k),Crisscrossing_PSO_Convergence_curve(k),'y-+','linewidth',1);
    hold on
    plot(iter(k),Dynamic_Reverse_learn_PSO_Convergence_curve(k),'m-s','linewidth',1);
end
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('PSO','WPSO','Goldensine','Reverselearn','Sincos','Crisscrossing','DynamicReverselearn')
set (gcf,'position', [300,300,1000,430])

代码目录

7c8c72242eded41dd9766d7c37f29d05.png

直接运行MAIN.m脚本文件即可!

代码获取

关注下方小卡片,获取更多代码

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/woaipythonmeme/article/details/134086719

智能推荐

leetcode-829-程序员宅基地

文章浏览阅读212次。题目描述:给定一个正整数 N,试求有多少组连续正整数满足所有数字之和为 N?首先,刚开始读错题目了,以为是子集和就行,后来发现是连续子集;想到用子集树,但是超时了class Solution: def consecutiveNumbersSum(self, N: int) -> int: self.res = 0 nums = ..._leetcode qian 400 timu

STM32内存结构介绍,FreeRTOS内存分配技巧,Stack_Size和Heap_Size大小设置-程序员宅基地

文章浏览阅读1.5w次,点赞56次,收藏283次。STM32内存结构介绍和FreeRTOS内存分配技巧这是我第一次使用FreeRTOS构建STM32的项目,踩了好些坑,又发现了我缺乏对于操作系统的内存及其空间的分配的知识,故写下文档记录学习成果。文章最后要解决的问题是,如何恰当地分配FreeRTOS中的堆、任务栈的空间。但是在概念的理解上,也需要知道STM32内存的相关知识。所以首先大致介绍一下STM32的内存结构。STM32内存结构STM32的数据在物理上分别储存在RAM和Flash中。RAM可读可写,掉电清零。Flash可读可写,但是读写时间很_heap_size

【数据库】密级,视图机制,审计(第四章例题_2)_对删除sc表结构或删除sc表数据的操作进行审计-程序员宅基地

文章浏览阅读493次。敏感度标记(Label) 对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label) 敏感度标记分成若干级别绝密(Top Secret,TS)机密(Secret,S)可信(Confidential,C)公开(Public,P)TS>=S>=C>=P主体的敏感度标记称为许可证级别(Clearance Level)客体的敏感度标记称为密级(Classification Level)规则:主体(操作者)的密级别=客体的密集时,可读可写。主体>客体_对删除sc表结构或删除sc表数据的操作进行审计

有序链表的交集_有序链表的交集调用函数-程序员宅基地

文章浏览阅读1.3k次。已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。输入格式说明:输入分2行,分别在每行给出由若干个正整数构成的非降序序列,用-1表示序列的结尾(-1不属于这个序列)。数字用空格间隔。输出格式说明:在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出“NULL”。样例输入与输出:_有序链表的交集调用函数

java重定向和请求转发区别_java重定向和转发的区别-程序员宅基地

文章浏览阅读1.9k次,点赞5次,收藏11次。请求转发:request.getRequestDispatcher().forward();重定向:response.sendRedirect();例如:请求转发:request.getRequestDispatcher("/student_list.jsp").forward(request,response);重定向:response.sendRedirect(request.getContextPath + "/student_list.jsp")转发过.._java重定向和转发的区别

html背景向四周散开,纯css3圆形从中心向四周扩散动画-程序员宅基地

文章浏览阅读1.1k次。查看效果:http://hovertree.com/texiao/css3/37/以下为讲解和代码。可以通过 @keyframes 规则,创建动画。创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式。在动画过程中,您能够多次改变这套 CSS 样式。以百分比来规定改变发生的时间,或者通过关键词 "from" 和 "to",等价于 0% 和 100%。0% 是动画的开始时间,100% 动画的结..._css3 背景扩散效果

随便推点

Wireshark数据抓包分析——网络协议篇-程序员宅基地

文章浏览阅读270次。Wireshark数据抓包分析——网络协议篇 Wireshark是眼下最受欢迎的抓包工具。它能够执行在Windows、Linux及MAC OS X操作系统中,并提供了友好的图形界面。同一时候,Wireshark提供功能强大的数据抓包功能。使用它。能够以各种方式抓取用户所须要的网络数据包。..._分析五条不同类型的wireshark抓包行分析是什么网络应用

GPS系统跟踪捕获算法的Verilog实现_gps的ca码设计与相关verilog程序-程序员宅基地

文章浏览阅读4.1k次。GPS系统跟踪捕获算法_gps的ca码设计与相关verilog程序

苹果 macOS Sonoma 14 开发者预览版 Beta 3 发布_mac os sonoma最新版本-程序员宅基地

文章浏览阅读81次。苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 3 更新。但是并未发现 macOS 14 Sonoma 的第三个开发者测试版的新功能,且更新日志和 Beta 2 类似。_mac os sonoma最新版本

ES6-17【类、类的继承、类的实现、类的修饰】_es6 类修饰 详解-程序员宅基地

文章浏览阅读270次。一.类(1).基础最简单的定义方式class Person{}log(new Person());//Person{}log(typeof Person);function标准写法class Person{ constructor(name = "zhangsan",age = "18"){ //私有属性 this.name = name; this.age = age; } //公有属性 _es6 类修饰 详解

Java 常用类 03 可变字符串和BigDecimal(BigInteger)_java字符串和bigdecimal类-程序员宅基地

文章浏览阅读335次。3.1 可变字符串和BigDecimal3.1.1 可变字符串由于我们的字符串,是不可变的。每次都要在 字符串池里 新建和共享。这样效率很低,而且占用空间大。我们的 Java 就开发了 可变字符串下面的两者,都比传统的 String 类型要快很多。① StringBuffer:JDK1.0提供的,效率低,线程安全。它是实现开辟一个缓冲区,然后操作的时候,直接在 缓冲区里进行操作。② StringBuilder:JDK5.0提供的,效率高,线程不安全3.1.2 StringBuffer①_java字符串和bigdecimal类

【基于FPGA的芯片设计】32×32位寄存器堆_fpga2s需要多少位寄存器-程序员宅基地

文章浏览阅读2.6k次,点赞9次,收藏2次。32×32位寄存器堆设计,杭电计算机组成原理实验四,实验的开发工具是vivado2018,vivado2022也兼容2018_fpga2s需要多少位寄存器

推荐文章

热门文章

相关标签