今天为大家带来的智能优化算法是:基于莱维飞行的量子粒子群。
写此代码的初衷是收到后台小伙伴的留言,需要量子粒子群在CEC2017函数上跑,结果,作者写完之后,发现量子粒子群的效果虽然相较于原始的粒子群略有改善,但是改善的程度很小。寻思就这么出一期文章,也太敷衍大家了,于是乎---作者就将莱维飞行加入到量子粒子群中,结果发现,效果还是不错滴。
这里多说一句,也是与身边的一位科研大佬(兼红颜知己)(在硕士期间就能发两篇SCI一区的大佬,全程只靠自己不靠别人带)学习沟通过后,才知道的:在一些高水平的论文中,一般会将CEC2005和CEC2017作为验证智能算法的测试函数,这两个函数测试集最为经典,其中CEC2005用的频次要比CEC2017用的较多。本篇文章一次性打包,代码中已经全部写好。
依旧是先看结果,首先是CEC2005函数集的测试,其中QPSO是量子粒子群,LQPSO是基于莱维飞行的量子粒子群。随机挑选几个函数:
这效果,在粒子群基础上改出来的,确实已经相当不错了。
然后看一下在CEC2017函数上的测试结果,随机挑选几个函数:
F1
F5
F8
F12
F18
从CEC2017函数上的测试效果看,LQPSO算法与QPSO算法相差不大,但是相较于原始的PSO算法,改善效果还是相当不错的。
代码目录已整理好,两个函数集分别包含LQPSO,QPSO和PSO三种代码。
代码:
clear
clc
close all
addpath(genpath(pwd));
func_num=12; %改函数
D=50;
lb=-100;
ub=100;
N=100; %种群数目
T=1000; %迭代次数
fhd=str2func('cec17_func');
%% PSO
[fMin , bestX,PSO_Convergence_curve ] =PSO(fhd,func_num,N,T,lb,ub,D);
display(['The best optimal value of the objective funciton found by PSO for ' [num2str(func_num)],' is : ', num2str(fMin)]);
fprintf ('Best solution obtained by PSO: %s\n', num2str(bestX,'%e '));
%% QPSO
[Best_score,Best_pos,QPSO_curve]=QPSO(fhd,func_num,N,T,lb,ub,D); % Calculating the solution of the given problem using PSO
display(['The best optimal value of the objective funciton found by QPSO for ', [num2str(func_num)],' is : ', num2str(Best_score)]);
fprintf ('Best solution obtained by QPSO: %s\n', num2str(Best_pos,'%e '));
%% LQPSO
[LBest_score,LBest_pos,LQPSO_curve]=QPSO(fhd,func_num,N,T,lb,ub,D); % Calculating the solution of the given problem using PSO
display(['The best optimal value of the objective funciton found by QPSO for ', [num2str(func_num)],' is : ', num2str(LBest_score)]);
fprintf ('Best solution obtained by QPSO: %s\n', num2str(LBest_pos,'%e '));
%Draw objective space
%% Figure
figure1 = figure('Color',[1 1 1]);
CNT=35;
k=round(linspace(1,T,CNT)); %随机选CNT个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:T;
semilogy(iter(k),PSO_Convergence_curve(k),'m-*','linewidth',1);
hold on
semilogy(iter(k),QPSO_curve(k),'b-^','linewidth',1);
hold on
semilogy(iter(k),LQPSO_curve(k),'g-p','linewidth',1);
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('PSO','QPSO','LQPSO')
set (gcf,'position', [300,300,400,320])
代码说明:
①代码采用量子行为改进粒子群算法
②代码采用莱维飞行和量子行为改进粒子群算法
代码注释很详细。获取完整代码方式:电机下方卡片回复关键词获取。
关键词:LQPSO