肺功能优化算法(Lungs Performance-Based Optimization, LPO)。该算法的设计灵感源自于人体肺部的高度规律性与智能性能,致力于模仿这些自然界中的智能行为以达到优化算法的性能。值得一提的是,LPO算法展现出了几个显著的优点:具备强大的进化能力、快速的搜索速度以及卓越的寻优能力。这些特性使得LPO算法在解决复杂问题时更加高效和有效。该成果于2024年2月发表在中科院1区SCI期刊Computer Methods in Applied Mechanics and Engineering。
肺功能优化算法(LPO)的开发灵感源自于人体肺部的结构和功能,特别是其在气体交换过程中展现出的高效率和智能调节能力。人体肺部能够根据身体需求和外部环境自动调节气体交换的效率,这种能力源自于其复杂的结构和智能的管理系统。肺部的每一次呼吸都是对气体最优化交换的一个自然过程,它能够在不同的运动强度和氧气需求下,精准调节氧气和二氧化碳的交换。这种智能的自我调节机制激发了LPO算法的创新设计思路。
1、算法原理
LPO是一种优化器,它以初始群体或空气质量Mi开始,其中i= 1,2,.,Npop,它在身体的功能循环中进入血液并创建新的群体。该初始种群在目标问题范围的两个最大值(Mmax)和最小值(Mmin)之间随机生成。这种主要的群体起着与血液团块或颗粒相同的作用。
(1)空气进出肺的入口和出口
如前所述,我们选择了用于肺的RC模型,并且考虑到建模参数,我们假设进入肺的空气质量的位置如下,在优化科学中,这是初始群体的新位置。
在上面的等式中,D是问题的维数,Iter是算法的当前迭代。
(2)二氧化碳从空气中分离出来,血液在静脉中流动
氧气被肺部从空气中分离出来,进入血液。这个质量Mi相当于人口在问题空间中的运动。氧气进入血液的运动可以用下式来模拟。也就是说,血液通过施加在它身上的压力运动。它从施加更大压力的一侧,即较好的适应值,移动到施加较少力的一侧,即较弱的适应值。
在上述式中,Kij支配着第i个血团即Mi在动脉内的运动方向。在每个循环周期中,αi是介于0到1之间的一个数字,它决定了移位的值,并趋向于一个更优的量。
(3)从血液中分离二氧化碳
如表所示,我们将此动作建模为群体组成和交叉,如下所示:
下式中,si为似然值,由于肺对血液的净化作用,随着每次呼气而减小,与吸气、呼气次数Ne呈反比关系:
其中,ne1的值由用户指定。
如前所述,吸气和呼气在每次迭代中执行Ne次。如果期望的质量在每个结合处都有所提高,它就会取代当前位置。也就是说,如果Mnew, 3ij位置优于Mi,则将其替换。值得注意的是,在第二次吸气和呼气后,下式中使用了Mnew, 3ij:
这个优化周期将在设定次数的迭代或脉冲中继续进行。下图显示了LPO算法使用的优化过程的总结。
2、结果展示
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