五行优化算法(FPA),原理详解,MATLAB代码免费获取

五行优化算法(Five phases algorithm,FPA)是一种新的元启发式算法,该方法受到中国传统思想五行学说的启发。五行学说是中国古代人民创造的一种哲学思想。中国古代以金、木、水、火、土五行作为宇宙万物形成和各种自然现象变化的基础。他们依靠五行学说来认识世界,相信天人合一。五阶段理论已被广泛应用于解释自然、人类和社会等概念领域的存在和发生的事情。FPA基于生成和克服策略以及从具有相同标签的代理学习策略来更新代理。FPA结构简单,性能优良。它也没有任何预定义的控制参数,只需要两个通用参数,包括种群大小和终端条件。该算法具有进化能力强、搜索速度快、寻优能力强的特点。

69f21404ba0cdf0f36debadd81950de0.png

该成果于2023年发表在计算机领域四区SCI期刊“Journal of Internet Technology”上。目前被引用2次,在工程优化、机器学习、数据挖掘等方面有着出色的优势。

15a7191cbff938824e65db683d960d24.png

1、算法原理

(1)生成与克服策略

受五行理论的启发,本文提出的生成克服策略更新了智能体的位置,完成了不同阶段标签下智能体之间的信息交换。具体操作如下式所示。

其中,XG lid和,XG+l lid分别表示第i个产物在第g代的第d维,第i个agent的标号为l。XG gd和XG og分别表示标记为l的第i代产物在第g代时产生和克服产物的潜伏期维度。参数r1和r2表示[0,1]中的随机数。为了解决极小化问题,假设XG lid的标签是木,则XG gd表示生成产物的d维,对应生成产物为水标签中适应度值最小的生成物。XG od为克服产物的第d维,对应克服产物为金属标签中适应度值最大的生成物。基于五行理论中的相互生成和克服关系,对具有其他标签的智能体进行更新。

(2)学习策略

该学习策略提出了同一标签下智能体之间的相互通信机制。引导产物的更新方法是向具有相同标签的更好的产物学习。对于最小化问题,产物的更新方法为下式:

9f9102df6d865272a54bda8d24752672.png

其中XG lj表示随机选择的第j个标签为l的产物, 和 分别为XG li和XG lj的适应度值。参数r3和r4是[0,1]中的两个随机数。如果第j个智能体的适应度值小于第i个智能体,则表明第j个智能体优于第i个智能体,第i个智能体将向选择的第j个智能体移动。否则,第i个代理将向相反方向移动。

下图显示了五行算法的流程图。首先,初始化优化过程:设置种群规模和最大迭代次数两个通用参数,然后评估各智能体的适应值,选择当前最优的智能体。此外,将代理随机分为五个阶段。对于木、火、土和金属,子种群大小设置为FLOOR(种群大小/5),剩余代理数量设置为水。

caa48cb5682822f7a141d3c89b707c33.png

FPA对应的伪代码过程如下图所示

8b618389e8c45415cc2407c5a3a2f910.png

2、结果展示

ad228a347e139413941ef623526a40cf.png

e6b87bbc35c4121726babf458b78a7ea.png

cc1bef56c7816525ed1613d1c2b33e19.png

3、MATLAB核心代码

%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 五行优化算法(Five phases algorithm,FPA)
function [gbest,gbestval,recordtime] = FPA_func(fhd,dim,ps,iter_max,Xmin,Xmax,varargin)
    % random seeds
    stm = RandStream('swb2712','Seed',sum(100*clock));
    RandStream.setGlobalStream(stm); 
    % global best
    targetbest = [300;400;600;800;900;1800;2000;2200;2300;2400;2600;2700];

    Fidvec = cell2mat(varargin);
    Fid = Fidvec(1);
    runid = Fidvec(2);  
    name_convergence_curve = ['FPA_Fid_',num2str(Fid),'_',num2str(dim),'D','.dat'];
    f_out_convergence = fopen(name_convergence_curve,'a');

    NP= 5;
    ps_subps= floor(ps/NP);
    ps_subps_last= ps - 4*ps_subps;   
