2024新算法:麋鹿群优化器,原理详解,MATLAB代码免费获取

麋鹿群优化器(Elk herd optimizer,EHO)是一种受自麋鹿群的繁殖过程启发的群体优化算法。麋鹿有两个主要的繁殖季节:发情期和产犊期。在发情季节,麋鹿群会分裂成大小不一的不同家族。这种划分是基于雄性之间争夺统治权,其中较强壮的雄性可以组建一个拥有大量雌性的家庭。在产犊季节,每个家庭都从自己的雄性和雌性中繁殖新的小牛。这个灵感是在一个优化环境中产生的,其中优化循环由三个操作符组成:发情期、产犊期和选择期。

db3dd1eb14b7feead1b25d57cecd727c.png

该成果于2024年发表在计算机领域二区SCI期刊“Artificial Intelligence Review”上。EHO方法具有更好的迭代优化性能和出色的鲁棒性。

fe69e71f1e5866a9774db30652846c76.png

1、算法原理

麋鹿群的繁殖过程可以被认为是一个优化过程。麋鹿一代又一代地繁殖,以拥有更强大的畜群,能够面对周围环境的挑战。在本节中,育种过程被映射到优化概念。

7d51c3988dcad9fc4d4238886868c42a.png

(1)初始化

最初,麋鹿群的种群根据雄性的数量被分成一组家庭。在发情季节,每个家庭都由公麋鹿领导,母牛或雌性的数量取决于公麋鹿的力量。雄性的力量是通过对抗统治挑战来决定的。 为了将特定于问题的知识嵌入到EHO中,需要提供两个主要组成部分:评估解决方案的目标函数和阐明搜索空间类型的解决方案表示。一般来说,具有连续搜索空间的优化问题的简单形式,其中每个决策变量都有一个特定的取值范围。目标函数的一般形式如下式所示:

其中,f(x)为目标函数,用于测量每个麋鹿的适应度或解x =(x1, x2,…,xn)。每个麋鹿中的变量xi是指以i为索引的该麋鹿的一个属性,其中xi∈[lbi, ubi],其中lbi为属性xi的下界,ubi为属性xi的上界。N是每个解或解维中属性的总数。

EHO的设计参数只有一个,即雄性率Br,它决定了麋鹿群中初始雄性率。另外两个标准参数是麋鹿群大小或种群大小(EHS)和最大迭代次数(M_Itr)。

(2)产生最初的麋鹿群

麋鹿群(EH)最初产生,这是一个种群的麋鹿解决方案,包括雄性和雌性。EH是一个大小为n × EHS的矩阵,如式所示。

在连续域中,每个解xj可以生成为xj i = lbi +(ubi−lbi)× U(0,1),∀i = 1,2,…,n。计算每个麋鹿解的适应度值。最后,根据适应度值对EH中的麋鹿按升序排序,如f(x1)≤f(x1)≤…≤f(xEHS)。

(3)发情期

在发情期,建立EHO模型,根据发情期雄性率(Br)来划分家族。最初,家庭总数计算为B = |Br × EHS|。然后根据适应度值从EH中选择雄性,其中在EH顶部适应度值最好的麋鹿被认为是雄性。这是为了反映战斗统治挑战,最强壮的麋鹿被考虑,他们将被分配更多的雌性。

然后B组的雄性一起战斗,组建家庭。为了将雌性分配给B中的每头雄性,使用轮盘选择,根据其适合度值与总适合度值的比例将雌性分配给雄性。用专业术语来说,首先,B中的每头雄性xj将根据其绝对适应度值f(xi)除以下式中计算的所有雄性的绝对适应度值之和,赋予其选择概率pj。

其次,根据选择概率pj将雌性分配给雄性。在算法中,向量H =(h1, h2,…,hk), k = EHS−B反映了雌性,每个雌性由基于轮盘赌选择确定的雄性指数分配。

例如,如果麋鹿群规模为10 (EHS = 10),雄性率为30%,则B = 3,反映了鹿科数。B =(x1 x2 x3)其余的麋鹿(即(x4,…,x10))可以被指定为雌性,它们可以根据轮盘选择进行分配,结果分配可以是H =(1,2,1,3,1,2,3),其中第一头雄性有三个雌性,第二头雄性有两个雌性,第三头雄性有两个雌性。

(4)产犊季节

在产犊季节,每个家庭的小牛(xj i(t + 1))主要是根据其父亲雄性(xhj)和母亲雌性(xj i(t))的属性来繁殖的。如果小牛(xi(t + 1))的指数i与其家族中的雄性父亲相同,则小牛的繁殖如下式所示。

其中,k是[0,1]范围内的随机值,其确定从牛群中随机选择的麋鹿遗传属性的比率xk(t),其中k ∈(1,2,.,EHS)。请注意,更高的k值导致随机元素参与新小牛的可能性更大,这反过来又增强了多样化。

a65dc2b8d63a01090f1779570b9a1b8f.png

如果小牛具有与其母亲相同的指数,则其Xi(t + 1)采用其母亲雌性xj和父亲雄性xhj的属性,如下式所示。

其中,xj i(t + 1)是在迭代t + 1时小牛j的属性i,其将被存储在EH'中。hj是雌性j的雄性,r是当前雄性集中随机雄性的指数,使得r ∈ B。在自然界中,在少数情况下,母畜也可以与其他雄性交配,如果它没有得到雄性的很好的保护。

(5)选择季节

