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

news2025/1/13 7:44:45

本期文章将讲述常用智能优化算法改进策略---飞行游走篇,一共包含五种常见的改进策略:

①莱维飞行,②随机游走,③螺旋飞行,④高斯随机游走,⑤三角形游走

五种策略可以方便移植到其他任何智能算法的改进中!

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

①莱维飞行

莱维飞行具有遍历性和随机性,是一种非高斯的随机过程,它的平稳增量服从莱维稳定分布,其飞行轨迹是随机漫步的,由小步长 (短距离) 的跳跃聚集在一块,和偶尔大步长 (长距离) 的跳跃组成,两者相互交替。

莱维飞行作为改进智能优化算法非常常用的改进策略,其实非常简单就能移植到别的算法中。莱维飞行的具体公式如下: 

带入到粒子群中,公式如下:

参考文献:奚金明,郑荣艳.基于自适应权重和莱维飞行的改进海鸥优化算法[J/OL].计算机系统应用:1-9[2023-10-23].DOI:10.15888/j.cnki.csa.009326.

②随机游走

随机游走策略是一种数学统计模型,可表示无规则运动所产生的运动轨迹。其主要过程为:每次随机选择一个当前解的邻域点进行比较,如果优于当前解则将该点作为新的中心。如果连续N次都找不到更优的值,则认为,最优解就在以当前最优解为中心,当前步长为半径的N维球内。此时,如果步长已经小于阈值,则结束算法;否则,令步长减半,开始新一轮游走。在迭代过程中,当达到一定条件时候,其概率分布会收敛,最终得到稳定的概率分布。

随机游走策略公式如下: 

e9ec38f4dee23285d4ab08c2848d5b81.png

取一个随机函数r(t)如式

由于智能算法的行动轨迹有一定的范围,因而不能直接用上式来更新算法的位置。为了保证算法行走在一定的范围内,需要对其进行归一化,如下式所示。

式中:Xit为第i只麻雀在第t次迭代中的位置;αi和bi分别为第i维随机游走变量的最小值和最大值;ci和di分别为第i维随机游走变量在第t次迭代的最小值和最大值。

参考文献:马小晶,贺航,王宏伟等.基于改进麻雀搜索算法的最大指数熵分割方法[J].科学技术与工程,2023,23(16):6983-6992.

③螺旋飞行(搜索)

螺旋搜索是在鲸鱼算法中提出来的,后来被学者将这一螺旋搜索策略用于智能算法改进中。螺旋搜索可以增强算法的全局寻优能力,这不仅保证了算法的收敛速度,而且可以增加个体的多样性。螺旋搜索公式如下:

17c1a06586aadb00cf9ed109b892590c.png

参考文献:MIRJALILI S,LEWIS A. The whale optimization algorithm[J].Advances in Engineering Software,2016,95:51一 67.

④高斯随机游走

作为随机游走模型中的经典模型,高斯随机游走模型具有优秀的开发能力。高斯随机游走策略也常常出现在智能算法的改进中,与随机游走不同,高斯随机游走在随机游走的基础上加上了高斯变异的公式,会产生一系列围绕种群最佳值变异的数列,具体的公式如下:

10057e4a76abb8ee0ab1c79afe9b42c5.png

参考文献:李梓成,代永强.一种改进的鲸鱼优化算法[J].计算机技术与发展,2023,33(02):173-180.

⑤三角形游走策略

三角游走策略是智能优化算法的种群在靠近最佳位置的同时在周围进行游走。一定意义上增加了算法的局部寻优能力。公式如下:

首先,得到种群和猎物之间的距离L1,种群的游走步长范围为L2。

6b60e5a0056edb462ef733cc5517888e.png

cebb87c369d6daf7c18f14210ea1ce87.png

之后,根据下述公式定义行走的方向4b8351b77ca0840271898eaf16cb2eee.png

6d62a49d1eafb977c44a55608750a5d9.png

再采用下述公式求出获得种群游走后得到的位置。

9949968aaa5a24efa3301459d597eea6.png

a2fc5426466f53bcd47b4c280f4e7e63.png

结果展示

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

其中PSO为原始粒子群,Triangle_Walk_PSO为三角形游走策略,Spiral_flight_PSO为螺旋飞行策略,randwalk_PSO为随机游走策略,Levy_flight_PSO为莱维飞行策略,Gaussian_randwalk_PSO为高斯随机游走策略。

8600bfeaf64132725b833406c323bd91.png

68e0e6c0f243d66a975bfdf0b947b277.png

6d41a1f84bcd5d0e9b234ab670c186fd.png

21b35856a1d9893bd539e4b212765430.png

c4abd63d2b2a4b391c4dd6fe0aff201f.png

0615f119b8a8aca1e08b3d05e1cfe2d6.png

8fa27f85f6601efd5360062ec02a703a.png

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

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

代码展示

%% 淘个代码 %%
% 2023/10/23 %
%微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work,其他途径都是骗子!
%%
clear
clc
close all
number='F8'; %选定优化函数,自行替换: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,randwalk_PSO_curve]=randwalk_PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);  % Calculating the solution of the given problem using randwalk_PSO
display(['The best optimal value of the objective funciton found by randwalk_PSO  for ' [num2str(number)],'  is : ', num2str(Best_score)]);
fprintf ('Best solution obtained by randwalk_PSO: %s\n', num2str(Best_pos,'%e  '));


