今天的主角是:登山队优化算法(Mountaineering Team-Based Optimization,MTBO)
该算法是由Faridmehr于2023年3月提出来的。这篇文章采用正余弦和柯西变异对其进行改进。改进的原理与上一篇文章一样。融合正余弦和柯西变异的麻雀搜索算法,并与灰狼算法,粒子群算法比较
在登山队优化算法的基础上,改进点如下:
①采用折射反向学习策略初始化登山队员个体,基本思想是通过计算当前解的反向解来扩大搜索范围,借此找出给定问题更好的备选解;
②采用正余弦策略替换原始登山队算法的协助登山位置更新公式。协助登山公式虽然考虑到队长和新进队员的影响,但是太过随机,导致算法很容易陷入局部解;
③对正余弦策略的步长搜索因子进行改进;原始步长搜索因子呈线性递减趋势,不利于进一步平衡登山队优化算法的全局搜索和局部开发能力。
④采用柯西变异策略替换原始登山队优化算法的随机替换成员阶段。随机替换成员阶段,采用的是正态分布随机数的方式生成新的队员。柯西分布与标准的正态分布相似,为连续的概率分布,在原点处值较小,两端较为扁长,逼近零速率较慢, 因而相比于正态分布能产生更大的扰动。因此,利用柯西变异对登山队员位置更新中的个体进行扰动,从而扩大登山队优化算法的搜索规模,进而提升算法跳出局部最优能力。
关于以上四点的原理公式及思路参考文献:
参考文献:[1] 李爱莲, 全凌翔, 崔桂梅, 等. 融合正余弦和柯西变异的麻雀搜索算法[J]. 计算机工程与应用, 2022, 58(3): 91-99.
登山队优化算法的参考文献:
参考文献:Faridmehr, I.; Nehdi, M.L.; Davoudkhani, I.F.; Poolad, A. Mountaineering Team-Based Optimization: A Novel Human-Based Metaheuristic Algorithm. Mathematics 2023, 11, 1273. https://doi.org/10.3390/math11051273
在CEC2005函数集上进行测试,结果如下:其中SCMTBO为本文所提改进算法,MTBO是原始的登山队优化算法,GWO是灰狼优化算法,PSO是粒子群优化算法。
算法迭代1000次,每种算法的粒子数设置为100。
结果分析:在单峰值函数与多峰值函数的测试中可以看到,融合折射原理,正余弦策略和柯西变异的登山队优化算法,改进后效果非常不错!上篇文章有提到,可以将柯西变异和正余弦策略用于其他算法的改进。大家可以结合上一篇文献,看看两个算法的代码是怎么写的,相互对比,慢慢学习,渐渐地自己也就会改进一些算法了。
代码展示:
clear all
close all
clc
N=100; % Number of search agents
Function_name='F1'; % Name of the test function, range from F1-F23
iter=1000; % Maximum number of iteration times
% Load details of the selected benchmark function
[lb,ub,dim,fobj]=CEC2005(Function_name);
%% MTBO
[fMin , bestX,MTBO_Convergence_curve ] =MTBO(N,iter,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by MTBO for ' [num2str(Function_name)],' is : ', num2str(fMin)]);
fprintf ('Best solution obtained by MTBO: %s\n', num2str(bestX,'%e '));
%% PSO
[Best_score,Best_pos,PSO_curve]=PSO(N,iter,lb,ub,dim,fobj); % Calculating the solution of the given problem using PSO
display(['The best optimal value of the objective funciton found by PSO for ', [num2str(Function_name)],' is : ', num2str(Best_score)]);
fprintf ('Best solution obtained by PSO: %s\n', num2str(Best_pos,'%e '));
%% gwo
[Alpha_score,Alpha_pos,GWO_Convergence_curve]=GWO(N,iter,lb,ub,dim,fobj); % Calculating the solution of the given problem using gwo
display(['The best optimal value of the objective funciton found by GWO for ', [num2str(Function_name)],' is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by GWO: %s\n', num2str(Alpha_pos,'%e '));
%% MTBO
[SCMTBO_fMin,SCMTBO_bestX,SCMTBO_curve]=SCMTBO(N,iter,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by SCMTBO for ' [num2str(Function_name)],' is : ', num2str(SCMTBO_fMin)]);
fprintf ('Best solution obtained by SCMTBO: %s\n', num2str(SCMTBO_bestX,'%e '));
%Draw objective space
%% Figure
figure1 = figure('Color',[1 1 1]);
G1=subplot(1,2,1,'Parent',figure1);
func_plot(Function_name)
title(Function_name)
xlabel('x')
ylabel('y')
zlabel('z')
subplot(1,2,2)
G2=subplot(1,2,2,'Parent',figure1);
CNT=35;
k=round(linspace(1,iter,CNT)); %随机选CNT个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:iter;
semilogy(iter(k),PSO_curve(k),'b-^','linewidth',1);
hold on
semilogy(iter(k),GWO_Convergence_curve(k),'y-*','linewidth',1);
hold on
semilogy(iter(k),MTBO_Convergence_curve(k),'r->','linewidth',1);
hold on
semilogy(iter(k),SCMTBO_curve(k),'g-p','linewidth',1);
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('PSO','GWO','MTBO','SCMTBO')
set (gcf,'position', [300,300,800,320])
登山队优化算法代码(有之前在这里下载过代码的小伙伴,直接复制下方代码到自己的文件夹即可)
function [Destination_fitness,Destination_position,Convergence_curve]=MTBO(N,Max_iteration,lb,ub,dim,fobj)
% disp('MTBO: Mountaineering Team Based Optimization')
CostFunction = @(x) fobj(x);
nVar = dim; % Number of Variables
VarSize = [1 nVar];
VarMin = lb; %Variables Lower Bound
VarMax =ub ; %Variables Upper Bound
%% MTBO Parameters
MaxIt = Max_iteration; % Maximum Number of Iterations
nPop = N; % Population Size
%% Initialization
% Empty Structure for Individuals
empty_individual.Position = [];
empty_individual.Cost = [];
% Initialize Population Array
pop = repmat(empty_individual, nPop, 1);
% Initialize Best Solution
BestSol.Cost = inf;
% Initialize Population Members
for i=1:nPop
pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
pop(i).Cost = CostFunction(pop(i).Position);
if pop(i).Cost < BestSol.Cost
BestSol = pop(i);
end
end
% Initialize Best Cost Record
BestCosts = zeros(MaxIt,1);
%% MTBO Main Loop
for it=1:MaxIt
% Calculate Population Mean
Mean = 0;
for i=1:nPop
Mean = Mean + pop(i).Position;
end
Mean = Mean/nPop;
% Select Leader
Leader = pop(1);
for i=2:nPop
if pop(i).Cost < Leader.Cost
Leader = pop(i);
end
end
for i=1:nPop
% Create Empty Solution
newsol = empty_individual;
ii=i+1;
if ii>nPop
ii=1;
end
Li=(0.25+0.25*rand);
Ai=(0.75+0.25*rand);
Mi=(0.75+0.25*rand);
if rand
改进的登山队优化算法代码,作者放在后台压缩包里边啦。
完整代码获取方式,后台回复关键词。
关键词:SCMTBO