2024年SCI一区算法:肺功能优化算法,原理详解,MATLAB代码免费获取

肺功能优化算法(Lungs Performance-Based Optimization, LPO)。该算法的设计灵感源自于人体肺部的高度规律性与智能性能,致力于模仿这些自然界中的智能行为以达到优化算法的性能。值得一提的是,LPO算法展现出了几个显著的优点:具备强大的进化能力、快速的搜索速度以及卓越的寻优能力。这些特性使得LPO算法在解决复杂问题时更加高效和有效。该成果于2024年2月发表在中科院1区SCI期刊Computer Methods in Applied Mechanics and Engineering。

414dd5688f6aa2852ba908231d2644ff.png

肺功能优化算法(LPO)的开发灵感源自于人体肺部的结构和功能,特别是其在气体交换过程中展现出的高效率和智能调节能力。人体肺部能够根据身体需求和外部环境自动调节气体交换的效率,这种能力源自于其复杂的结构和智能的管理系统。肺部的每一次呼吸都是对气体最优化交换的一个自然过程,它能够在不同的运动强度和氧气需求下,精准调节氧气和二氧化碳的交换。这种智能的自我调节机制激发了LPO算法的创新设计思路。

7dfb50604a4f151ed448793d50cb72b2.png

1、算法原理

LPO是一种优化器,它以初始群体或空气质量Mi开始,其中i= 1,2,.,Npop,它在身体的功能循环中进入血液并创建新的群体。该初始种群在目标问题范围的两个最大值(Mmax)和最小值(Mmin)之间随机生成。这种主要的群体起着与血液团块或颗粒相同的作用。

(1)空气进出肺的入口和出口

如前所述,我们选择了用于肺的RC模型,并且考虑到建模参数,我们假设进入肺的空气质量的位置如下,在优化科学中,这是初始群体的新位置。

在上面的等式中,D是问题的维数,Iter是算法的当前迭代。

(2)二氧化碳从空气中分离出来,血液在静脉中流动

氧气被肺部从空气中分离出来,进入血液。这个质量Mi相当于人口在问题空间中的运动。氧气进入血液的运动可以用下式来模拟。也就是说,血液通过施加在它身上的压力运动。它从施加更大压力的一侧,即较好的适应值,移动到施加较少力的一侧,即较弱的适应值。

在上述式中,Kij支配着第i个血团即Mi在动脉内的运动方向。在每个循环周期中,αi是介于0到1之间的一个数字,它决定了移位的值,并趋向于一个更优的量。

(3)从血液中分离二氧化碳

如表所示,我们将此动作建模为群体组成和交叉,如下所示:

e48231b838127812c26f7039f242cbd8.png

下式中,si为似然值,由于肺对血液的净化作用,随着每次呼气而减小,与吸气、呼气次数Ne呈反比关系:

其中,ne1的值由用户指定。

如前所述,吸气和呼气在每次迭代中执行Ne次。如果期望的质量在每个结合处都有所提高,它就会取代当前位置。也就是说,如果Mnew, 3ij位置优于Mi,则将其替换。值得注意的是,在第二次吸气和呼气后,下式中使用了Mnew, 3ij:

这个优化周期将在设定次数的迭代或脉冲中继续进行。下图显示了LPO算法使用的优化过程的总结。

2、结果展示

c219c506f5a9d9d1048f6d00b3205443.png 4012e24d49fdc9864cf8aa7ae361db97.png df7b9ebf7dad37fdbd3beaa85f6c75a1.png d7133594f352c9d511f8e7375892bd54.png 354fc5dc74a04455bb4cf91396e2873d.png

3、MATLAB核心代码

%微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work

