智能算法之侏儒猫鼬优化算法(DMO),原理公式详解,附matlab代码

本文介绍了一种基于侏儒猫鼬觅食行为的新型群体智能优化算法——DMO,阐述了算法原理,包括雌性首领产生、群体觅食和保姆交换条件。算法在MATLAB实现并通过CEC2005函数集展示了结果,具有搜索效率高和进化能力强的特点。
摘要由CSDN通过智能技术生成

9ca1a2bbbf6a22b4e029a4ee5be9c053.png

侏儒猫鼬优化算法(Dwarf Mongoose OptimizationDMO)是一种新型群体智能优化算法,该算法是根据侏儒猫鼬的群体觅食行为而提出的优化算法,具有搜索速度快、进化能力强、寻优能力强等特点。该成果于2022年发表在知名SCI期刊Computer methods in applied mechanics and engineering上。该期刊属于TOP顶刊,中科院1区。目前在谷歌学术上有着很高的被引量,共被引577次。

00ceac6b8cfdc097085db90e33f24cfa.png

侏儒猫鼬优化算法是模拟侏儒猫鼬半游牧式生活而提出的优化算法,该算法将侏儒猫鼬种群的社会结构分为阿尔法组、侦查组和保姆组,阿尔法组同时进行觅食和寻找睡眠丘。

算法原理

(1)雌性首领的产生

雌性首领在阿尔法组中产生,阿尔法组中每个雌性个体成为首领的概率为  ,数学表达公式如下:  其中  是第  个个体的适应度,  是侏儒猫鼬种群中个体的总数。

(2)阿尔法组成员觅食

阿尔法组成员将共行并进行觅食,食物源的候选位置的数学表达公式如下:  其中  是找到的食物源新位置,  为雌性首领的当前位置,  是均匀分布在[-1,1]之间的随机数,本例选取   2  是阿尔法组中的随机个体。

(3)保姆交换条件

保姆交换条件是用于重置阿尔法组和保姆组中的猫鼬个体。当阿尔法组成员未能搜寻到合适的食物时,认为阿尔法组成员能力不足,将交换阿尔法组和保姆组的成员。交换条件满足后,阿尔法组将同时进行觅食和寻找睡眠丘,计算公式如下:  其中  为交换后个体的新位置,    分别为搜索空间的上界和下界,  01之间的随机数。

睡眠丘是猫鼬休息的场所,而猫鼬不会回到之前的睡眠丘,这种生活模式能够避免搜索区域被过度开发的问题。新搜寻到的睡眠丘的数学模型如下:  其中Xsm为新的睡眠丘的位置,  是决定猫鼬移动到新睡眠丘的方向向量,  是睡眠丘的平均值,计算公式如下:      其中  代表睡眠丘值,其数学表达公式如下: 

其中  是第  个个体的适应度,这里是让后一个个体适应度减去前一个。

CF表示猫鼬种群移动能力的参数,它会随着迭代次数线性递减,计算公式如下其中t为当前迭代次数,T为最大迭代次数。

 果展示

以为CEC2005函数集为例,进行结果展示:

7769699c841dca5cfbcd8a81a0a4df88.png

9965dc0e3f0dd9c505c25189f6c26b01.png

2efba01dcbedfa074a9e3a13425f7088.png

8e275535e4bea9845da33bb60aec9119.png

50539010db0ae5806fc1d0e7aed30edb.png

 MATLAB核心代码

function [BEF,BEP,BestCost]=DMOA(nPop,MaxIt,VarMin,VarMax,nVar,F_obj)
%nVar=5;             % Number of Decision Variable
VarSize=[1 nVar];   % Decision Variables Matrix Size
%VarMin=-10;         % Decision Variables Lower Bound
%VarMax= 10;         % Decision Variables Upper Bound
%% ABC Settings
% MaxIt=1000;              % Maximum Number of Iterations
% nPop=100;               % Population Size (Family Size)
nBabysitter= 3;         % Number of babysitters
nAlphaGroup=nPop-nBabysitter;         % Number of Alpha group
nScout=nAlphaGroup;         % Number of Scouts
L=round(0.6*nVar*nBabysitter); % Babysitter Exchange Parameter 
peep=2;             % Alpha female痴 vocalization 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Empty Mongoose Structure
empty_mongoose.Position=[];
empty_mongoose.Cost=[];
% Initialize Population Array
pop=repmat(empty_mongoose,nAlphaGroup,1);
% Initialize Best Solution Ever Found
BestSol.Cost=inf;
tau=inf;
Iter=1;
sm=inf(nAlphaGroup,1)
% Create Initial Population
for i=1:nAlphaGroup
    pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
    pop(i).Cost=F_obj(pop(i).Position);
    if pop(i).Cost<=BestSol.Cost
        BestSol=pop(i);
    end