%% set 51 points to plot convergence_curve
  if  runid ==1
        for i=1:51 
            if i==1
                iteration=1;
                fprintf(f_out_convergence,'%s:%s\t','iter_F',num2str(Fid));
            else
                iteration=iter_max/50*(i-1);
            end
            fprintf(f_out_convergence,'%d\t',iteration);
        end       
        fprintf(f_out_convergence,'\n');
  end 
%%    
    tic;
    %initialize ÖÖȺλÖà    
    for i = 1:ps
        pos(i,:) = Xmin+(Xmax-Xmin)*rand(1,dim);    
    end
    %pos = randn(ps,D);
    eval = feval(fhd,pos',varargin{:}); %·µ»ØֵΪÖÖȺ´óСµÄÐÐÏòÁ¿  
    [gbestval,gbestid] = min(eval);
    gbest = pos(gbestid,:);  
    fprintf(f_out_convergence,'%s\t%.15f\t',num2str(runid),gbestval-targetbest(Fid));  
for iter = 2:iter_max
%% randomly division
    % shuffle
    indexr =  randperm(ps)';
    pos = pos(indexr,:);
    eval = eval(1,indexr);
    % wood,fire,earth,metal,water
    wo_pos = pos(1:ps_subps,:);
    wo_eval = eval(1,1:ps_subps);
    f_pos = pos(ps_subps+1:2*ps_subps,:);
    f_eval = eval(1,ps_subps+1:2*ps_subps);
    e_pos = pos(2*ps_subps+1:3*ps_subps,:);
    e_eval = eval(1,2*ps_subps+1:3*ps_subps);
    m_pos = pos(3*ps_subps+1:4*ps_subps,:);
    m_eval = eval(1,3*ps_subps+1:4*ps_subps);
    wa_pos = pos(4*ps_subps+1:ps,:);
    wa_eval = eval(1,4*ps_subps+1:ps);
%% search operators
for number_label=1:NP
    switch number_label     
    case 1
% wood_search
    [~,wa_gid] = min(wa_eval);
    [~,m_oid] = max(m_eval);
    for i= 1:ps_subps
        if rand < rand
           wo_posnew(i,:)= wo_pos(i,:) + rand(1,dim).*(wa_pos(wa_gid,:)-wo_pos(i,:)) + rand(1,dim).*(wo_pos(i,:)-m_pos(m_oid,:));   
        else
           j= randi([1, ps_subps]); 
           while j == i
                 j= randi([1, ps_subps]);  % let j not equal to i
           end
           if wo_eval(1,j) < wo_eval(1,i)
              wo_posnew(i,:)= wo_pos(i,:) + rand(1,dim).*(wo_pos(j,:)-wo_pos(i,:));
           else
              wo_posnew(i,:)= wo_pos(i,:) + rand(1,dim).*(wo_pos(i,:)-wo_pos(j,:));
           end     
        end
    end           
    case 2      
% fire_search
    [~,wo_gid] = min(wo_eval);
    [~,wa_oid] = max(wa_eval);
    for i= 1:ps_subps
        if rand < rand
           f_posnew(i,:)= f_pos(i,:) + rand(1,dim).*(wo_pos(wo_gid,:)-f_pos(i,:)) + rand(1,dim).*(f_pos(i,:)-wa_pos(wa_oid,:)); 
        else
           j= randi([1, ps_subps]); 
           while j == i
                 j= randi([1, ps_subps]);  % let j not equal to i
           end
           if f_eval(1,j) < f_eval(1,i)
              f_posnew(i,:)= f_pos(i,:) + rand(1,dim).*(f_pos(j,:)-f_pos(i,:));
           else
              f_posnew(i,:)= f_pos(i,:) + rand(1,dim).*(f_pos(i,:)-f_pos(j,:));
           end     
        end      
     end 
     case 3
% earth_search
     [~,f_gid] = min(f_eval);
     [~,wo_oid] = max(wo_eval);
     for i= 1:ps_subps
         if rand < rand
            e_posnew(i,:)= e_pos(i,:) + rand(1,dim).*(f_pos(f_gid,:)-e_pos(i,:)) + rand(1,dim).*(e_pos(i,:)-wo_pos(wo_oid,:)); 
         else
            j= randi([1, ps_subps]); 
            while j == i
                  j= randi([1, ps_subps]);  % let j not equal to i
            end
            if e_eval(1,j) < e_eval(1,i)
               e_posnew(i,:)= e_pos(i,:) + rand(1,dim).*(e_pos(j,:)-e_pos(i,:));
            else
               e_posnew(i,:)= e_pos(i,:) + rand(1,dim).*(e_pos(i,:)-e_pos(j,:));
            end     
         end                            
     end 
     case 4
% metal_search 
     [~,e_gid] = min(e_eval);
     [~,f_oid] = max(f_eval);
     for i= 1:ps_subps
         if rand < rand            
            m_posnew(i,:)= m_pos(i,:) + rand(1,dim).*(e_pos(e_gid,:)-m_pos(i,:)) + rand(1,dim).*(m_pos(i,:)-f_pos(f_oid,:));
         else
            j= randi([1, ps_subps]); 
            while j == i
            j= randi([1, ps_subps]);  % let j not equal to i
            end
            if m_eval(1,j) < m_eval(1,i)
               m_posnew(i,:)= m_pos(i,:) + rand(1,dim).*(m_pos(j,:)-m_pos(i,:));
            else
               m_posnew(i,:)= m_pos(i,:) + rand(1,dim).*(m_pos(i,:)-m_pos(j,:));
            end     
         end       
     end 
     case 5
% water_search
     [~,m_gid] = min(m_eval);
     [~,e_oid] = max(e_eval);
     for i= 1:ps_subps_last
         if rand < rand                    
            wa_posnew(i,:)= wa_pos(i,:) + rand(1,dim).*(m_pos(m_gid,:)-wa_pos(i,:)) + rand(1,dim).*(wa_pos(i,:)-e_pos(e_oid,:)); 
         else
            j= randi([1, ps_subps_last]); 
            while j == i
                  j= randi([1, ps_subps_last]);  % let j not equal to i
            end
            if wa_eval(1,j) < wa_eval(1,i)
               wa_posnew(i,:)= wa_pos(i,:) + rand(1,dim).*(wa_pos(j,:)-wa_pos(i,:));
            else
               wa_posnew(i,:)= wa_pos(i,:) + rand(1,dim).*(wa_pos(i,:)-wa_pos(j,:));
            end     
         end  
     end 
    end
 end
    posnew = [wo_posnew; f_posnew; e_posnew; m_posnew; wa_posnew];          
    posnew = ((posnew>=Xmin)&(posnew<=Xmax)).*posnew + (posnew<Xmin).*Xmin + (posnew>Xmax).*Xmax;              
    evalnew = feval(fhd,posnew',varargin{:}); 
%% update mechanism
    bin = (eval > evalnew)';
    pos(bin==1,:) = posnew(bin==1,:);
    eval(bin==1) = evalnew(bin==1);
    [gbestval,gbestid] = min(eval);
    gbest = pos(gbestid,:);
    if mod(iter,iter_max/50)==0
          fprintf(f_out_convergence,'%.15f\t',gbestval-targetbest(Fid));
    end            
end
    recordtime = toc;
    fprintf(f_out_convergence,'\n');
    fclose(f_out_convergence);
end
%微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work
%代码清单:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu

参考文献

[1]Wang X, Chu S C, Snášel V, et al. Five Phases Algorithm: A Novel Meta-heuristic Algorithm and Its Application on Economic Load Dispatch Problem[J]. Journal of Internet Technology, 2023, 24(4): 837-848.

完整代码获取

后台回复关键词:

TGDM835

获取更多代码:

9e5e6db6947107ae3579e1c98ab81f40.png

或者复制链接跳转:
https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天吃饺子

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值