先说结论:我在23个经典函数和CEC2017函数都做了对比,感觉此算法表现一般,不过小伙伴们在改进自己算法的时候,可以用这个算法来做对比突出自己改进算法的优势。
嗅觉优化算法(Smell Agent Optimization,SAO)是一种新型的启发式算法,该算法实现了气味剂和蒸发气味分子的物体之间的关系。这些关系被建模为三个独立的模式,称为嗅探,跟踪和随机模式。嗅闻模式模拟当气味分子从气味源朝向试剂扩散时试剂的气味感知能力。跟踪模式模拟了个体跟踪气味分子的一部分直到其来源被识别的能力。此外,随机模式是采用的一种策略,以避免陷入局部极小值。
该成果于2021年发表在工程领域1区期刊Knowledge-Based Systems上,目前被引用92次。
嗅觉是感知世界的主要感官之一。大多数生物利用嗅觉感知环境中有害化学物质的存在。在发展SAO时考虑人类的嗅觉似乎是很自然的。然而,本文发现大多数生物制剂利用嗅觉的主要目的是相同的:寻找食物,交配和避免危险。这激发了一个广义的以嗅觉为基础的优化算法发展。
1.原理详解
(1)嗅探模式
由于气味分子在药剂的方向上扩散,本文首先用随机生成的气味分子的初始位置启动该过程。假设气味分子的总数为N,并且超空间中的总变量表示为D,则气味分子可以使用以下公式初始化:
位置向量使个体能够确定自己在搜索空间中的最佳位置,可以使用以下公式生成:
其中,ub和lb分别为决策变量定义的上界和下界,r0是在(0,1)范围内生成的随机数。
根据上述公式,每个气味分子被分配一个初始速度,通过这个速度它们从气味源扩散,如下式所示:
在几何数字空间中,每个气味分子代表一个候选解。这些候选解的位置可以由公式给出的位置向量xti和分子速度vti确定。由于气味分子以布朗形式扩散,因此使用下式更新分子的速度。
在SAO中,假设∆t为1,表示个体在优化过程中每次一个渐进步骤。嗅觉分子的新位置为下式所示:
每个气味分子都有相应的扩散速度,它们蒸发并更新它们在搜索空间中的位置。由于气味分子以不均匀的方式扩散,直到它到达代理位置,因此气味分子的更新速度使用下式计算:
其中v是下式给出的速度的更新分量。
k是气味常数,它标准化了温度和质量对气味分子动能的影响,T和m分别是气味分子的温度和质量。
温度(T)和质量(m)都是与气味分子初始化相关的参数,因此对算法的稳定性没有直接影响。T和m的概念来源于气体的理想理论。例如,由于气味分子与气体分子一样,本质上是布朗分子,因此其在公式中的速度更新来源于气体静水压力的概念:
为了避免在选择m和T的值时不必要的浪费时间,实验确定m和T的值分别为0.175和0.825。
对公式中气味分子更新位置的适应度进行评估。此时嗅探模式已经完成,可以确定 的位置(最佳适应度位置)。
(2)跟随模式
这种模式模拟了个人识别气味来源的搜索行为。在搜索气味源时,个体可以嗅探具有比其当前位置更高浓度的气味分子的新位置,个体向该新位置移动:
其中,r2和r3是(0,1]范围内的随机数。
为了使个体有效地跟踪气味的路径,智能体记录其当前位置x(t)智能体的适应度以及从嗅探模式获得的具有最差气味适应度的位置 。该信息有助于算法改善探索和利用之间的平衡。由于嗅觉能力主要取决于嗅叶的大小,个体的心理和身体条件,因此应仔细选择olf的值。例如,olf的值较小表示嗅觉较差,有利于局部搜索,而olf的值较大表示嗅觉较强,有利于SAO的全局搜索。
(3)随机模式
气味分子是离散的,并且如果它们与搜索空间相比分开大的距离,则气味分子的浓度可能随时间变化。这种变化会使个体“困惑”,导致气味丧失,并使跟踪成为一个挑战。在这一点上,由于无法继续跟踪,个体可能会陷入局部最小值。如果发生这种情况,个体将进入随机模式,该模式由以下公式描述:
其中,SL是常数,指示步长,并且r4是随机数,其随机地惩罚SL的值。在跟踪模式无法获得最佳适应度或识别气味源或代理丢失其踪迹的情况下,使用上述公式更新:
下图显示了SAO的概念框架。从图中可以看出,个体表示为人,圆圈表示气味源。气味分子用虚线表示,而黑色的粗线表示浓度最高的气味分子的路径。xfe都是通向气味源的可行路径。
SAO算法的伪代码如下
2.结果展示




