必须先夸夸这个算法:算法的效果确实很不错,而且算法的逻辑确实有点田忌赛马的意味!很有趣且搜索效果很不错的算法!

田忌赛马优化算法(Tianji’s Horse Racing Optimization,THRO)是一种受中国历史策略智慧启发的新型群体智能优化算法。其灵感源自“田忌赛马”中以劣胜优、策略制胜的博弈思想,模拟种群个体之间的动态匹配与策略对抗机制。THRO 通过引入“个体博弈+贪婪匹配”双机制,模拟在竞赛中利用优势规避劣势的过程,从而提升优化精度与收敛效率。在算法结构上,THRO 采用动态个体对抗模型,结合贪婪选择策略,实现跨种群协同进化与高效更新,突破了传统优化方法中种群更新机制单一、适应性不足的局限。作为一项融合博弈策略思想与群体智能机制的创新算法,THRO为复杂系统优化问题提供了一种具有文化底蕴与算法创新性的智能求解新路径。

该成果于2025年5年最新发表在计算机领域一区TOP期刊Artificial Intelligence Review期刊上。

田忌赛马的故事发生在中国古代的春秋时期,距今已有两千多年。这是中国历史上著名的典范,揭示了如何有效利用自身优势来对抗对手弱点并赢得竞争。下图展示了田忌赛马的博弈策略。

各等级马匹之间的差异程度决定了对抗双方的策略选择。在算法设计中,两个种群当前马匹的质量差异同样决定其采用何种搜索策略。在这一故事中,田忌通过灵活搭配不同水平的马匹以对抗对手,所采用的博弈策略恰与所提出算法中的“开发–探索”阶段相呼应,并最终引导出用于实现全局优化的数学建模框架。

1、算法原理

(1)比赛机制

对于 THRO 算法,假设存在两个种群,一个为田忌的马匹,另一个为齐王的马匹。两个种群中均包含  匹马。田忌的马匹可表示为:

其中,  表示田忌种群中的第  匹马,一匹马具有多个属性,例如品种、体格、年龄等,这些属性都会影响马的奔跑速度。  表示田忌种群中第  匹马的第  个属性,  为马匹属性的数量。对于一个最小化问题,适应度值表示马的速度;适应度值越小,表示马跑得越快。

类似地,齐王的马匹可表示为:

其中,  表示王方的第  匹马。

在田忌与王的赛马故事中,双方均仅使用三匹马进行比赛。虽然原故事仅涉及每方三匹马,但该算法将其推广至  匹( )马,并分别按照马匹速度降序排序(即对于最小化问题,马匹按照适应度函数值升序排序)。马匹根据速度被划分为  个等级。第一等级马匹最快,第  等级马匹最慢。

每次迭代中将进行  轮比赛。每轮比赛后,双方对应的马匹将从当前群体中移除。对于双方各  匹马的比赛,THRO 算法采用以下五种竞赛策略。

场景1:当田忌当前最慢的马比王当前最慢的马还快时,田忌使用其当前最慢的马与王的当前最慢的马比赛,且田忌获胜。

在本轮比赛中,为保持领先,算法将根据田忌马群中最快的马对田忌当前最慢的马进行更新,同时需考虑田忌马群中最快的马以及双方马匹整体质量差异对田忌当前最慢的马的影响。田忌当前最慢的马更新公式为:

其中,  是田忌当前最慢的马, 是田忌当前最慢的马的编号, 和服从标准正态分布, 是田忌马群中最快的马, 和分别是田忌和王马群的平均质量, 是权重, 是标准伽马函数,且。  是运行因子,辅助算法在解空间的随机维度上利用 Levy 飞行进行搜索。这将导致搜索过程中在多个维度上出现不同程度的长距离跳跃与短距离移动。该因子不仅有助于算法避免陷入局部最优,还能使其在多维方向上进行全局探索。ꞵ 是一个变异项,旨在增强种群的多样性,从而确保更高效的搜索过程。

