2024年最新优化算法——苔藓生长优化算法,原理详解,MATLAB代码免费获取

苔藓生长优化算法(The Moss Growth Optimization,MGO)是受自然环境中苔藓生长规律的启发而提出的。MGO算法首先通过一种称为确定风向的机制来确定种群的进化方向,该机制采用了一种划分种群的方法。从藓类植物的无性繁殖、有性繁殖和营养繁殖中得到启发,提出了孢子扩散搜索和双繁殖搜索两种新的搜索策略,分别用于探索和开发。最后,最后,隐生机制改变了传统元启发式算法直接修改个体解的方法,避免了算法陷入局部最优。

20f36a3f5ebd97fac1e89ecde25ea30f.png

该成果于2024年发表在计算机领域2区SCI期刊“Journal of Computational Design and Engineering”上。

82e2995895b9ec9b20c91ea66f8c77e4.png

1、算法原理

(1)风向测定

苔藓的生长受到风的影响,主要是因为风在孢子的传播中起着至关重要的作用。由于风向的重要性,MGO开发了一种创新的机制,称为“风向测定”。这种机制利用大多数个体与最优个体之间的位置关系,来决定种群中所有个体的进化方向。这种进化方向有效地帮助MGO避免陷入局部最优解决方案。应该注意的是,MGO算法将单个苔藓个体视为搜索代理。该算法的种群由所有苔藓个体组成。通过依赖于MGO算法所做的以下假设来模拟风向:1.风向在整个迭代中保持不变。2.假设moss个体表示解空间内的位置,则当前最佳候选位置对应于最优解中的当前moss个体。3.风的方向总是从苔藓数量较多的地区吹向最有利生长环境中的个体苔藓。

人口中最特殊的个体X是 。本文采用第j维值作为阈值,并将所有个体的j维值与之进行比较。公式如下: 。其中,t是第i个苔藓个体的第j个粒子,k是苔藓个体的维度。然后,选择具有较大数目的成员的集合,如公式所示:

01f9935af0311be8f00ee57e11cf663b.png

其中function count()表示计算给定集合中的苔藓个体数量。

多次除法后得到的集合见公式所示:

式中,dn表示被除的次数,本文中dn的值设为dim/4,且不小于1。pj表示第j个随机数,符合范围(1,2,...dim),并满足以下公式:

对风进行了简要的模拟,风总是从区域divX到最特殊的个体Mbest,如图所示。

24a6bbc38925dc343c52ff4322da6444.png

风的方向的精确计算公式如下:

其中,Dwind代表计算出的风向,其与个体具有相同的维度。变量“num”表示“dirX”中的总种群个数。

其中,“dirX”表示相对于“Mbest”将“divX”内的个体分散的距离的集合。

(2)孢子扩散搜索

MGO的探索阶段涉及孢子传播搜索。在有大量风的情况下,孢子的传播以高度不可预测的方式发生,导致相当长的传播距离。在稳定的风力条件下,孢子能够传播更长的距离,而在湍流条件下,它们往往会分散在较短的距离内。大多数孢子在稳定的风条件下分散,而一小部分在湍流条件下分散。最后,随着风力减弱,孢子开始在更靠近苔藓的地方定居。进行建模以模拟孢子通过风的传播特性,如图所示。

c4aad3ba692a63cae72495e368aad8e3.png

孢子的位置由下式确定。这两个步骤的大小差别很大。这允许个体进行随机选择,以防止固定步长在早期阶段导致收敛缓慢而在后期阶段无法收敛,从而确保种群多样性。

其中,“Mnewi”表示通过第i个苔藓个体的孢子传播获得的新苔藓。r1是一个随机数,在(0,1)范围内,而d1是一个常数参数,在本文中设置为0.2。如果r1>d1,孢子在稳定的风条件下分散,而它们在湍流条件下分散。Step1表示在稳定风条件下孢子传播的距离,如方程式所示。Step2代表在湍流风条件下孢子传播的距离,如方程式所示:

其中w是一个常数参数,设置为2。r2是一个随机向量在(0,1)范围内,它具有和Dwind相同的维数。E是风的强度,它随着迭代的进行而减小,如方程所示:

其中,r3是范围(0,1)中的随机向量,在等式中示出:

其中,FES表示当前求值计数,而MaxFES表示最大迭代次数。

其中,β代表以divX为单位的种群与以X为单位的种群的比例。

战斗行为在数学上用以下方式表示:

(3)双传播搜索

MGO的开发阶段涉及双重繁殖搜索,它模拟有性生殖和营养生殖,通过有性生殖和营养生殖产生新的个体,这些个体靠近原始个体。应该注意的是,当使用双传播搜索时,必须满足条件C<0.8。在有性生殖过程中,个体基因被用作解决方案,允许新个体从当前和最好的个体获得基因。在营养繁殖过程中,苔藓个体的碎片可以发育成新的个体,这被认为是一种新的解决方案。碎片的传播与孢子的传播相似,也受风的影响。与孢子传播相比,双传播搜索的方法允许苔藓在更有限的区域内繁殖,但它有利于快速识别苔藓的最佳栖息地。

对双传播搜索进行模拟,如图所示。

2c68d9373b1ec4e24c0b62ad76a11d66.png

新藓类植物个体的位置由公式定义、该方法与传统MAs的不同之处在于,它增加了仅改变单个维度的方法的比例,增强了整体局部探索能力。

其中,Mnewi表示第i个新个体,Mnewi,j表示第j个粒子,j是一个不超过个体最大维数的随机数。当前的最优个体由Mbest表示。r4是一个随机数,在(0,1)范围内的。如果是有性繁殖,则在有性繁殖阶段模拟双繁殖搜索,而在营养繁殖阶段则采用不同的计算方法进行模拟。