3.MATLAB核心代码
function [Agent_Fit,Agent_Pos,Converge_curve]=SAO(Molecules,Max_iter,lb,ub,dim,fobj)
Agent_Pos=zeros(1,dim);
Agent_Fit=inf; %
olf=0.9;
K=0.6;
T=0.95;
M=0.9;
Step=0.02;
ub = ub.*ones(1,dim);lb = lb.*ones(1,dim);
%Create the initial position of smell molecules
moles_Pos=initialization(Molecules,dim,ub,lb);
BestScore=inf;
Converge_curve=zeros(1,Max_iter);
iter=0;%
% Main loop
while iter<Max_iter
for i=1:size(moles_Pos,1)
%Make Sure smell molecules remains in the search space.
Clip_ub=moles_Pos(i,:)>ub;
Clip_lb=moles_Pos(i,:)<lb;
moles_Pos(i,:)=(moles_Pos(i,:).*(~(Clip_ub+Clip_lb)))+ub.*Clip_ub+lb.*Clip_lb;
% Calculate objective function for each molecules
fitness=fobj(moles_Pos(i,:));
% Agent Fitness
if fitness<Agent_Fit
Agent_Fit=fitness; % Update Agent fitness
Agent_Pos=moles_Pos(i,:);
end
end
% Update the Position of molecules
for i=1:size(moles_Pos,1)
for j=1:size(moles_Pos,2)
r1=rand(); % r1 is a random number in [0,1]
r3=rand();
r4=rand();
r5=rand();
Sniff_mole(i,j)=moles_Pos(i,j)+r1*sqrt(3*K*T/M); %Sniffing Mode
end
fitness=fobj(Sniff_mole(i,:));
[~,Index]=min(fitness);
Agent_Pos=Sniff_mole(:,Index);
[~,Indes]=max(fitness);
Worst_Pos=Sniff_mole(:,Indes);
if fitness<BestScore
BestScore=fitness;
moles_Pos(i,:)=Sniff_mole(i,:);
end
%Trailing Mode
for j=1:size(moles_Pos,2)
Trail_mole(i,j)=moles_Pos(i,j)+r3*olf*(moles_Pos(i,j)-Agent_Pos(i,1))...
-r4*olf*(moles_Pos(i,j)-Worst_Pos(i,1)); %Traili Mode
end
fitness=fobj(Trail_mole(i,:));
if fitness<BestScore
BestScore=fitness;
moles_Pos(i,:)=Trail_mole(i,:);
end
%Random Mode
for j=1:size(moles_Pos,2)
Random_mole(i,j)=moles_Pos(i,j)+r5*Step;
end
fitness=fobj(Random_mole(i,:));
if fitness<BestScore
BestScore=fitness;
moles_Pos(i,:)=Random_mole(i,:);
end
end
iter=iter+1;
% Agent_Fit=BestScore;
Agent_Pos=moles_Pos(1:dim);
Converge_curve(iter)=Agent_Fit;end;
4.参考文献
Salawudeen A T, Mu’azu M B, Yusuf A, et al. A Novel Smell Agent Optimization (SAO): An extensive CEC study and engineering application[J]. Knowledge-Based Systems, 2021, 232: 107486.
完整代码获取
点击下方卡片,后台回复关键词:
TGDM839
768

被折叠的 条评论
为什么被折叠?



