2023年智能算法之淘金优化器,MATLAB代码免费获取

今天为大家带来一期淘金优化算法(Gold rush optimizer.,GRO)。

GRO算法是受淘金热启发,模拟了淘金者在淘金热时期如何利用淘金的三个关键概念进行淘金:迁移、协作和淘金。

原理详解

①金矿勘探阶段:

与大多数智能算法相似,就是随机生成一批淘金者:

b60b7235c632eb5c745f85f722434cea.png

MF是每个淘金者对应的适应度值

13ee513250665162bb1a66dea3bb45a2.png

②探矿者的迁移阶段

在发现金矿后,淘金者迁移到那里获取黄金。最富金矿的位置是元启发式算法执行过程中搜索空间的最佳点。由于其确切位置未知,因此使用最佳金矿勘探者的位置来估计最佳金矿的位置,如图所示:

3dad262e6db8dc9f25ad46602886f216.png

4a68358b395fb1da70a1c728d4c690a7.png

模拟金矿探矿者向金矿的迁移公式为:

21dd8678432b4d1b7323a8421efa1fcd.png

ddfe02baffeb4d07d4b7845277086b3b.png

ae72ba7dff508097ce2c2890c359526d.png

8a0921b3e2c2795f1a0ee3b30dd7cb02.png

③金矿开采

每个淘金者都会在金矿区开采更多的黄金。在数学建模中,每个金矿勘探者的位置都被视为金矿的大致位置。金矿开采的相关数学表达式:

073205e41e4311017e56c407447bfd36.png

9b3ddd3020938181bae7a6718cfa1a2c.png

④探矿者之间的合作

00ba516d97aa17c7524a74ba7924f0a0.png

dc95a9064654d982273c64a52ad89bf1.png

④探矿者搬迁

金矿勘探者不断移动,他们决策中的一个关键参数是获取更多的黄金。因此,为了决定探矿者是留在原来的位置还是搬到新的位置,通过评估功能对这两个位置进行比较。在这个过程中,如果目标函数的价值有所提高,金矿勘探者就会更新其位置;否则,它保留在先前的位置,该位置被建模为最小化问题中的方程:

463b698c726ad4900870b9a080d4abef.png

伪代码实现:

e6bf944f07b83c7a0bbe400dd8fe5bfa.png

什么!看到这里大家有没有感觉该算法与灰狼算法很像!好,作者就与灰狼算法比较一下,看看孰强孰弱!

结果展示

在CEC2005函数集进行测试:

GRO是本文的淘金优化器,GWO是灰狼算法

4b1bee5ad0828d91e3100ea44e08553e.png

5d3189a8b1ca4f246a70ee4d73fc304d.png

8111277df439a31dc2bd64881ea4712b.png

63ad8493418dbf7ef277b5c5ccf75870.png

16119f8f1260aa7b59fb7688b3871af4.png

411a4ecee151b87d50c0cd0406b0be5e.png

f87b644a7465e67a3d73183a6ed161bf.png

ead27d64a0fb12647d147c3c777d2de8.png

ad6ee430c51b903a33387df73b09ea78.png

测试了9个函数,不得不说,还是比灰狼算法有很大提升的!且该算法没有增加计算复杂度,因此大家也可以根据此算法的思路去浅浅改进一下灰狼算法,说不定会有质的飞跃!

代码展示

function [best_score,best_pos,Convergence_curve]=GRO(N,Max_iter,lb,ub,dim,fobj )
lb = lb .* ones(1, dim);
ub = ub .* ones(1, dim);
%% GRO parameter initialization
sigma_initial = 2; 
sigma_final = 1 / Max_iter ;
% Initialize best position X* (global best)
best_pos=zeros(1, dim);
best_score=inf; %change this to -inf for maximization problems
%Initialize the gold prospectors� population Xi, i = 1, 2, . . . , N
Positions=initialization(N, dim, lb, ub);
Fit = inf(1,N);
%Initialize the gold prospectors� new positions Xnewi = Xi , i = 1, 2, . . . , N
X_NEW = Positions;
Fit_NEW = Fit;
Convergence_curve=zeros(1, Max_iter);
Convergence_curve(1) = min(Fit);
iter = 1;% Loop counter
%% Main loop
while iter <= Max_iter


    for i= 1:N   
        %Calculate fitness of current search agent at new position XNewi
        Fit_NEW(i) =  fobj(X_NEW(i,:));     
        %Update position of current search agent Xi according to Equation (13)
        if Fit_NEW(i) < Fit(i)
            Fit(i) = Fit_NEW(i);
            Positions(i,:) = X_NEW(i,:);
        end   
        %Update best search agent X*
        if Fit(i) < best_score
            % new gold mine is found
            best_score = Fit(i); 
            best_pos   = Positions(i,:);
        end
    end   
   %Update l1, l2 by Equation (7)   
   l2 =  ((Max_iter - iter)/(Max_iter-1) )^(2 * (sigma_initial - sigma_final)) + sigma_final;
   l1 =  ((Max_iter - iter)/(Max_iter-1) )^(1 * (sigma_initial - sigma_final)) + sigma_final;
  
     
    %calculate the next position of current search agent XNewi with one of
    %... the migration, mining or collaboration methods
    for i = 1:size(Positions,1)


        coworkers = randperm(N-1,2);
        diggers = 1:N;
        diggers(i) = [];
        coworkers = diggers(coworkers);


        digger1 = coworkers(1);    %random prospector g1
        digger2 = coworkers(2);    %random prospector g2
        
        m = rand;
        %collaboration
        if m <  1/3
            for d  = 1:dim
                r1 = rand;                                         % r1 is a random number in [0,1]
                D3 = Positions(digger2,d) -  Positions(digger1,d); % Equation (11)
                X_NEW(i,d) = Positions(i,d) +  r1 * D3;            % Equation (12) 
            end
        %mining method
        elseif m < 2/3
            for d = 1:dim
                r1 = rand;                                          % r1 is a random number in [0,1]
                A2 = 2*l2*r1 - l2 ;                                 % Equation (10)               
                D2 = Positions(i,d) - Positions(digger1,d) ;        % Equation (8)
                X_NEW(i,d) = Positions(digger1,d) + A2*D2;          % Equation (9)                              
            end
        %migartion method    
        else
            for d = 1:dim
                r1 = rand; % r1 is a random number in [0,1]
                r2 = rand; % r2 is a random number in [0,1]
                C1 = 2 * r2;                                        % Equation (6)
                A1 = 1 + l1 * (r1 - 1/2);                           % Equation (5)
                D1 = C1 * best_pos(d) - Positions(i,d) ;            % Equation (3)
                X_NEW(i,d) = Positions(i,d) + A1 * D1;              % Equation (4)                      
            end
        end          
        %Domain control
        X_NEW(i,:) = boundConstraint(X_NEW(i,:),Positions(i,:), lb , ub);     
    end   
    Convergence_curve(iter) = best_score;  
    iter = iter+1;   
end
end

参考文献:

 K. Zolfi. Gold rush optimizer: A new population-based metaheuristic algorithm. Operations Research and Decisions 2023: 33(1), 113-150. DOI 10.37190/ord230108

文献原文已经放在代码压缩包里了。

2023智能算法合集代码免费获取方式

完整代码获取方式:后台回复关键字,不区分大小写。关键字:

2023

猜你喜欢

转载自blog.csdn.net/woaipythonmeme/article/details/132644910