性能出众的一区新算法|星鸦优化算法NOA原理及代码实现(Matlab)

文章来源于我的个人公众号:KAU的云实验台,主要更新智能优化算法的原理、应用、改进
CEC2005中的测试
在这里插入图片描述

本文KAU将介绍一个2023年发表在1区期刊KBS上的优化算法——星鸦优化算法(Nutcracker Optimization Algorithm,NOA)[1]在这里插入图片描述

该算法由Mohamed Abdel-Basset等于2023年提出,Mohamed Abdel-Basset教授同时也是开普勒、光谱、蜘蛛蜂等优化器的提出者。

而本文要介绍的NOA灵感来源于生活在美国西部和加拿大山区中的一种名叫星鸦的鸟类,该优化器模拟了星鸦觅食、存储以及缓存搜索、恢复的行为

算法性能上,在23个标准测试函数、CEC2014、CEC2017、CEC2020及5个工程设计问题上进行评估,对比算法包含:

(1)SMA、GBO、AVOA等近年发表的算法;

(2)SSA、WOA、GWO等高引算法;

(3)AL-SHADE、L-SHADE等CEC竞赛的获胜算法

NOA是所有方法中排名第一!

在这里插入图片描述

图源文献[1]

因此KAU对这个性能如此出彩的算法也很感兴趣,遂出此文章以学习,本文将介绍该算法的相关原理并给出其MATLAB实现。

00 目录

1 星鸦优化算法(NOA)原理

2 代码目录

3 算法性能

4 源码获取

01 星鸦优化算法(NOA)原理

在这里插入图片描述

图源文献[1]

NOA同样是基于种群的元启发式算法,模拟了星鸦在夏季和秋季寻找食物并将其存储在合适的场所,冬季和春季寻找储存的地方并取回食物的行为。共四种行为,下面讲解NOA原理:

1.1 初始化

星鸦的位置可视为搜索代理,其遵循随机初始化的方法:

在这里插入图片描述

1.2 觅食与存储策略

1.2.1 觅食阶段——勘探1

此阶段星鸦检查初始位置旁包含种子的球果,若有好种子,则带到储藏区,若没有,则到另一个松树上寻找,对该行为的建模如下:
在这里插入图片描述

其中,Uj和Lj是上下界,γ是Levy飞行产生的随机数,A、B、C是种群中的随机个体,τ1, τ2, r和r1是[0,1]之间的随机数,Xmtj是第j维的平均值,u是一个在正态分布随机数、levy飞行、随机数之间随机生成的数字,如下:

在这里插入图片描述

觅食阶段的第一个状态表明星鸦不改变位置,第二个状态表明将对空间进行随机的全局搜索,第三个状态将探索位置周围的空间。

1.2.2 存储阶段——开发1

星鸦将觅食阶段获得的食物运到储藏区,其数学模型为:

在这里插入图片描述

其中,λ是levy飞行生成的随机数,τ3是(0,1)之间的随机数,I是1到0随机线性递减的因子。

1.2.3 位置更新

根据以下公式进行觅食和存储之间的转换,以维持勘探和开发之间的平衡:

在这里插入图片描述

Eq(1)即选择觅食阶段的更新方式,Eq(2)即选择存储阶段的更新方式,ϕ是一个随机数,Pa1从1到0递减。即两种策略只选用一种执行。

1.3 寻找储藏区与找回策略

冬季来临后,星鸦将进行第二次探索,它从储藏模式转换到搜索模式,星鸦用两个参考点RP作为单个储藏区的标记。这些参考点可以用不同的方程表示:(这个参考点是星鸦用来找回食物的依据,是个很有意思的设计,可以作为一个改进策略的构想)

参考点:

在这里插入图片描述

第一层参考点为:

在这里插入图片描述

其中,theta表示[0,pi]之间的随机数,𝛼为:
在这里插入图片描述

第二层参考点为:
在这里插入图片描述

其中,L和U是上下界,U2(下图中U1应为U2)如下:

在这里插入图片描述

1.3.1 寻找储藏区阶段——勘探2

寻找储藏区阶段的位置更新公式为:
在这里插入图片描述

其中,Eq(13)为:

在这里插入图片描述

Eq(15)为:

在这里插入图片描述

其中C是随机选择一个个体。

新的位置将以贪婪策略选择性保留:

在这里插入图片描述

1.3.2 找回食物阶段——开发2

找回食物时其位置更新方式为:
在这里插入图片描述

Eq(12)

在这里插入图片描述

Eq(14)

在这里插入图片描述

同样,新的位置将以贪婪策略选择性保留:

在这里插入图片描述

1.3.3 位置更新