然后,act计算是否使用了Mbest,如等式所示,其中,r5是在(0,1)范围内的随机向量,其维数与Mbest相同。

其中,r6是在(0,1)范围内的随机数,E是风的强度。

a539657c93bcc5c4c067ccbd01a01358.png

下图显示了MGO的伪代码。

48636cc199a2e73402b879cea1074982.png 737e8a40260f5705853787507756e5e2.png

MGO对应的流程图如下图所示

6ba899cb9a1ea4a589f4d2c39c6fd5e7.jpeg

2、结果展示

ed867cfde900a1cf2943c30d326182ce.png

9173a8b2bd6d955ae4398db62b282b05.png

a87b010e6bedc83785e5d53d10999483.png

6e8ffeecda5105185aee00e7dcb6d07a.png

3、MATLAB核心代码

% 苔藓生长优化算法(The Moss Growth Optimization,MGO)
function [best_M,Convergence_curve]=MGO(SearchAgents_no,MaxFEs,lb,ub,dim,fobj)
%% Initialization
FEs=0;
best_cost=inf; %change this to -inf for maximization problems
best_M = zeros(1,dim);
M=initialization(SearchAgents_no,dim,ub,lb); %Initialize the set of random solutions
costs = zeros(1,SearchAgents_no);
for i=1:SearchAgents_no
    costs(i)=fobj(M(i,:)) ;
    FEs=FEs+1;
    if costs(i)<best_cost 
        best_M=M(i,:); 
        best_cost = costs(1,i);
    end
end

Convergence_curve=[];
it=1;
rec = 1;
w = 2;
rec_num = 10;
divide_num = dim/4;
% divide_num = min(SearchAgents_no/4, dim/4);
d1 = 0.2;

newM = zeros(SearchAgents_no, dim);
newM_cost = zeros(1, SearchAgents_no);
rM = zeros(SearchAgents_no,dim,rec_num); %record history positions
rM_cos = zeros(1,SearchAgents_no,rec_num);
%% Main Loop
while FEs<MaxFEs
    calPositions = M;
    div_num = randperm(dim);
        %Divide the population and select the regions with more individuals based on the best
        for j=1:max(divide_num,1)
            th = best_M(div_num(j));
            index = calPositions(:,div_num(j)) > th;
            if sum(index) < size(calPositions, 1)/2 %choose the side of the majority
                index = ~index;
            end
            calPositions = calPositions(index,:);
        end
    D = best_M - calPositions; %Compute the distance from individuals to the best
    D_wind = sum(D, 1)/size(calPositions, 1); %Calculate the mean of all distances
 
    beta = size(calPositions, 1) / SearchAgents_no;
    gama = 1/sqrt(1-power(beta,2));
    step = w * (rand(size(D_wind))-0.5) * (1-FEs/MaxFEs);
    step2 = 0.1*w*(rand(size(D_wind))-0.5)* (1-FEs/MaxFEs)*(1+1/2*(1+tanh(beta/gama))*(1-FEs/MaxFEs));
    step3 = 0.1*(rand()-0.5) * (1-FEs/MaxFEs);
    act =actCal(1 ./ 1 + (0.5 - 10*(rand(size(D_wind)))));
    
    if rec == 1 %record the first generation of positions
        rM(:,:,rec) = M;
        rM_cos(1,:,rec) = costs;
        rec = rec + 1;
    end
  
    for i=1:SearchAgents_no    
        newM(i,:) = M(i,:);
        %Spore dispersal search
        %Update M using Eq.(6)
         if rand()>d1
            newM(i,:) = newM(i,:) + step .* D_wind; 
         else
            newM(i,:) = newM(i,:) + step2 .* D_wind;
        end

        if rand() < 0.8
            % Dual propagation search
            %Update M using Eq.(11)
            if rand() > 0.5
                newM(i,div_num(1)) = best_M(div_num(1)) + step3 * D_wind(div_num(1));
            else
                newM(i,:) = (1-act) .* newM(i,:)+act .* best_M;
            end
        end
              
        %Boundary absorption
        Flag4ub=newM(i,:)>ub;
        Flag4lb=newM(i,:)<lb;
        newM(i,:)=(newM(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        newM_cost(i)=fobj(newM(i,:));
        FEs=FEs+1;
          % Cryptobiosis mechanism
        rM(i,:,rec) = newM(i,:);
        rM_cos(1,i,rec) = newM_cost(i);
        
        
        if newM_cost(i)<best_cost 
           best_M=newM(i,:);
           best_cost=newM_cost(i);
        end    
    end %End for
    
    rec = rec + 1;
    % Cryptobiosis mechanism
    if rec > rec_num || FEs>=MaxFEs
        [lcost,Iindex] = min(rM_cos, [] ,3);
        for i=1:SearchAgents_no
            M(i,:) = rM(i,:,Iindex(i));
        end
        costs = lcost;
        rec = 1;
    end
  
    Convergence_curve(it)=best_cost;
    it=it+1;
end
end

function [act] = actCal(X)
    act = X;
    act(act>=0.5) = 1;
    act(act<0.5) = 0;
end
微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work
%代码清单:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu

参考文献

[1]Zheng B, Chen Y, Wang C, et al. The Moss Growth Optimization (MGO): concepts and performance[J]. Journal of Computational Design and Engineering, 2024: qwae080.

完整代码获取

后台回复关键词:

TGDM817

获取更多代码:

9d4710b699d419f82469d611a1368206.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、付费专栏及课程。

余额充值