下图展示了运行因子在二维和三维空间中50步的轨迹。从图可以看出,在二维空间中,算法不仅可以沿着两个维度的合力方向进行搜索,还可以沿任一一维方向进行搜索;在三维空间中,算法不仅可以沿着三个维度的合力方向进行搜索,还可以沿任意两个维度的合力方向或任意一维方向进行搜索。

同时,齐王当前最慢的马试图追赶田忌当前最慢的马,因此算法将根据田忌当前最慢的马来更新齐王当前最慢的马,齐王当前最慢的马的更新公式为:

下图展示了情景1中THRO的竞赛策略。图中,“>”符号表示左侧的马比右侧的马更快;红色双箭头表示双方用于竞赛的马匹;虚线箭头表示箭头指向的马用于更新箭头所指向的马。

场景2:当田忌当前最慢的马比齐王当前最慢的马还慢时,田忌使用这匹最慢的马去与齐王当前最快的马比赛。虽然田忌会在此轮比赛中输掉,但他用自己当前最弱的马来牵制齐王当前最快的马。在该轮比赛中,由于田忌知道其当前马群中最慢的马比齐王当前马群中的任何一匹都要慢,算法基于从田忌整个马群中随机选择的一匹马来更新田忌当前最慢的马。田忌当前最慢的马的更新公式为:

其中,  是从田忌马群中随机选取的一匹马。在公式中,  旨在靠近 ,同时考虑两马群整体实力差异以及  的质量。对于齐王而言,他会努力让自己的马跑得比田忌的马更快以保持领先地位。因此,算法根据齐王整个马群中的最快马来更新齐王当前最快的马,齐王当前最快马的更新公式为:

其中,  是齐王马群中最快的马,  表示齐王当前最快马的编号。下图展示了THRO算法在场景2中的竞赛策略。

场景3:当田忌当前最慢的马与齐王当前最慢的马速度相当,且田忌当前最快的马比齐王当前最快的马更快时,田忌当前最快的马用于与齐王当前最快的马比赛,田忌获胜。因此,在本轮比赛中,为尽可能保持田忌马的领先地位,算法根据田忌马群中最快的马更新田忌当前最快的马,更新公式表示为:

其中,  表示田忌当前最快马的编号,  是田忌马群中最快的马。在公式  中,  旨在靠近 ,同时考虑两马群整体实力的差异以及  的水平。为了追赶对手,齐王当前最快的马会以田忌当前最快的马为参照进行更新,该更新表达式为:

下图展示了场景 3 中 THRO 的竞赛策略,其中符号“=”表示符号两侧的马速相同。

场景 4: 当田忌当前最慢的马与齐王当前最慢的马速度相同时,且田忌当前最快的马速度慢于齐王当前最快的马,为了抵消齐王最强的马,田忌当前最慢的马用来与齐王当前最快的马比赛,田忌输掉了比赛。因此,在这一轮中,由于田忌当前最慢的马必定输,算法倾向于从田忌马群中随机选取一匹马来更新田忌当前最慢的马。更新表达式如下:

其中,  是从田忌马群中随机选取的一匹马。公式  趋向于接近 ,同时考虑两个马群整体实力差异及  的水平。对于齐王,类似于场景 2,算法以其马群中最快的马为参照,更新齐王当前最快的马,更新表达式如下:

下图展示了THRO算法在场景4中的竞赛策略。

场景5:当田忌当前最慢的马与齐王当前最慢的马速度相同时,且田忌当前最快的马与齐王当前最快的马速度相同时,田忌使用当前最慢的马与齐王当前最快的马比赛,田忌失败。对于这两匹马,算法采用与场景4类似的更新方法。田忌当前最慢的马更新公式为:

其中,  是从田忌马群中随机选择的一匹马。齐王当前最快的马更新为:

下图展示了THRO算法中场景5的竞赛策略。