和上一节一样,第二阶段的搜索同样也是从勘探和开发中进行随机选择,其选择公式如下:

在这里插入图片描述

其中,Eq(16)即为勘探,Eq(17)即为开发。φ为(0,1)之间的随机数,而Pa2是经过实验确定的,原文中等于0.2。

1.4 算法流程

NOA算法共分两个阶段,每个阶段都包含勘探与开发两种策略,并且每个阶段的运行只会择其一种策略进行更新,同时,一次迭代只会选择一个阶段执行(按一定概率选择),保证了算法的快速迭代,其总体流程如下(流程图为KAU结合原文,根据自己的理解所画,若有误欢迎指正):

在这里插入图片描述

02 代码目录

在这里插入图片描述

代码为MATLAB,。考虑到很多同学获取代码后,MATLAB代码部分有乱码(MATLAB版本问题),有几个方法:

①可以将MATLAB版本改为2020及以上;

②将m文件用记事本打开,再将记事本中的代码复制到Matlab即可

代码都经过作者重新注释,代码更清爽,可读性强。

03 算法性能

采用标准测试函数初步检验其寻优性能,在MATLAB中,进行标准函数的测试,执行程序结果如下:

在这里插入图片描述

04 源码获取

在公众号(KAU的云实验台 )后台回复 NOA 即可

参考文献

[1] Abdel-Basset M , Mohamed R , Jameel M ,et al.Nutcracker optimizer: A novel nature-inspired metaheuristic algorithm for global optimization and engineering design problems[J].Knowledge-Based Systems, 2023, 262:110248-.

另:如果有伙伴有待解决的优化问题(各种领域都可),可以发我,我会选择性的更新利用优化算法解决这些问题的文章。

如果这篇文章对你有帮助或启发,可以点击右下角的赞/在看(ง •̀_•́)ง(不点也行),你们的鼓励就是我坚持的动力!若有定制需求,可私信作者。

  • 21
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A*算法是一种常用的路径搜索算法,用于在图或网络中找到最短路径。下面是一个简单的A*算法Matlab代码示例: ```matlab function path = AStar(startNode, goalNode, graph) % 初始化openSet和closedSet openSet = startNode; closedSet = []; % 初始化起始节点的代价和启发式估计值 startNode.gCost = 0; startNode.hCost = heuristic(startNode, goalNode); startNode.fCost = startNode.gCost + startNode.hCost; while ~isempty(openSet) % 从openSet中选择fCost最小的节点 currentNode = openSet(1); currentIndex = 1; for i = 1:length(openSet) if openSet(i).fCost < currentNode.fCost currentNode = openSet(i); currentIndex = i; end end % 如果当前节点是目标节点,返回路径 if currentNode == goalNode path = reconstructPath(currentNode); return; end % 将当前节点从openSet中移除,并加入closedSet openSet(currentIndex) = []; closedSet = [closedSet, currentNode]; % 遍历当前节点的邻居节点 neighbors = getNeighbors(currentNode, graph); for i = 1:length(neighbors) neighbor = neighbors(i); % 如果邻居节点已经在closedSet中,跳过 if ismember(neighbor, closedSet) continue; end % 计算邻居节点的代价和启发式估计值 tentativeGCost = currentNode.gCost + distance(currentNode, neighbor); if ~ismember(neighbor, openSet) || tentativeGCost < neighbor.gCost neighbor.gCost = tentativeGCost; neighbor.hCost = heuristic(neighbor, goalNode); neighbor.fCost = neighbor.gCost + neighbor.hCost; neighbor.parent = currentNode; % 如果邻居节点不在openSet中,加入openSet if ~ismember(neighbor, openSet) openSet = [openSet, neighbor]; end end end end % 如果openSet为空,表示无法找到路径 error("No path found."); end function h = heuristic(node1, node2) % 启发式函数,计算两个节点之间的估计距离 h = sqrt((node1.x - node2.x)^2 + (node1.y - node2.y)^2); end function d = distance(node1, node2) % 计算两个节点之间的实际距离 d = sqrt((node1.x - node2.x)^2 + (node1.y - node2.y)^2); end function path = reconstructPath(node) % 从目标节点开始,逆向构建路径 path = []; while ~isempty(node.parent) path = [node, path]; node = node.parent; end end function neighbors = getNeighbors(node, graph) % 获取当前节点的邻居节点 neighbors = []; for i = 1:length(graph) if graph(node, i) == 1 neighbors = [neighbors, i]; end end end ``` 这段代码实现了A*算法的基本逻辑,包括初始化openSet和closedSet、计算节点的代价启发式估计值、选择fCost最小的节点、更节点的代价和启发式估计值等。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值