%% 调用高斯随机游走的PSO算法
[Alpha_score,Alpha_pos,Gaussian_randwalk_PSO_Convergence_curve]=Gaussian_randwalk_PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by Gaussian_randwalk_PSO  for ' [num2str(number)],'  is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by Gaussian_randwalk_PSO: %s\n', num2str(Alpha_pos,'%e  '));
%% 调用莱维飞行的PSO算法
[Alpha_score,Alpha_pos,Levy_flight_PSO_Convergence_curve]=Levy_flight_PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by Levy_flight_PSO  for ' [num2str(number)],'  is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by Levy_flight_PSO: %s\n', num2str(Alpha_pos,'%e  '));
%% 调用三角形游走的PSO算法
[Alpha_score,Alpha_pos,Triangle_Walk_PSO_Convergence_curve]=Triangle_Walk_PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by Triangle_Walk_PSO  for ' [num2str(number)],'  is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by Triangle_Walk_PSO: %s\n', num2str(Alpha_pos,'%e  '));
%% 调用螺旋飞行的PSO算法
[Alpha_score,Alpha_pos,Spiral_flight_PSO_Convergence_curve]=Spiral_flight_PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by Spiral_flight_PSO  for ' [num2str(number)],'  is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by Spiral_flight_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),randwalk_PSO_curve(k),'c-*','linewidth',1);
    hold on
    semilogy(iter(k),Gaussian_randwalk_PSO_Convergence_curve(k),'r->','linewidth',1);
    hold on
    semilogy(iter(k),Triangle_Walk_PSO_Convergence_curve(k),'g-v','linewidth',1);
    hold on
    semilogy(iter(k),Levy_flight_PSO_Convergence_curve(k),'k-p','linewidth',1);
    hold on
    semilogy(iter(k),Spiral_flight_PSO_Convergence_curve(k),'y-+','linewidth',1);
    
else
    plot(iter(k),PSO_Convergence_curve(k),'b-^','linewidth',1);
    hold on
    plot(iter(k),randwalk_PSO_curve(k),'c-*','linewidth',1);
    hold on
    plot(iter(k),Gaussian_randwalk_PSO_Convergence_curve(k),'r->','linewidth',1);
    hold on
    
    plot(iter(k),Triangle_Walk_PSO_Convergence_curve(k),'g-v','linewidth',1);
    hold on
    plot(iter(k),Levy_flight_PSO_Convergence_curve(k),'k-p','linewidth',1);
   
    hold on
    plot(iter(k),Spiral_flight_PSO_Convergence_curve(k),'y-+','linewidth',1);
end
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('PSO','randwalk_PSO','Gaussian_randwalk_PSO','Triangle_Walk_PSO','Levy_flight_PSO','Spiral_flight_PSO')
set (gcf,'position', [300,300,1000,430])

代码目录

36f8687cb94b9d0f8edbe3e84c3af81b.png

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

代码获取

完整代码获取方式:后台回复关键字,不区分大小写。关键字:

游走策略

或者点击下方阅读原文跳转链接,

或者复制链接跳转:https://mbd.pub/o/bread/ZZWZlJ1q

这篇的游走策略可以搭配之前推出的变异策略,一起阅读。

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

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

相关文章

开发常用的 Linux 命令知识积累

查看硬盘的使用情况df -h单元为根据大小适当显示,-m单位为M Linux中查找文件夹的命令是find命令。 全盘搜索,也可以指定目录搜索。find 搜索目录 -name 目标名字,find / -name file liunx自己总结常见命令 执行命令 含义 cd ~ 切换到登录…

了解docker

了解docker docker版本演进docker架构docker生态docker安装 docker版本演进 lxc: lxc 是最早的 linux 容器技术,早期版本的 docker 直接使用 lxc 来实现容器的底层功能。虽然使用者相对较少,但 lxc 项目仍在持续开发演进中libcontainer&#…

Flutter饱受争议的7个缺点,大家怎么看?

Flutter是一款由Google推出的跨平台移动应用开发框架,近年来备受关注。尽管Flutter在某些方面表现出色,但仍然有一些人对它的发展前景表示怀疑。近期一些文章针对Flutter的发展提出了不少质疑和批评,称其难以成为移动应用开发的“顶流明星”&…

Hacker 资讯 | 10 月下旬区块链黑客松活动汇总

「TinTin Hacker 快讯」是 TinTinLand 建立的一个资讯专栏,汇集近期线上线下的黑客松及 Grant,旨在帮助开发者和区块链爱好者获取最新的黑客松资讯,鼓励他们了解并根据自身情况参与不同的黑客松,更好地建设 Web3 生态。 ETHMiami …

1.初识MySQL

初识 MySQL 1.服务器处理客户端请求2.常用存储引擎3.关于存储引擎的一些操作3.1 查看当前服务器程序支持的存储引擎3.2 设置表的存储引擎3.2.1 创建表时指定存储引擎3.2.2 修改表的存储引擎 4.总结 MySQL 默认采用 TCP/IP 的方式来处理客户端与服务器连接过程。 1.服务器处理客…