在田忌赛马的故事中,田忌取胜的前提是齐王的马在各等级别上略优于田忌的马。在THRO算法中,引入了项 ,表示双方马匹平均质量的差异。该质量差异的变化使得田忌的竞赛策略在寻找全局最优解的过程中表现出不同的搜索行为,从而提升了优化效果。

(2)训练

由于THRO是一个迭代搜索过程,上一轮迭代得到的解需要在下一轮迭代中得到有效强化。为防止解的强化过程陷入停滞,设计了一种训练策略。每场比赛结束后,双方的马匹都需要进行训练,以提升它们在下一场比赛中的竞争能力。马匹可以与速度不同的其他马匹进行训练,逐步提高速度,同时还可与群体中最快的马匹进行专项训练,以发挥其最大潜力。该策略的数学表达为:

其中,  表示田忌马群中编号为的马的第个属性, 表示齐王马群中编号为的马的第个属性, 表示田忌马群中最快马匹的第个属性; 和分别是从田忌马群中随机选出的两匹马的编号; 表示齐王马群中最快马匹的第个属性, 和分别是从齐王马群中随机选出的两匹马的编号; 是最大迭代次数, 和是田忌马群的两个训练因子, 和 是齐王马群的两个训练因子。

THRO优化算法的流程图如下所示:

THRO优化算法的伪代码如下所示:

2、结果展示

测试完发现这个算法真的有点东西!几乎是我试过收敛效果最好的算法了。

一般的算法,如果在F12和F13有较好的收敛,那么在F1~F4这种简单函数上效果就会变差。而且这个算法是罕见的可以把F5函数搜索到1e-6次方的效果。

算法的逻辑我也基本看了一遍,确实是有点田忌赛马的意思,很有趣的算法,感兴趣的大家可以试试。

3、MATLAB核心代码

