2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force)

龙卷风优化算法(Tornado optimizer with Coriolis force)是发表在中科院二区期刊"ARTIFICIAL INTELLIGENCE REVIEW"(IF:11.7)的2025年智能优化算法

01.引言

当自然界的狂暴之力,化身数字世界的智慧引擎:龙卷风,自然界最神秘的力量之一------雷暴盘旋、风切变激荡、科里奥利力牵引,最终凝聚成摧毁万物的旋转风暴。科学家们从这场"天地博弈"中捕捉灵感,打造出​「Tornado Optimizer with Coriolis Force (TOC)」​算法,将风暴形成的动态过程转化为优化问题的终极解法。无需复杂数学模型,不依赖初始参数,仅凭对自然规律的模拟,即可在浩瀚解空间中精准捕获最优答案!

传统算法的困局:为什么我们需要一场"风暴革命"?

在人工智能与工程优化领域,经典算法正面临三大挑战:

​梯度陷阱:传统方法依赖精确的数学梯度,面对噪声数据或非线性问题时束手无策。

​早熟收敛:元启发式算法常陷入局部最优,如同探险者被困山谷,错失远方高峰。

​维度灾难:高维问题中,解空间呈指数级膨胀,计算资源如泥牛入海。

TOC算法的突破,在于用自然界的混沌之力对抗数学的确定性困局------龙卷风的形成、旋转与消散,恰好映射了优化过程中探索、聚焦与迭代的智慧。

02.优化算法的流程

所提出的具有科里奥利力 (TOC) 的龙卷风优化器的想法是基于对龙卷风形成和消散以及风暴和雷暴如何在自然界中演变形成龙卷风的观察而受到启发。为了进一步澄清,关于龙卷风如何产生并向陆地移动的一些基本知识,它们遵循可识别的生命周期,如下所述:当风暴系统内的风速和风向发生变化时,该周期就开始了。这会产生一种旋转效果,该效果由穿过雷云的上升气流垂直倾斜。在这种情况下,风暴通常会发生在那个点。当风暴增强时,它通常会变成超级单体雷暴。另一种说法是,强大的雷暴在大气层几英里高的地方发展出一个旋转系统,成为超级单体或雷云单体。这些超级单体雷暴是独特的、孤立的单体,不属于风暴线的一部分。超级单体风暴是兜兜转转的风暴。当旋转的垂直气柱和超级单体雷暴一起时,风暴云可能会产生龙卷风。龙卷风形成过程的各个阶段可以在图下中观察到。

1. 风暴初生:种群的混沌与秩序

算法初始化时,随机生成三类"风暴个体":

​普通风暴​(随机探索者):广泛散布在解空间,寻找潜力区域。

​雷暴​(精英个体):当前较优解,吸引周围风暴向其靠拢。

​龙卷风​(全局最优):吞噬能量,成为局部区域的绝对核心。

自然隐喻:就像真实风暴需要温度、湿度与风切变的配合,算法通过动态调整"风暴能量",平衡搜索的广度与深度。

​2. 科里奥利效应:给优化加上"地球自转"的智慧

龙卷风在北半球逆时针旋转、南半球顺时针旋转的现象,被抽象为方向扰动机制:

​北半球模式:解向量向右偏转,增强对未知区域的探索。

​南半球模式:解向量向左偏转,强化对已知优势区域的挖掘。

这种动态偏转有效避免了算法"原地打转",仿佛为搜索过程装上导航罗盘。

​3. 气旋平衡方程:暴力美学中的数学优雅

借鉴流体力学中的梯度风速模型,TOC将气压梯度力、离心力与科里奥利力的平衡关系转化为迭代公式:

​高压区​(局部最优解):离心力主导,推动个体逃离"舒适区"。

​低压区​(潜力区域):科里奥利力牵引,引导种群螺旋式逼近。

整个过程宛如一场精心编排的"风暴之舞",在破坏与重建中逼近全局最优。

