基于改进莱维飞行和混沌映射的金鹰优化算法(10种混沌映射随意切换),附matlab代码

 本篇文章对金鹰优化算法进行改进,首先通过引入混沌映射机制,对其群体进行初始化,增加金鹰个体的多样性;然后在金鹰个体的位置更新公式上引入改进的莱维飞行机制,提高搜索精度,帮助金鹰个体跳出局部最优。

可以选择1-10不同的映射,1-10分别为,tent、Logistic、Cubic、chebyshev、Piecewise、sinusoidal、Sine,ICMIC, Circle,Bernoulli。选择不同的数字可以随意切换。

先上结果图,在CEC2005函数上进行测试,种群个体设置为50个,循环次数为1000次。

f95d8c32e67e27187e11a8e166cfdd0a.png

783ccb905d6229bd24b049bb16d1e8c4.png

e71c0c3f48154e9cae3c1433d82a4300.png

c6648dae036a8b1dcf46a72fb7b97a89.png

6f581847d9647d59a4a7f66d9dcb0ba7.png

b47d2f971e1aea4c62fc48a685706f26.png

f74f0624d00406ecb55869e9e846c969.png

0701b2d1d616e0c13fe300cc1ccb3803.png

4313bb85b21fee78c5f0eda3fed77cc1.png

df6c9026710fe03c57dad085f6540268.png

这里截选了前10个函数进行展示,可以看到改进前后在收敛速度和寻优精度上都有了很大的改进。

接下来讲一下改进的原理。

  1. 混沌映射

    依旧是采用之前文章提到的10种混沌映射,可以自由切换映射方法,本文选取的映射方法是Logistic映射,大家也可以自行更改。没看过之前文章的小伙伴可以看一下。(1条消息) 10种混沌映射优化灰狼算法,可一键切换,可用于优化所有群智能算法,以灰狼算法为例进行介绍..._今天吃饺子的博客-CSDN博客

  2. 改进的莱维飞行机制

    本文莱维飞行的添加并非如其他文章那样,直接在粒子更新的时候加上莱维系数,而是稍作改进,这样的效果也确实比直接加莱维系数要好。原理公式如下:

112b51ac543145f1a7d754a84d4aca04.png

其中 , α是步长缩放因子,Levy(β)是萊维随机路径。

21f67085bb3c1d1896b2fdc882f97321.png

改进的原理如下:

740ca0842844879eab0e3ee5839047cd.png

a11c958a820c5fb6b6a9bd9495ed68c6.png

这么做的目的是将金鹰算法与莱维飞行进行优势互补,可以动态的调整每次寻优的比例系数。

代码如下:

%%
clear
clc
close all
%% Inputs 
number='F10'; %选定优化函数,自行替换:F1~F23
% [lb,ub,D,y]:下界、上界、维度、目标函数表达式
[lb,ub,nvars,fun]=CEC2005(number);  
% FunctionNumber =6; % 1-23
options.PopulationSize = 50;
options.MaxIterations  = 1000;
%% Run Multi-Objective Golden Eagle Optimizer 


options.AttackPropensity = [0.5 ,   2];
options.CruisePropensity = [0.1   , 0.5];
numm = 2; % 混沌映射:1-10分别为,tent、Logistic、Cubic、chebyshev、Piecewise、sinusoidal、Sine,ICMIC, Circle,Bernoulli
[chaosLx,chaosLfval,chaosLConvergenceCurve] = chaosLGEO (numm,fun,nvars,lb,ub, options); %调用改进的GEO算法
[x,fval,ConvergenceCurve] = GEO (fun,nvars,lb,ub, options);  %调用GEO


%% Figure
maxcycle = options.MaxIterations;
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,options.MaxIterations,CNT)); %随机选50个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:options.MaxIterations;
semilogy(iter(k),ConvergenceCurve(k),'b-*','linewidth',1);
hold on
semilogy(iter(k),chaosLConvergenceCurve(k),'g-p','linewidth',1);
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('GEO','chaosLGEO')
set (gcf,'position', [200,300,700,300])

注意看第16行变量numm,可以选择1-10不同的映射,1-10分别为,tent、Logistic、Cubic、chebyshev、Piecewise、sinusoidal、Sine,ICMIC, Circle,Bernoulli。选择不同的数字可以随意切换。

获取完整代码方式,下方卡片回复关键词:LGEO

猜你喜欢

转载自blog.csdn.net/woaipythonmeme/article/details/131507814