%%      Optimization based on performance of lungs in body:           %%
%%          Lungs performance_based optimization (LPO)                %%
%%   Mojtaba Ghasemi, Mohsen Zare, Amir Zahedi, Pavel Trojovský,      %%
%%              Laith Abualigah, Eva Trojovsk´                        %%
%%   Computer Methods in Applied Mechanics and Engineering (2024)     %%
%%        DOI:https://doi.org/10.1016/j.cma.2023.116582               %%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [BestSol,BestCost1]=LPO(nPop,MaxIt,VarMin,VarMax,nVar,fobj)% Call LPO

        % nVar :Number of Decision Variables
        VarSize = [1 nVar];          % Decision Variables Matrix Size
 

        %% Initialization
        % Empty Plant Structure
        empty_plant.Position = [];
        empty_plant.Cost = [];
        pop = repmat(empty_plant, nPop, 1);    % Initial Population Array
        BestSol.Cost=inf;

        for i = 1:numel(pop)
            % Initialize Position
            pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
            Delta(i)=rand*2*pi;
            pop(i).Cost=fobj(pop(i).Position);%if you want to use form  Cost Functions CEC
            sigma1(i,:) =rand(VarSize);
            if pop(i).Cost<=BestSol.Cost
                BestSol.Position=pop(i).Position;
                BestSol.Cost=pop(i).Cost;
            end
            BestCost1(i)=BestSol.Cost;
        end

        it=nPop;
        % % for it=1:MaxIt
        while it<=MaxIt

            % Get Best and Worst Cost Values
            Costs = [pop.Cost];
            BestCost = min(Costs);
            WorstCost = max(Costs);

            newpop = [];

            for i = 1:numel(pop)

                R=[];
                C=[];
                for jj = 1:5

                    newsol = empty_plant;
                    newsol2 = empty_plant;
                    R= pop(i).Cost;               %% Eq(9)
                    C=(R/2)*sin(Delta(i));        %% Eq(10)

                    
                    if jj==1 %% Eq(7)
                        newsol.Position =pop(i).Position+ (((R^2+(1/(2*pi*nVar*R*C)^2))^-0.5)*sin(2*pi*nVar*it)*sin((2*pi*nVar*it)+Delta(i))).*pop(i).Position;
                    else     %% Eq(16)
                        newsol.Position =pop(i).Position+ (((R^2+(1/(2*pi*nVar*R*C)^2))^-0.5)*sin(2*pi*nVar*it)*sin((2*pi*nVar*it)+Delta(i))).*(Pos1);
                    end

                    %%Eqs(12)-(13)
                    A1=randperm(nPop);
                    A1(A1==i)=[];
                    a1=A1(1);
                    a2=A1(2);
                    a3=A1(3);

                    Costs = [pop.Cost];
                    BestCost = min(Costs);
                    WorstCost = max(Costs);

                    %%Eq(13)
                    aa1=((pop(a2).Cost-pop(a3).Cost)/abs(pop(a3).Cost-pop(a2).Cost));
                    if (pop(a2).Cost-pop(a3).Cost)==0
                        aa1=1;
                    end
                    %%Eq(13)
                    aa2=((pop(a1).Cost-pop(i).Cost)/abs(pop(a1).Cost-pop(i).Cost));
                    if (pop(a1).Cost-pop(i).Cost)==0
                        aa2=1;
                    end
                    
                    %%Mnew,2 in Eq(12)
                    newsol.Position= newsol.Position+(aa2*(sigma1(i))).*(newsol.Position-pop(a1).Position)+(aa1*sigma1(i)).*(pop(a3).Position-pop(a2).Position);
                    
                    %%Mnew,3 in Eq(14)
                    newsol2.Position =pop(a1).Position+(sigma1(i)).*(pop(a3).Position-pop(a2).Position);
                    see=pop(i).Position;

                    %%Eq(14)
                    for j =1:nVar
                        if rand/jj>rand  %% Eq(15)
                            Pos1(1,j) =newsol2.Position(1,j);
                        else
                            Pos1(1,j)=newsol.Position(1,j);
                        end
                    end


                    % Apply Lower/Upper Bounds
                    Pos1 = max(Pos1, VarMin);
                    Pos1 = min(Pos1, VarMax);
                    newsol.Position=Pos1;
                    Delta(i)=atan((1/(2*pi*nVar*R*C)));  % Eq(8)

                    newsol.Cost=fobj(newsol.Position);
                   
                    if newsol.Cost<pop(i).Cost
                        pop(i)=newsol;
                        if pop(i).Cost<=BestSol.Cost
                            BestSol=pop(i);
                        end
                    end
                    it=it+1;

                    BestCost1(it)=BestSol.Cost;
                    sigma1(i,:) =rand(VarSize);
                end
            end

            %Store Best Cost History
            BestCosts(it) = BestSol.Cost;

            %Display Iteration Information
            if mod(it,180)==0
                disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost)]);
            end
        end     
    end

参考文献

[1] Ghasemi M, Zare M, Zahedi A, et al. Optimization based on performance of lungs in body: Lungs performance-based optimization (LPO)[J]. Computer Methods in Applied Mechanics and Engineering, 2024, 419: 116582.

完整代码获取

后台回复关键词:

TGDM899

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天吃饺子

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值