所有家族的雄性、小牛和雌性都合并了。在技术术语中,存储雄性和雌性解决方案的EH和存储小牛解决方案的EH′合并为一个矩阵EHtemp。EHtemp中的麋鹿将根据它们的适应值以升序排序。最后,EHtemp中编号EHS的顶部elk将保留到下一代,在下一代中它们将替换EH中的elk,使得EHj = EHj temp,j =(1,...,EHS)。在进化策略中,这种类型的选择被称为选择+选择-选择,其中选择是亲本种群,选择是后代种群。

(6)终止标准 重复步骤3、4和5,直至满足终止标准。通常,终止标准可以是最大迭代次数。这可以是理想迭代的最大次数、最大计算时间或最优解的可达性。

EHO所对应的算法流程图如下图所示

8ea5d0e6076ceae64e6396f54e991edb.png

EHO所对应的伪代码如下图所示

f7103222036f7ace508108f6525eb0b5.png

2、结果展示

230baa9e0be1f3d3cc2c09f3b94e75fb.png

ba541b96b520f8a232deedbe879b3230.png

b76376afb8d6dcd4fe42d517ad29813d.png

67e8cf34220ee4638774b852cee47331.png

3、MATLAB核心代码

%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 麋鹿群优化器(Elk herd optimizer,EHO)
function [BestBullFitness,BestBull,Convergence_curve]=EHO(N,Max_iter,lb,ub,dim,fobj,runtimes,Fun)
if size(ub,1)==1
    ub=ones(dim,1)*ub;
    lb=ones(dim,1)*lb;
end
MalesRate = 0.2; % The percentage of males in the population
No_of_Males = round(N*MalesRate);
Convergence_curve = zeros(1,Max_iter);
%Initialize the positions of salps
ElkHerd=initialization(N,dim,ub,lb);
BestBull=zeros(1,dim);
BestBullFitness=inf;
%calculate the fitness of initial salps
for i=1:N
    ElkHerdFitness(1,i)=fobj(ElkHerd(i,:));
end
%Main loop
l=1; % loop
while l<=Max_iter
    %Sort the ELK positions
    [sorted_ELKS_fitness,sorted_indexes]=sort(ElkHerdFitness);
    % Make a copy of population
    NewElkHerd = ElkHerd;
    NewElkHerdFitness = ElkHerdFitness;
    BestBull=ElkHerd(sorted_indexes(1),:); % ELK with best position
    BestBullFitness=sorted_ELKS_fitness(1); % the fitness of best position
    % Number of females for each male
    for i=1:No_of_Males
        TransposeFitness(i)=1/sorted_ELKS_fitness(i);
    end
    Familes=zeros(1,N);
    for i=(No_of_Males+1):N
        FemaleIndex=sorted_indexes(i); % index of female
        randNumber = rand;
        MaleIndex = 0;
        sum_fitness=0;
        for j=1:No_of_Males
            sum_fitness = sum_fitness + (TransposeFitness(j)/sum(TransposeFitness));
            if (sum_fitness > randNumber)
                MaleIndex =  j;
                break;
            end
        end
        Familes(FemaleIndex)=sorted_indexes(MaleIndex);
    end
   % disp(Familes);
    %===================== Reproduction
    for i=1:N
        %Male
        if(Familes(i)==0)
            h=fix(rand*N)+1;
             for j=1:dim
                 NewElkHerd(i,j)=ElkHerd(i,j)+rand*(ElkHerd(h,j)-ElkHerd(i,j));
                 NewElkHerd(i,j) = min(max(NewElkHerd(i,j),lb(j)),ub(j));
             end
        else
            h=fix(rand*N)+1;
            MaleIndex=Familes(i);
            hh = randperm(size(find(Familes==MaleIndex),2));
            h=round(1+(size(hh,2)-1)*rand);
            for j=1:dim
                rd = -2+4*rand;
                    NewElkHerd(i,j)=ElkHerd(i,j)+ (ElkHerd(Familes(i),j)-ElkHerd(i,j))+rd*(ElkHerd(h,j)-ElkHerd(i,j));
            end
        end
    end
    for i=1:N      
        NewElkHerdFitness(1,i)=fobj(NewElkHerd(i,:));
        if NewElkHerdFitness(1,i)<BestBullFitness
            BestBull=NewElkHerd(i,:);
            BestBullFitness=NewElkHerdFitness(1,i);
        end
    end
    %============ Combining the two generations 
    NewPopulation = cat(1,ElkHerd,NewElkHerd);
    for i=1:size(NewPopulation,1)
        NewFitness(1,i)=fobj(NewPopulation(i,:));
    end
    [sorted_NewFitness,sorted_indexes]=sort(NewFitness);
    %============ restore ElkHerd
    for i=1:N
        ElkHerd(i,:)=NewPopulation(sorted_indexes(i),:);
        ElkHerdFitness(1,i)= sorted_NewFitness(1,sorted_indexes(i));
    end
    Convergence_curve(l)=BestBullFitness;
    display([Fun, ', Run ', num2str(runtimes), ', Itr ', num2str(l), ' the best fitness is ', num2str(BestBullFitness)]);
    l = l + 1;
end
微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%代码清单:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu

参考文献

[1]Al-Betar M A, Awadallah M A, Braik M S, et al. Elk herd optimizer: a novel nature-inspired metaheuristic algorithm[J]. Artificial Intelligence Review, 2024, 57(3): 48.

完整代码获取

后台回复关键词:

TGDM813

获取更多代码:

81e8a3982bab5fafaeefc8f45175703e.png

或者复制链接跳转:
https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淘个代码_

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值