.rtcContent { padding: 30px; } .lineNode {font-size: 14pt; font-family: "新宋体", Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal; }function [BestX,BestFit,His_BestFit]=THRO(nPop0,MaxIt,Low,Up,Dim,FOBJ)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FunIndex: Index of function                                              %% nPop0: Sum of horse population of Tianji and King                        %% nPop: Number of horses each in Tianji's population and King's population %% MaxIt: Maximum number of iterations                                      %% Tianji_PopPos: Position of Tianji's horse population                     %% King_PopPos: Position of King's horse population.                        %  % Tianji_PopFit: Fitness of Tianji's horse population.                     %% King_PopFit: Fitness of King's horse population.                         %% Tianji_SlowestPos: Position of Tian's current slowest horse              %% King_SlowestPos: Position of King's current slowest horse                %% Tianji_FastestPos: Position of Tian's current fastest horse              %% King_FastestPos: Position of King's current fastest horse                %% Tianji_SlowestId: Tianji's current horse Id                              %% King_SlowestPos: King's current slowest horse Id                         %% Tianji_FastestId: Tianji's current fastest horse Id                      %% King_FastestPos: King's current horse Id                                 %% Dim: dimensionality of prloblem                                          %% BestX: Best solution found so far                                        %% BestFit: Best fitness corresponding to BestX                             %% His_BestFit: History best fitness over iterations                        %% LT: Trainging factor of Tianji's horse population                        %% MT: Trainging factor of Tianji's horse population                        %% LK: Trainging factor of King's horse population                          %% MK: Trainging factor of King's horse population                          %% Low: Low bound of search space                                           %% Up: Up bound of search space                                             %% R: Running factor                                                        %% p: Weight                                                                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nPop=nPop0/2;Low = Low.*ones(1,Dim);Up = Up.*ones(1,Dim);Tianji_PopPos=zeros(nPop,Dim);Tianji_PopFit=zeros(nPop,1);King_PopPos=zeros(nPop,Dim);King_PopFit=zeros(nPop,1);for i=1:nPop    Tianji_PopPos(i,:)=Low+rand(1,Dim).*(Up-Low);    Tianji_PopFit(i)=FOBJ(Tianji_PopPos(i,:));    King_PopPos(i,:)=Low+rand(1,Dim).*(Up-Low);    King_PopFit(i)=FOBJ(King_PopPos(i,:));endBestFit=inf;BestX=[];for i=1:nPop    if Tianji_PopFit(i)<=BestFit        BestFit=Tianji_PopFit(i);        BestX=Tianji_PopPos(i,:);    endendfor i=1:nPop    if King_PopFit(i)<=BestFit        BestFit=King_PopFit(i);        BestX=King_PopPos(i,:);    endendHis_BestFit=zeros(MaxIt,1);for It=1:MaxIt    Rand_nPop0=randperm(nPop0);    PopPos=[Tianji_PopPos;King_PopPos];    PopFit=[Tianji_PopFit;King_PopFit];    Tianji_PopPos=PopPos(Rand_nPop0(1:nPop),:);    Tianji_PopFit=PopFit(Rand_nPop0(1:nPop));    King_PopPos=PopPos(Rand_nPop0(nPop+1:nPop0),:);    King_PopFit=PopFit(Rand_nPop0(nPop+1:nPop0));    [Tianji_PopFit,ind]=sort(Tianji_PopFit);    Tianji_PopPos=Tianji_PopPos(ind,:);    [King_PopFit,ind]=sort(King_PopFit);    King_PopPos=King_PopPos(ind,:);    T_B=zeros(nPop,Dim);    K_B=zeros(nPop,Dim);    p=1-It/MaxIt;    for i=1:nPop        RandDim=randperm(Dim);        RandNum=ceil(sin(pi/2*rand)*Dim);        T_B(i,RandDim(1:RandNum))=1;        RandDim=randperm(Dim);        RandNum=ceil(sin(pi/2*rand)*Dim);        K_B(i,RandDim(1:RandNum))=1;    end    Tianji_SlowestId=nPop;    Tianji_FastestId=1;    King_SlowestId=nPop;    King_FastestId=1;    for i=1:nPop        Tianji_Alpha=1+round(0.5*(0.5+rand))*randn;        T_Beta=round(0.5*(0.1+rand))*randn;        King_Alpha=1+round(0.5*(0.5+rand))*randn;        K_Beta=round(0.5*(0.1+rand))*randn;        Tianji_R=levy(1)*T_B(i,:); % Eq. (7)        King_R=levy(1)*K_B(i,:); % Eq. (7)
        %% Scenario 1: If Tianji's current slowest horse is faster than King's current slowest horse        if Tianji_PopFit(Tianji_SlowestId)<King_PopFit(King_SlowestId)            Tianji_SlowestPos=Tianji_PopPos(Tianji_SlowestId,:);            King_SlowestPos=King_PopPos(King_SlowestId,:);            Tianji_newPopPos=((p*Tianji_SlowestPos+(1-p)*Tianji_PopPos(1,:))+ Tianji_R.* ...                (Tianji_PopPos(1,:)-Tianji_SlowestPos+p*(mean(Tianji_PopPos)-mean(King_PopPos))))*Tianji_Alpha+T_Beta; % Eq. (3)                       Tianji_newPopPos=SpaceBound(Tianji_newPopPos,Up,Low);            Tianji_newPopFit=FOBJ(Tianji_newPopPos);            if Tianji_newPopFit<Tianji_PopFit(Tianji_SlowestId)                Tianji_PopFit(Tianji_SlowestId)=Tianji_newPopFit;                Tianji_PopPos(Tianji_SlowestId,:)=Tianji_newPopPos;            end            King_newPopPos=((p.*King_SlowestPos+(1-p).*Tianji_SlowestPos)+ King_R.* ...                (Tianji_SlowestPos-King_SlowestPos+p*(mean(Tianji_PopPos)-mean(King_PopPos))))*King_Alpha+K_Beta; % Eq. (14)                        King_newPopPos=SpaceBound(King_newPopPos,Up,Low);            King_newPopFit=FOBJ(King_newPopPos);            if King_newPopFit<King_PopFit(King_SlowestId)                King_PopFit(King_SlowestId)=King_newPopFit;                King_PopPos(King_SlowestId,:)=King_newPopPos;            end            Tianji_SlowestId=Tianji_SlowestId-1;   %Eq. (3)            King_SlowestId=King_SlowestId-1;   %Eq. (14)        else            %% Scenario 2: If Tianji's current slowest horse is slower than King's current slowest horse            if Tianji_PopFit(Tianji_SlowestId)>King_PopFit(King_SlowestId)                Tianji_SlowestPos=Tianji_PopPos(Tianji_SlowestId,:);                King_FastestPos=King_PopPos(King_FastestId,:);                Tr1=randi(nPop);                Tianji_newPopPos=((p*Tianji_SlowestPos+(1-p)*Tianji_PopPos(Tr1,:))+ Tianji_R.* ...                    (Tianji_PopPos(Tr1,:)-Tianji_SlowestPos+p*(mean(Tianji_PopPos)-mean(King_PopPos))))*Tianji_Alpha+T_Beta;% Eq. (15)                                Tianji_newPopPos=SpaceBound(Tianji_newPopPos,Up,Low);                Tianji_newPopFit=FOBJ(Tianji_newPopPos);                if Tianji_newPopFit<Tianji_PopFit(Tianji_SlowestId)                    Tianji_PopFit(Tianji_SlowestId)=Tianji_newPopFit;                    Tianji_PopPos(Tianji_SlowestId,:)=Tianji_newPopPos;                end                King_newPopPos=((p.*King_FastestPos+(1-p).*King_PopPos(1,:))+ King_R.* ...                    (King_PopPos(1,:)-King_FastestPos+p*(mean(Tianji_PopPos)-mean(King_PopPos))))*King_Alpha+K_Beta; %Eq. (16)                King_newPopPos=SpaceBound(King_newPopPos,Up,Low);                King_newPopFit=FOBJ(King_newPopPos);                if King_newPopFit<King_PopFit(King_FastestId)                    King_PopFit(King_FastestId)=King_newPopFit;                    King_PopPos(King_FastestId,:)=King_newPopPos;                end                Tianji_SlowestId=Tianji_SlowestId-1;                King_FastestId=King_FastestId+1;            else                  %% Scenario 3: If Tianji's current slowest horse runs as fast as King's current slowest horse,                 %% and if Tianji's current fastest horse is faster than King's current fastest horse.                if Tianji_PopFit(Tianji_FastestId)<King_PopFit(King_FastestId)                    Tianji_FastestPos=Tianji_PopPos(Tianji_FastestId,:);                    King_FastestPos=King_PopPos(King_FastestId,:);                    Tianji_newPopPos=((p.*Tianji_FastestPos+(1-p).*Tianji_PopPos(1,:))+ Tianji_R.* ...                        (Tianji_PopPos(1,:)-Tianji_FastestPos+p*(mean(Tianji_PopPos)-mean(King_PopPos))))*Tianji_Alpha+T_Beta; %Eq. (17)                    Tianji_newPopPos=SpaceBound(Tianji_newPopPos,Up,Low);                    Tianji_newPopFit=FOBJ(Tianji_newPopPos);                    if Tianji_newPopFit<Tianji_PopFit(Tianji_FastestId)                        Tianji_PopFit(Tianji_FastestId)=Tianji_newPopFit;                        Tianji_PopPos(Tianji_FastestId,:)=Tianji_newPopPos;                    end                    King_newPopPos=((p.*King_FastestPos+(1-p).*Tianji_FastestPos)+King_R.* ...                        ( Tianji_FastestPos-King_FastestPos+p*(mean(Tianji_PopPos)-mean(King_PopPos))))*King_Alpha+K_Beta; %Eq. (18)                    King_newPopPos=SpaceBound(King_newPopPos,Up,Low);                    King_newPopFit=FOBJ(King_newPopPos);                    if King_newPopFit<King_PopFit(King_FastestId)                        King_PopFit(King_FastestId)=King_newPopFit;                        King_PopPos(King_FastestId,:)=King_newPopPos;                    end                    Tianji_FastestId=Tianji_FastestId+1;                    King_FastestId=King_FastestId+1;                else                                      %% Scenario 4: If Tianji's current slowest horse runs as fast as King's current slowest horse,                     %% and when Tianji's current fastest horse is slower than King's current fastest horse.                    if   Tianji_PopFit(Tianji_FastestId)> King_PopFit(King_FastestId)                        King_FastestPos=King_PopPos(King_FastestId,:);                        Tianji_SlowestPos=Tianji_PopPos(Tianji_SlowestId,:);                        Tr2=randi(nPop);                        Tianji_newPopPos=((p.*Tianji_SlowestPos+(1-p).*Tianji_PopPos(Tr2,:))+ Tianji_R.* ...                            (Tianji_PopPos(Tr2,:)-Tianji_SlowestPos+p*(mean(Tianji_PopPos)-mean(King_PopPos))))*Tianji_Alpha+T_Beta; %Eq. (19)                        Tianji_newPopPos=SpaceBound(Tianji_newPopPos,Up,Low);                        Tianji_newPopFit=FOBJ(Tianji_newPopPos);                        if Tianji_newPopFit<Tianji_PopFit(Tianji_SlowestId)                            Tianji_PopFit(Tianji_SlowestId)=Tianji_newPopFit;                            Tianji_PopPos(Tianji_SlowestId,:)=Tianji_newPopPos;                        end                        King_newPopPos=((p.*King_FastestPos+(1-p).*King_PopPos(1,:))+ King_R.* ...                            (King_PopPos(1,:)-King_FastestPos+p*(mean(Tianji_PopPos)-mean(King_PopPos))))*King_Alpha+K_Beta;                        % Eq.  (20)                        King_newPopPos=SpaceBound(King_newPopPos,Up,Low);                        King_newPopFit=FOBJ(King_newPopPos);                        if King_newPopFit<King_PopFit(King_FastestId)                            King_PopFit(King_FastestId)=King_newPopFit;                            King_PopPos(King_FastestId,:)=King_newPopPos;                        end                        Tianji_SlowestId=Tianji_SlowestId-1;%no                        King_FastestId=King_FastestId+1;%no                    else                                               %% Scenario 5: When Tianji's current slowest horse runs as fast as King,s current slowest horse                         %% and if Tianji's current fastest horse runs as fast as King's current fastest horse.                        if  Tianji_PopFit(Tianji_FastestId)==King_PopFit(King_FastestId)                            Tianji_SlowestPos=Tianji_PopPos(Tianji_SlowestId,:);                            King_FastestPos=King_PopPos(King_FastestId,:);                            Tr3=randi(nPop);                            Tianji_newPopPos=((p.*Tianji_SlowestPos+(1-p).*Tianji_PopPos(Tr3,:))+ Tianji_R.* ...                                (Tianji_PopPos(Tr3,:)-Tianji_SlowestPos+p*(mean(Tianji_PopPos)-mean(King_PopPos))) )*Tianji_Alpha+T_Beta; %Eq. (21)                            Tianji_newPopPos=SpaceBound(Tianji_newPopPos,Up,Low);                            Tianji_newPopFit=FOBJ(Tianji_newPopPos);                            if Tianji_newPopFit<Tianji_PopFit(Tianji_SlowestId)                                Tianji_PopFit(Tianji_SlowestId)=Tianji_newPopFit;                                Tianji_PopPos(Tianji_SlowestId,:)=Tianji_newPopPos;                            end                                                        King_newPopPos=((p.*King_FastestPos+(1-p).*King_PopPos(1,:))+ King_R.* ...                                (King_PopPos(1,:)-King_FastestPos+p*(mean(Tianji_PopPos)-mean(King_PopPos))))*King_Alpha+K_Beta; %Eq.  (22)                            King_newPopPos=SpaceBound(King_newPopPos,Up,Low);                            King_newPopFit=FOBJ(King_newPopPos);                            if King_newPopFit<King_PopFit(King_FastestId)                                King_PopFit(King_FastestId)=King_newPopFit;                                King_PopPos(King_FastestId,:)=King_newPopPos;                            end                            Tianji_SlowestId=Tianji_SlowestId-1;                            King_FastestId=King_FastestId+1;                        end                    end                end            end        end    end    for i=1:nPop        if King_PopFit(i)<BestFit            BestFit=King_PopFit(i);            BestX=King_PopPos(i,:);        end    end    for i=1:nPop        if Tianji_PopFit(i)<BestFit            BestFit=Tianji_PopFit(i);            BestX=Tianji_PopPos(i,:);        end    end
    [~,FKingId]=min(King_PopFit); [~,FTianId]=min(Tianji_PopFit);
    for i=1:nPop                for j=1:Dim            Rand_nPop=randperm(nPop);   
            if rand>0.5                 Tr4=Rand_nPop(1);                Tr5=Rand_nPop(2);                LT=0.2*levy(1);                Tianji_newPopPos(1,j)=Tianji_PopPos(i,j)+LT*(Tianji_PopPos(Tr4,j)-Tianji_PopPos(Tr5,j)); % Eq. (24)            else                MT=1/2*(1+0.001*(1-It/MaxIt)^2*sin(pi*rand)); % Eq. (23)                Tianji_newPopPos(1,j)=(Tianji_PopPos(FTianId,j)) +MT*(Tianji_PopPos(FTianId,j)-Tianji_PopPos(i,j));             end           end
        for j=1:Dim            Rand_nPop=randperm(nPop); 
            if rand>0.5                 Kr1=Rand_nPop(1);                 Kr2=Rand_nPop(2);                LK=0.2*levy(1);                King_newPopPos(1,j)=King_PopPos(i,j)+LK*(King_PopPos(Kr1,j)-King_PopPos(Kr2,j)); % Eq. (26)            else                 MK=1/2*(1+0.001*(1-It/MaxIt)^2*sin(pi*rand)); % Eq. (25)                King_newPopPos(1,j)=(King_PopPos(FKingId,j)) +MK*(King_PopPos(FKingId,j)-King_PopPos(i,j));            end        end        Tianji_newPopPos=SpaceBound(Tianji_newPopPos,Up,Low);        King_newPopPos=SpaceBound(King_newPopPos,Up,Low);        Tianji_newPopFit=FOBJ(Tianji_newPopPos);        King_newPopFit=FOBJ(King_newPopPos);        if Tianji_newPopFit< Tianji_PopFit(i)            Tianji_PopFit(i)=Tianji_newPopFit;            Tianji_PopPos(i,:)=Tianji_newPopPos;        end        if King_newPopFit< King_PopFit(i)            King_PopFit(i)=King_newPopFit;            King_PopPos(i,:)=King_newPopPos;        end    end
    for i=1:nPop        if King_PopFit(i)<BestFit            BestFit=King_PopFit(i);            BestX=King_PopPos(i,:);        end    end    for i=1:nPop        if Tianji_PopFit(i)<BestFit            BestFit=Tianji_PopFit(i);            BestX=Tianji_PopPos(i,:);        end    end    His_BestFit(It)=BestFit;end%微信公众号搜索:淘个代码,获取更多免费代码%禁止倒卖转售,违者必究!!!!!%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work%代码清单:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu

参考文献

[1] Wang, L, Du, H, Zhang. Z, et al. Tianji's horse racing optimization (THRO): A new metaheuristic inspired by ancient wisdom and its engineering optimization applications[J]. Artificial Intelligence Review, 2025, 58: 282.

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