​4. 消散与重生:劣解的淘汰与新星的崛起

当风暴能量衰减(适应度不再提升),算法自动触发"消散机制":

淘汰停滞个体,释放计算资源。

随机生成新风暴,注入新鲜血液。

这一机制完美复刻自然界的物竞天择,确保种群永葆进化活力。

论文伪代码:

3.论文中算法对比图

04.本代码效果图

05.部分代码

复制代码
function [TornadoCost,Tornadoposition,ccurve]=TOC(n,max_it,lb,ub,dim,fobj,nto,nt)
%% Convergence curve
ccurve=zeros(1,max_it);
    
%% Generate initial population for the Tornado Optimizer with Coriolis force (TOC) 
% Create initial population for Tornado, thunderstorms, and windstorms, and initialize the positions of population
 
y=initialization(n,dim,ub,lb);
% Evaluate the fitness of initial population for Tornado, thunderstorms, and windstorms 
fit = zeros(size(y,1),1);
for i=1:size(y,1)
     fit(i,1)=fobj(y(i,:));
end
[~,index]=sort(fit) ;
%% Forming Windstorms, Thunderstorms, and Tornado of the Tornado Optimizer with Coriolis force (TOC) 
% nto: Number of thunderstorms and tornadoes
% Nt : Number of thunderstorms
% To:  Number of tornadoes
% nw: number of windstorms
To= nto - nt;% Tornadoes
nw=n-nto; % Windstorms
%================ Forming and evaluating the population of the Tornadoes ================
Tornadoposition=y(index(1:To),:) ; % 
TornadoCost=fit(index(1:To)); 
        
 %================ Forming and evaluating the population of the Thunderstorms ================
Thunderstormsposition(1:nto-1,:)=y(index(2:nto),:);
ThunderstormsCost(1:nto-1)=fit(index(2:nto));
bThunderstormsCost = ThunderstormsCost;
gThunderstormsCost=zeros(1,nto-1);
     
[~,ind]=min(ThunderstormsCost);
bThunderstormsposition = Thunderstormsposition; % Initial best Thunderstorms position
gThunderstormsCost = Thunderstormsposition(ind,:); % Initial global Thunderstorms position
%================ Forming and evaluating the population of the Windstorms ================
  
Windstormsposition(1:nw,:)=y(index(nto+1:nto+nw),:) ; 
WindstormsCost(1:nw)=fit(index(nto+1:nto+nw)) ;  
gWindstormsposition=zeros(1,nw);
bWindstormsCost = WindstormsCost;
[~,ind]=min(WindstormsCost);
bWindstormsposition = Windstormsposition; % % Initial best windstorms position (Update the best positions of windstorms)
gWindstormsposition = Windstormsposition(ind,:); % Initial global windstorms position
 
%% Velcity term of TOC 
vel_storm = 0.1*Windstormsposition; % Velocity of windstorms
%%  Designate windstorms to thunderstorms and Tornadoes 
nwindstorms=1:nw;
 
nwindstorms=nwindstorms(sort(randperm(nw,nto)));
 
% Combining windstorms to tornado
nWT=diff(nwindstorms)';
nWT(end+1)= nw-sum(nWT);
% nWT1=sort(nWT1,'descend');
nWT1 = nWT(1);
% Combining windstorms to thunderstorms
nWH=nWT(2:end);
%% Parameter setting s for TOC
b_r=100000;  
fdelta=[-1,1];
%% Key functions of Tornado Optimizer with Coriolis force (TOC) 
chi=4.10;
eta=2/abs(2-chi-sqrt(chi^2-4*chi)) ;
%% ================  Main Loop for TOC ================ 
disp('================  Tornado Optimizer with Coriolis force (TOC) ================ ');
t=1;
 
while t<=max_it
    
