2023年智能算法改进--融合正余弦和柯西变异的登山队优化算法

今天的主角是:登山队优化算法(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。

10751e2dd74d51edfccc0e02aece2cba.png

fa13e56f19d75e479586cc2edfb3358d.png

8fcd0df197260635ef777523061d9233.png

a130cf31086aebee5dc7b7905ba0f1af.png

0c91ea72548915f4ecfcba72c49abe79.png

结果分析:在单峰值函数与多峰值函数的测试中可以看到,融合折射原理,正余弦策略和柯西变异的登山队优化算法,改进后效果非常不错!上篇文章有提到,可以将柯西变异和正余弦策略用于其他算法的改进。大家可以结合上一篇文献,看看两个算法的代码是怎么写的,相互对比,慢慢学习,渐渐地自己也就会改进一些算法了。

代码展示:

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<Li
        newsol.Position = pop(i).Position ...
            +rand(VarSize).*(pop(ii).Position-pop(i).Position) + rand(VarSize).*(Leader.Position-pop(ii).Position);
        elseif rand<Ai
              newsol.Position = pop(i).Position ...
            + 1*rand(VarSize).*(pop(i).Position-pop(nPop).Position); 
         elseif rand<Mi
              newsol.Position = pop(i).Position ...
            + 1*rand(VarSize).*(Mean-pop(i).Position); 
        else


            newsol.Position = unifrnd(VarMin, VarMax, VarSize); 


        
    end
        
   
        newsol.Position = max(newsol.Position, VarMin);
        newsol.Position = min(newsol.Position, VarMax);


        newsol.Cost = CostFunction(newsol.Position);
   
        if newsol.Cost<pop(i).Cost
            pop(i) = newsol;
             if pop(i).Cost < Leader.Cost
            Leader = pop(i);
                      end
        end
    end
% Sort Population
    [uuu, SortOrder]=sort([pop.Cost]);
    pop = pop(SortOrder);
   
    % Store Record for Current Iteration
 Convergence_curve(it) =pop(1).Cost;
     
end


%% Results
Destination_fitness=pop(1).Cost;
Destination_position=pop(1).Position;
end

改进的登山队优化算法代码,作者放在后台压缩包里边啦。

完整代码获取方式,后台回复关键词。

关键词:SCMTBO

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天吃饺子

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值