“ 本篇文章采用10种常见的和不常见的混沌映射用于优化群智能算法,代码可一键切换,可用于所有智能算法优化,本篇文章以灰狼算法为例进行介绍”
本文涉及10种混沌映射算法,用于在初始化智能算法粒子时使用,10种混沌映射算法包括:Tent映射、Logistic映射、Cubic映射、chebyshev映射、Piecewise映射、sinusoidal映射、Sine映射,ICMIC映射, Circle映射,Bernoulli映射。关于每个方法映射的原理,本文就不再一一介绍。
01
—
选择混沌映射有什么用
经实验证明,采用混沌映射产生随机数的适应度函数值有明显提高,用混沌映射取代常规的均匀分布的随机数发生器可以得到更好的结果,特别是搜索空间中有许多局部解时,更容易搜索到全局最优解。一句话来讲就是:混沌映射可以增强粒子的随机性和多样性。
02
—
混沌映射可视化图片
以Tent映射和Logistic映射为例,展示一下结果图。当然这个用肉眼也确实看不出太大区别,其他8种混沌映射画出来的结果都和这个差不多,就不一一展示了。
03
—
10种混沌映射优化灰狼算法
以Logistic混沌映射为例,依旧是在CEC2005函数上进行测试。采用Logistic混沌映射优化灰狼算法结果如下:
04
—
结果分析
这里选取了10个函数的优化作为结果展示,这10个函数的优化结果表示,混沌映射优化智能算法并非对每个函数都有效果,比如F6,F8。
这里要特别说明一下,混沌映射优化智能算法,从理论上来讲,只是将初始化的粒子变得更随机更多样了,这样确实是可以加速算法的收敛速度,但是,一旦循环开始,剩下的就没有混沌优化什么事情了。
换句话说,就是如果我直接用rand函数生成一堆粒子,也是有一定概率比混沌优化生成的粒子更好的,虽然这个概率不大,但确确实实是有的,所以如果偶尔出现混沌优化的效果不好使,那也不要气馁,毕竟混沌优化只是优化智能算法的一种手段,大家可以结合别的手段一起优化。
05
—
代码展示
clear
clc
close all
number='F9'; %选定优化函数,自行替换:F1~F23
% [lb,ub,D,y]:下界、上界、维度、目标函数表达式
[lb,ub,dim,fobj]=CEC2005(number);
SearchAgents_no=30; %种群规模
Max_iter=1000; %最大迭代次数
%调用灰狼算法
numm = 2; %% numm 混沌映射类型选择,1-10,tent、Logistic、Cubic、chebyshev、Piecewise、sinusoidal、Sine,ICMIC, Circle,Bernoulli,自由切换
[chaosAlpha_score,chaosAlpha_pos,chaosConvergence_curve]=GWO(numm,SearchAgents_no,Max_iter,lb,ub,dim,fobj);
fprintf ('Best solution obtained by chaosGWO: %s\n', num2str(chaosAlpha_pos,'%e '));
fprintf ('Best objective function value obtained by chaosGWO: %e \n', chaosAlpha_score);
numm = 11; % numm 混沌映射类型选择,当numm等于11时,采用原始的随机数,也就是最原始的灰狼算法
[Alpha_score,Alpha_pos,Convergence_curve]=GWO(numm,SearchAgents_no,Max_iter,lb,ub,dim,fobj);
fprintf ('Best solution obtained by GWO: %s\n', num2str(Alpha_pos,'%e '));
fprintf ('Best objective function value obtained by GWO: %e \n', Alpha_score);
%% 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_iter,CNT)); %随机选CNT个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:Max_iter;
semilogy(iter(k),Convergence_curve(k),'b-*','linewidth',1);
hold on
semilogy(iter(k),chaosConvergence_curve(k),'m-p','linewidth',1);
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('GWO','chaosGWO')
set (gcf,'position', [300,300,800,350])
从代码可以看出,作者的每个代码资料都做了详细的注释。代码第12行中有一个关键的参数numm,大家可以通过手动调节这个变量,实现不同的混沌映射优化智能算法。
一共有10种类型可供选择,Tent映射、Logistic映射、Cubic映射、chebyshev映射、Piecewise映射、sinusoidal映射、Sine映射,ICMIC映射, Circle映射,Bernoulli映射。
作者已经将这10种混沌映射写到一个名为“chaos.m”的脚本函数中,chaos的英文名是混乱,感觉这么命名还是挺有道理的哈哈,这样大家就可以一键更换了,而且很容易扩展到其他代码上。
友情提示:如果说,大家在用其他混沌映射优化时效果不好,可以手动修改chaos.m中的每个混沌映射方法的混沌系数。
好的,今天就分享到这里啦。下方卡片回复关键词:chaos,获取完整代码
觉着不错的给博主留个小赞吧!您的一个小赞就是博主更新的动力!谢谢!