%% Key adaptive functions (Adaptive parameters) of TOC
     
   nu  =(0.1*exp(-0.1*(t/max_it)^0.1))^16;
   mu = 0.5 + rand/2;
   ay=(max_it-(t^2/max_it))/max_it ;
   
   Rl = 2/(1+exp((-t+max_it/2)/2)) ;  
   Rr = -2/(1+exp((-t+max_it/2)/2)) ;  
        
 %%  Evolution of windstorms to Tornadoes
     % Update velocity     
for i=1:nw
    for j = 1:dim
         if rand > 0.5
           
          delta1=fdelta(ceil(2*rand()));
          zeta=ceil((To).*rand(1,To))'; %  
          wmin=1; wmax=4.0; rr=wmin+rand()*(wmax-wmin);
          wr= (((2*rand()) - (1*rand()+rand()))/rr); 
 
          c=b_r*delta1*wr;
           
          omega = 0.7292115E-04; 
%            w_r = sin(-1 + 2.*rand(1,1));
          f= 2*omega*sin(-1 + 2.*rand(1,1));
         
          phi(i,j) = Tornadoposition(zeta,j) - Windstormsposition(i,j);
          if sign(Rl)>=0 
              if sign(phi(i,j))>=0 
                phi(i,j) = -phi(i,j);
              end
          end
          
           CFl =(((f^2*Rl^2)/4) -Rl* 1 *phi(i,j));
            
            if sign(CFl)< 0 
                 CFl= -CFl;
            end
            
            vel_storm(i,j)= eta*  (mu*vel_storm(i,j) - c* (f*Rl)/2 +(sqrt(CFl)));
          
         else
          delta1=fdelta(ceil(2*rand()));
          zeta=ceil((To).*rand(1,To))'; %  
         rmin=1; rmax=4.0; rr=rmin+rand()*(rmax-rmin);
          wr= (((2*rand()) - (1*rand()+rand()))/rr); 
            c=b_r*delta1*wr; 
 
            phi(i,j) = Tornadoposition (zeta,j)-Windstormsposition(i,j);
 
         if sign(Rr)<=0 
              if sign(phi(i,j))<=0 
                phi(i,j) = -phi(i,j);
               end
         end
         
        omega =0.7292115E-04;% s�1
%          w_r = sin(-1 + 2.*rand(1,1));
         f= 2*omega*sin(-1 + 2.*rand(1,1));
         
         CFr =(((f^2*Rr^2)/4) -Rr* 1 *phi(i,j));
            
            if sign(CFr)<0 
                 CFr= -CFr;
            end 
            
           vel_storm(i,j)= eta  *(mu* vel_storm(i,j) - c* (f*Rr)/2 +(sqrt(CFr)))  ;        
         end
     end
        
end 
               
%% %% Exploration - Evolution of windstorms to Tornadoes
  
for i=1:nWT1
          rand_index = floor((nWT1).*rand(1,nWT1))+1;
          rand_w = Windstormsposition(rand_index, :);
   
            alpha=abs(2*ay*rand-1*rand)   ;
     
         Windstormsposition(i,:)=Windstormsposition(i,:)+2*alpha*(Tornadoposition  - rand_w(i,:)) + vel_storm(i,:);
%  
                    
             ub_=Windstormsposition(i,:)>ub; lb_=Windstormsposition(i,:)<lb;
             
             Windstormsposition(i,:)=(Windstormsposition(i,:).*(~(ub_+lb_)))+ub.*ub_+lb.*lb_;
             
            WindstormsCost (i)=fobj(Windstormsposition(i,:));
     
       %%% Finding out the best positions
               if WindstormsCost(i)<bWindstormsCost(i)
                    bWindstormsposition(i,:)=Windstormsposition(i,:) ; % Best solutions
                    bWindstormsCost(i)=WindstormsCost(i);   % Best cost
              end
      
end
      [minTornadoCost,in]=min(bWindstormsCost); % finding out the best Pos
   if (minTornadoCost<TornadoCost)
         TornadoCost=minTornadoCost;
         Tornadoposition = bWindstormsposition(in,:); % Update the global best positions
   end 
   