2023高频前端面试题-vue

1. 什么是 M V VM Model-View-ViewModel 模式 Model 层: 数据模型层 通过 Ajax、fetch 等 API 完成客户端和服务端业务模型的同步。 View 层: 视图层 作为视图模板存在,其实 View 就是⼀个动态模板。 ViewModel 层: 视图模型层 负责暴露数据给 View 层&…

解决oracle12c安装失败【INS-30131】执行安装程序验证所需要的初始设置失败问题

最近看到很多公司都要求会使用Oracle数据库,所以我就在网上找了Oracle教程,打算学习一下,可人生就是喜欢捉弄我,Oracle安装竟然都出了问题,别提学习了,可真让我很难受,那么安装出现了什么问题呢? 看下图: 原因 - 无法访问临时位置。 操作 - 请确保当前用户具有访问临时位置所…

muduo源码学习base——Atomic(原子操作与原子整数)

Atomic(原子操作与原子整数) 前置知识AtomicIntegerTget()getAndAdd()getAndSet() 关于原子操作实现无锁队列(lock-free-queue) 前置知识 happens-before: 用来描述两个操作的内存可见性 如果操作 X happens-before 操作 Y,那么 X 的结果对于…

极智AI | 有趣的羊驼系列大模型

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 有趣的羊驼系列大模型。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq "羊驼模型" 在大模型的介绍中应…

CodeWhisperer proxy代理连不上(解决)

报错: 2023-10-24 14:15:50 [INFO]: selected AWS ID sign in 2023-10-24 14:15:50 [ERROR]: API response (oidc.us-east-1.amazonaws.com /device_authorization): {} 2023-10-24 14:15:50 [ERROR]: webviewId"authWebview": Error: Webview error->…

【外汇天眼】很多交易高手都容易忽视的问题:“路径依赖”!

一、“路径依赖”与“均值回归” 在过去五到十年内,如果你一直通过采用某一策略取得持续的超额收益,那么你很难认识到这种策略可能出现错误。 即使经历了一两年的失效,大多数人都会继续相信并采用这一策略。这受到沉没成本、个人声誉以及多种…

Android Apk一键打包上传至蒲公英平台的gradle脚本

一、背景 项目中每次手动打包后,生成的测试包,都需要手动打开蒲公英平台的网址,登录账号,手动上传apk。之前写过一键上传至fir平台的脚本,想着这次可以搞一下一键打包上传至蒲公英的gradle脚本,提高下工作…

Linux下QT打开文件选择对话框时,程序报错退出

系统:Ubuntu QString fileName QFileDialog::getOpenFileName(this, "open", "./", "document Files (*.pdf)"); 调用该语句弹出文件对话框时,程序崩溃退出 错误提示: (Widget:5272): Gtk-WARNING **: 14…

73 应急响应-WEB分析phpjavaweb自动化工具

目录 应急响应:必备知识点:准备工作:有明确信息网站被入侵:无明确信息网站被入侵:常见分析方法: 演示案例:WindowsIISSql-日志,搜索LinuxBT_Nginxtp5-日志,后门360星图日志自动分析工…

Spring Cloud之服务注册与发现(Eureka)

目录 Eureka 介绍 角色 实现流程 单机构建 注册中心 服务提供者 服务消费者 集群搭建 注册中心 服务提供者 自我保护机制 原理分析 Eureka 介绍 Eureka是spring cloud中的一个负责服务注册与发现的组件,本身是基于REST的服务,同时还提供了…

虚拟化 vs. 裸金属:K8s 部署环境架构与特性对比

伴随着 IT 云化转型的逐步推进,越来越多的用户加入应用容器化改造的行列,并使用 Kubernetes(K8s)进行容器部署管理。然而,令不少用户感到困惑的是,由于大部分应用此前都部署在虚拟化或超融合环境&#xff0…

批量处理图片,轻松转换JPG到TIFF,让你的图片管理更优化!

作为图片处理的专业人士,您可能经常需要处理大量的图片文件,其中包括各种不同的格式,如JPG、PNG、GIF等。然而,不同的格式有着不同的优缺点,有时候为了更好地保存和传输图片,您可能需要将其转换为其他格式。…

NEFU系统分析与设计

系统分析与设计概述 用户故事 用来描述用户希望得到的功能 三要素:角色、活动、商业价值 举例:作为一个“网站管理员”,我想要“统计每天有多少人访问了我的网站”,以便于“我的赞助商了解我的网站会给他们带来什么收益。 系统…

Jmeter(十二):线程组元件第三方插件的线程组压力和负载线程详解

线程组(thread group) 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件 都必须在某个线程下。所有的任务都是基于线程组。 一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一 个虚拟用户。多个用户同时去执行相同的一批次任…

升讯威在线客服系统的并发高性能数据处理技术:为多线程处理同步数据

我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户。对我来说,只要能获得用户的认可,就是我最大的动力。 最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可。 客户组织多名客服上线后&a…