end
% Abandonment Counter
C=zeros(nAlphaGroup,1);
CF=(1-Iter/MaxIt)^(2*Iter/MaxIt);
% Array to Hold Best Cost Values
BestCost=zeros(MaxIt,1);
%% DMOA Main Loop
for it=1:MaxIt  
    % Alpha group
     F=zeros(nAlphaGroup,1);
     MeanCost = mean([pop.Cost]);
    for i=1:nAlphaGroup     
        % Calculate Fitness Values and Selection of Alpha
        F(i) = exp(-pop(i).Cost/MeanCost); % Convert Cost to Fitness
    end
        P=F/sum(F);
      % Foraging led by Alpha female
    for m=1:nAlphaGroup     
        % Select Alpha female
        i=RouletteWheelSelection(P);     
        % Choose k randomly, not equal to Alpha
        K=[1:i-1 i+1:nAlphaGroup];
        k=K(randi([1 numel(K)]));    
        % Define Vocalization Coeff.
        phi=(peep/2)*unifrnd(-1,+1,VarSize);     
        % New Mongoose Position
        newpop.Position=pop(i).Position+phi.*(pop(i).Position-pop(k).Position);    
        % Evaluation
        newpop.Cost=F_obj(newpop.Position);    
        % Comparision
        if newpop.Cost<=pop(i).Cost
            pop(i)=newpop;
        else
            C(i)=C(i)+1;
        end     
    end   
    % Scout group
    for i=1:nScout
        % Choose k randomly, not equal to i
        K=[1:i-1 i+1:nAlphaGroup];
        k=K(randi([1 numel(K)]));    
        % Define Vocalization Coeff.
        phi=(peep/2)*unifrnd(-1,+1,VarSize);   
        % New Mongoose Position
        newpop.Position=pop(i).Position+phi.*(pop(i).Position-pop(k).Position);
        % Evaluation
        newpop.Cost=F_obj(newpop.Position);
        % Sleeping mould
        sm(i)=(newpop.Cost-pop(i).Cost)/max(newpop.Cost,pop(i).Cost); 
     % Comparision
        if newpop.Cost<=pop(i).Cost
            pop(i)=newpop;
        else
            C(i)=C(i)+1;
        end   
    end    
    % Babysitters
    for i=1:nBabysitter
        if C(i)>=L
            pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
            pop(i).Cost=F_obj(pop(i).Position);
            C(i)=0;
        end
    end    
     % Update Best Solution Ever Found
    for i=1:nAlphaGroup
        if pop(i).Cost<=BestSol.Cost
            BestSol=pop(i);
        end
    end    
        
   % Next Mongoose Position
   newtau=mean(sm);
   for i=1:nScout
        M=(pop(i).Position.*sm(i))/pop(i).Position;
        if newtau>tau
           newpop.Position=pop(i).Position-CF*phi*rand.*(pop(i).Position-M);
        else
           newpop.Position=pop(i).Position+CF*phi*rand.*(pop(i).Position-M);
        end
        tau=newtau;
   end    
   % Update Best Solution Ever Found
    for i=1:nAlphaGroup
        if pop(i).Cost<=BestSol.Cost
            BestSol=pop(i);
        end
    end  
    % Store Best Cost Ever Found
    BestCost(it)=BestSol.Cost;
    BEF=BestSol.Cost;
    BEP=BestSol.Position;
    % Display Iteration Information
    disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
end

参考文献

[1]AGUSHAKA J O, EZUGWU A E, ABUALIGAH L.Dwarf mongoose optimization algorithm[J].Computer methods in applied mechanics and engineering, 2022,391(2022): 114570.

完整代码获取方式:后台回复关键字:

TGDM990

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据引用内容,侏儒优化算法(Dwarf Mongoose Optimization,DMO)是一种群体智能优化算法,其灵感来源于侏儒的群体觅食行为。引用中还提到了DMO算法的Matlab代码和python代码。 因此,你可以在Python中实现侏儒优化算法。以下是一个简单的Python代码示例: ```python # 导入所需的库 import numpy as np # 定义侏儒优化算法函数 def dwarf_mongoose_optimization(objective_func, num_dimensions, num_iterations, population_size): # 初始化种群 population = np.random.uniform(low=-1, high=1, size=(population_size, num_dimensions)) # 迭代优化过程 for iteration in range(num_iterations): # 计算适应度值 fitness_values = objective_func(population) # 选择最佳个体 best_individual = population[np.argmax(fitness_values)] best_fitness = np.max(fitness_values) # 更新种群 new_population = np.zeros_like(population) for i in range(population_size): # 随机选择两个个体 indices = np.random.choice(population_size, size=2, replace=False) individual1 = population = individual1 + np.random.uniform(low=-1, high=1) * (best_individual - individual2) population = new_population return best_individual, best_fitness # 定义适应度函数(示例) def objective_func(x): return np.sum(x**2, axis=1) # 设置算法参数 num_dimensions = 10 num_iterations = 100 population_size = 50 # 运行侏儒优化算法 best_individual, best_fitness = dwarf_mongoose_optimization(objective_func, num_dimensions, num_iterations, population_size) # 打印结果 print("最佳个体:", best_individual) print("最佳适应度:", best_fitness) ``` 请注意,这只是一个简单的示例代码,你可以根据自己的需求进行修改和扩展。在实际应用中,你需要定义自己的目标函数,并根据具体问题进行参数调整和结果分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淘个代码_

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值