%% ================ Exploitation -  Evolution of windstorms to thunderstorms ================ 
%% ================  Combining windstorms together to form thunderstorms ================  
    for i=1:nt
        for j=1:nWH(i)
            
         rand_index = floor((nt).*rand(nt))+1;
         rand_w = Windstormsposition(rand_index, :);
         
         c1=abs(2*ay*rand-1*ay); 
       
        c2=abs(ay - 2*ay*rand);
         
 Windstormsposition((j+sum(nWT(1:i))),:)=Windstormsposition((j+sum(nWT(1:i))),:)+2*rand*(Thunderstormsposition(i,:)-Windstormsposition((j+sum(nWT(1:i))),:))+...
                + 2*rand*(Tornadoposition (1,:)-Windstormsposition((j+sum(nWT(1:i))),:));
              ub_=Windstormsposition((j+sum(nWT(1:i))),:)>ub; lb_=Windstormsposition((j+sum(nWT(1:i))),:)<lb;
             
             Windstormsposition((j+sum(nWT(1:i))),:)=(Windstormsposition((j+sum(nWT(1:i))),:).*(~(ub_+lb_)))+ub.*ub_+lb.*lb_;
             
             
            WindstormsCost((j+sum(nWT(1:i))))=fobj(Windstormsposition((j+sum(nWT(1:i))),:));
            
                  
             if WindstormsCost((j+sum(nWT(1:i))))<ThunderstormsCost(i)              
                  bThunderstormsposition(i,:) =Windstormsposition((j+sum(nWT(1:i))),:);
                 
                Thunderstormsposition(i,:)=Windstormsposition((j+sum(nWT(1:i))),:);
                ThunderstormsCost(i)=WindstormsCost((j+sum(nWT(1:i))));
                 
             end 
            
             
        end
    end   
    
%
   [minTornadoCost, in]=min(ThunderstormsCost); % finding out the best Pos
   if (minTornadoCost<TornadoCost)
         TornadoCost=minTornadoCost;
         Tornadoposition = bThunderstormsposition(in,:); % Update the global best positions
  end 
 
    
%% ================  Evolution of thunderstorms to tornado ================ 
  for i=1:nt        
                  zeta=ceil((To).*rand(1,To)); %  
 
                  alpha=abs(2*ay*rand-1*rand)    ; 
                  p = floor((nt).*rand(1,nt))+1;
                  rand_w = Thunderstormsposition(p, :);
         
Thunderstormsposition(i,:)=Thunderstormsposition(i,:)+2.*alpha*(Thunderstormsposition(i,:) - Tornadoposition(zeta,:))+...
            +2.*alpha*(rand_w(i,:) - Thunderstormsposition(i,:));
    
            
        ub_=Thunderstormsposition(i,:)>ub; lb_=Thunderstormsposition(i,:)<lb;
             
             Thunderstormsposition(i,:)=(Thunderstormsposition(i,:).*(~(ub_+lb_)))+ub.*ub_+lb.*lb_;
             
         ThunderstormsCost(i) =fobj(Thunderstormsposition(i,:));
      	if ThunderstormsCost(i)<bThunderstormsCost(i)         
            bThunderstormsposition(i,:) =Thunderstormsposition(i,:);
            bThunderstormsCost(i) =ThunderstormsCost(i);
     	end
                
  end
   [minTornadoCost,in]=min(bThunderstormsCost); % finding out the best Pos
   if (minTornadoCost<TornadoCost)
         TornadoCost=minTornadoCost;
         Tornadoposition = bThunderstormsposition(in,:); % Update the global best positions
  end 
  
 
%%   ================  Random formation of windstorms, tornadoes and thunderstorms ================ 
   % Check windstorms formation for windstorms and tornadoes
 for i=1:nWT1
        if  ((norm(Windstormsposition(i,:)-Tornadoposition)<nu))
             
               delta2=fdelta(floor(2*rand()+1));
              
            Windstormsposition(i,:)=  Windstormsposition(i,:) - (2*ay*(rand*(lb-ub) - lb))*delta2;
        end
