嗅觉优化算法,MATLAB代码免费获取

先说结论:我在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.结果展示

49a4fe3fb996b3da081785240daad8a7.png

e2711e57797a2bf290734b73b5a4741f.png

70e3401d62053a4935b13b2c83a0787f.png

140385d9f0861f436feffc6ef8e8e61a.png

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淘个代码_

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值