end  
  
% Check windstorms formation for windstorms and thunderstorms
      
for i=1:nt
         if  ((norm(Windstormsposition(i,:)-Thunderstormsposition(i,:))<nu))
            for j=1:nWH(i)
                 delta2=fdelta(floor(2*rand()+1)) ;
                Windstormsposition((j+ sum(nWT(1:i))),:)=  Windstormsposition((j+ sum(nWT(1:i))),:) - (2*ay*(rand*(lb-ub) - lb))*delta2;
 
          end
        end
end 
 
%% Results and Plot   
    
    disp(['Iteration: ',num2str(t),'   minTornadoCost= ',num2str(TornadoCost)]);
    ccurve(t)=TornadoCost;
  
 %{
 if t>2
        line([t-1 t], [ccurve(t-1) ccurve(t)],'Color','b'); 
        title({'Convergence characteristic curve'},'interpreter','latex','FontName','Times','fontsize',12);
        xlabel('Iteration');
        ylabel('Best score obtained so far');
        drawnow 
 end 
%}
    t=t+1;
    
end
 
end

✅作者简介:信号处理方向在校博士研究生,目前专研于MATLAB算法及科学绘图等,熟知各种信号分解算法、神经网络时序、回归和分类预测算法、数据拟合算法以及滤波算法。提供一个可以相互学习相互进步的平台

🚩技术信仰:知行合一,让每一行代码都成为解决问题的利器

🔍后台私信备注个人需求(比如TOC-BP)定制以下TOC算法优化模型(看到秒回):

1.回归/时序/分类预测类:BP、RF、XGBoost、RBF、LSSVM、SVM、ELM、DELM、ESN、RELM等等均可,优化算法优化BP为例,可达到以下效果:

(1)优化BP神经网络的数据时序预测

(2)优化BP神经网络的数据回归(多输入多输出)预测

(3)优化BP神经网络的数据回归预测

2.分解类:EEMD、VMD、REMD、CEEMDAN、ICEEMDAN、SVMD等分解模型均可,优化算法优化VMD/ICEEMDAN为例,可达到以下效果:

(1)基于改进天鹰优化算法(IAO)优化的VMD参数

(2)基于改进天鹰优化算法(IAO)优化ICEEMDAN参数

3.去噪算法算法类:VMD/CEEMDAN/ICEEMDAN/SVMD+小波阈值/SVD去噪,可在去噪算法前加智能优化算法优化参数以VMD-WT/SVD为例,可达到以下效果:

(1)基于VMD-SpEn(样本熵)联合小波阈值去噪

(2)基于SVMD-SVD的信号去噪算法

(3)基于ZOA优化VMD-IAWT岩石声发射信号降噪算法

相关推荐
字节王德发1 小时前
Django CSRF验证失败请求为什么会中断?
python·django·csrf
杜子腾dd1 小时前
20. Excel 自动化:Excel 对象模型
运维·python·数据挖掘·自动化·excel·numpy·pandas
-一杯为品-1 小时前
【小项目】四连杆机构的Python运动学求解和MATLAB图形仿真
开发语言·python·matlab
神仙别闹1 小时前
基于Python的垃圾短信分类
java·python·分类
aiguangyuan1 小时前
Python中数据结构元组详解
python·后端开发
豆芽8191 小时前
深度学习与计算机视觉方向
人工智能·python·深度学习·opencv·机器学习·计算机视觉
賢8432 小时前
工具层handle_response
python
欣然~2 小时前
基于蒙特卡洛方法的网格世界求解
开发语言·python·信息可视化
棉猴2 小时前
Pygame实现记忆拼图游戏14
python·游戏·pygame·游戏编程·python游戏编程
小爬虫程序猿3 小时前
如何解析返回的商品信息?
爬虫·python