多目标蜻蜓算法(MODA):原理讲解与代码实现 Matlab代码免费获取

        声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~

目录

单目标蜻蜓算法

一、群体交互模型

二、步长与位置更新

三、随机游走补偿

四、食物/天敌更新

五、自适应探索‑开发转换

多目标蜻蜓算法

一、档案管理与超球分段

二、食物源选择:稀疏优先

三、天敌选择:拥挤优先

四、群体更新

五、收敛‑分布协同机制

伪代码

性能测评

参考文献

完整代码


今天给大家带来一期多目标蜻蜓算法MODA的代码,蜻蜓算法是有大名鼎鼎的Seyedali Mirjalili作者于2016年提出来的,这位作者也是灰狼优化算法、鲸鱼优化算法的提出者。在这篇文章中,他同时提出了单目标蜻蜓算法以及多目标蜻蜓算法。

在单目标蜻蜓算法中,算法在连续搜索空间中展现出强大的全局‑局部平衡能力,而多目标蜻蜓算法则借助档案‑分段‑概率引导机制成功扩展到多目标优化,在保持收敛精度的同时显著提升前沿分布的均匀性。

相比于单目标算法,多目标算法考虑的内容更多,更容易受到审稿人的青睐。因此,本文将介绍该算法的原理与代码。

本期代码免费赠送,需要代码的小伙伴可直接拉到最后!

单目标蜻蜓算法

首先介绍下单目标蜻蜓算法,这也是多目标蜻蜓算法的基础。作者把蜻蜓在捕食与迁徙时呈现的静态群(小范围盘旋捕食)与动态群(大规模同向迁徙)分别对应于元启发式搜索的“探索”和“开发”阶段,依托五种社会交互力与一条随机游走轨迹,配合邻域半径与权重的自适应调节,使搜索能够从全局漫游逐步收敛到全局最优。

一、群体交互模型

对任意个体X,其“分离、对齐、聚合、趋食、避敌”五种校正向量分别定义为:

其Xj,Vj为第j个邻居的位置和步长,N为邻居数量,X+与 X−分别是食物源与天敌的位置。

、步长与位置更新

引入与 PSO 速度对应的步长 ΔX,并以权重s,a,c,f,e及惯性因子w组合上述向量得到:

五权重由探索阶段“高对齐、低聚合”向开发阶段“低对齐、高聚合”线性转变,邻域半径亦随迭代扩大,使所有个体最终汇聚到同一食物源。

三、随机游走补偿

当个体在其邻域内找不到同伴时,改用莱维飞行随机游走:

其中β=1.5;Levy(β)=0.01*r1σ/∣r2∣^1/β,σ为伽玛函数表达式,r1,r2∼U(0,1)。该机制维持种群多样性并有助于跳出局部极值。

四、食物/天敌更新

每轮迭代根据目标函数值从当前种群中选出最优个体作食物源、最劣个体作天敌,并据此驱动全体收敛或远离。

五、自适应探索‑开发转换

随着迭代计数t增大,权重与邻域半径按线性或指数方式调节,实现从多簇静态捕食到单簇动态迁徙的平滑过渡,保证全局收敛。

多目标蜻蜓算法

在 DA 基础上,作者引入外部档案(Archive)维护帕累托最优解,辅以自适应分段选择机制,实现对收敛性与分布均匀性的同步优化。

一、档案管理与超球分段

算法预设最大档案容量与分段数H。每次迭代把新产生的非支配解与档案做 dominance检查:若被档案成员支配则丢弃;若支配档案中部分解则删除被支配解后加入;若互不支配则直接加入,若容量已满则从最拥挤分段随机删除以腾位。分段方式为:以档案中各目标最优最劣值构造一个包络超球并等距划分成H个子超球。

二、食物源选择:稀疏优先

Ni为第i个子超球的档案个体数,通过轮盘赌在较稀疏区域选食物源,引导种群向帕累托前沿缺口移动,改善覆盖度。

三、天敌选择:拥挤优先

利用轮盘赌在最拥挤子超球中抽取天敌,使个体远离过密区域,避免集中。

四、群体更新

位置与步长仍按单目标公式 (2) 执行;但当个体缺乏邻居时,仍采用公式 (3) 的莱维飞行。更新后将新解与档案合并并重新计算分段,循环至终止条件满足。

五、收敛‑分布协同机制

通过“稀疏吸引、拥挤排斥”的食物/敌人对产生引导力,配合逐步增大的邻域与权重调节,使 MODA 能在保证靠近真实帕累托面的同时得到分布均匀的前沿。

伪代码

为了更清晰的展示MODE的原理,这边给出MODE算法的伪代码,非常清晰~

性能测评

为这边以多目标函数“ZDT1”为例,设置种群数量为100,外部存档大小为100,迭代次数为100,检测一下MODA的性能:

可以看到,黑色的各个前沿种群均接近真实帕累托最优解,且分布性良好,可见算法性能还是不错的~

参考文献

[1]Mirjalili S. Dragonfly algorithm: a new meta-heuristic optimization technique for solving single-objective, discrete, and multi-objective problems[J]. Neural computing and applications, 2016, 27: 1053-1073.

完整代码

MODA完整代码如下:

% Initial parameters of the MODA algorithm
max_iter=100;
N=100;
ArchiveMaxSize=100;

Archive_X=zeros(100,dim);
Archive_F=ones(100,obj_no)*inf;

Archive_member_no=0;

r=(ub-lb)/2;
V_max=(ub(1)-lb(1))/10;

Food_fitness=inf*ones(1,obj_no);
Food_pos=zeros(dim,1);

Enemy_fitness=-inf*ones(1,obj_no);
Enemy_pos=zeros(dim,1);

X=initialization(N,dim,ub,lb);
fitness=zeros(N,2);

DeltaX=initialization(N,dim,ub,lb);
iter=0;

position_history=zeros(N,max_iter,dim);

for iter=1:max_iter
    
    r=(ub-lb)/4+((ub-lb)*(iter/max_iter)*2);
    
    w=0.9-iter*((0.9-0.2)/max_iter);
    
    my_c=0.1-iter*((0.1-0)/(max_iter/2));
    if my_c<0
        my_c=0;
    end
    
    if iter<(3*max_iter/4)
        s=my_c;             % Seperation weight
        a=my_c;             % Alignment weight
        c=my_c;             % Cohesion weight
        f=2*rand;           % Food attraction weight
        e=my_c;             % Enemy distraction weight
    else
        s=my_c/iter;        % Seperation weight
        a=my_c/iter;        % Alignment weight
        c=my_c/iter;        % Cohesion weight
        f=2*rand;           % Food attraction weight
        e=my_c/iter;        % Enemy distraction weight
    end
    
    for i=1:N %Calculate all the objective values first
        Particles_F(i,:)=ObjectiveFunction(X(:,i)');
        if dominates(Particles_F(i,:),Food_fitness)
            Food_fitness=Particles_F(i,:);
            Food_pos=X(:,i);
        end
        
        if dominates(Enemy_fitness,Particles_F(i,:))
            if all(X(:,i)<ub') && all( X(:,i)>lb')
                Enemy_fitness=Particles_F(i,:);
                Enemy_pos=X(:,i);
            end
        end
    end
    
    [Archive_X, Archive_F, Archive_member_no]=UpdateArchive(Archive_X, Archive_F, X, Particles_F, Archive_member_no);
    
    if Archive_member_no>ArchiveMaxSize
        Archive_mem_ranks=RankingProcess(Archive_F, ArchiveMaxSize, obj_no);
        [Archive_X, Archive_F, Archive_mem_ranks, Archive_member_no]=HandleFullArchive(Archive_X, Archive_F, Archive_member_no, Archive_mem_ranks, ArchiveMaxSize);
    else
        Archive_mem_ranks=RankingProcess(Archive_F, ArchiveMaxSize, obj_no);
    end
    
    Archive_mem_ranks=RankingProcess(Archive_F, ArchiveMaxSize, obj_no);
    
    % Chose the archive member in the least population area as foods
    % to improve coverage
    index=RouletteWheelSelection(1./Archive_mem_ranks);
    if index==-1
        index=1;
    end
    Food_fitness=Archive_F(index,:);
    Food_pos=Archive_X(index,:)';
       
    % Chose the archive member in the most population area as enemies
    % to improve coverage
    index=RouletteWheelSelection(Archive_mem_ranks);
    if index==-1
        index=1;
    end
    Enemy_fitness=Archive_F(index,:);
    Enemy_pos=Archive_X(index,:)';
    
    for i=1:N
        index=0;
        neighbours_no=0;
        
        clear Neighbours_V
        clear Neighbours_X
        % Find the neighbouring solutions
        for j=1:N
            Dist=distance(X(:,i),X(:,j));
            if (all(Dist<=r) && all(Dist~=0))
                index=index+1;
                neighbours_no=neighbours_no+1;
                Neighbours_V(:,index)=DeltaX(:,j);
                Neighbours_X(:,index)=X(:,j);
            end
        end
        
        % Seperation%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % Eq. (3.1)
        S=zeros(dim,1);
        if neighbours_no>1
            for k=1:neighbours_no
                S=S+(Neighbours_X(:,k)-X(:,i));
            end
            S=-S;
        else
            S=zeros(dim,1);
        end
        
        % Alignment%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % Eq. (3.2)
        if neighbours_no>1
            A=(sum(Neighbours_V')')/neighbours_no;
        else
            A=DeltaX(:,i);
        end
        
        % Cohesion%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % Eq. (3.3)
        if neighbours_no>1
            C_temp=(sum(Neighbours_X')')/neighbours_no;
        else
            C_temp=X(:,i);
        end
        
        C=C_temp-X(:,i);
        
        % Attraction to food%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % Eq. (3.4)
        Dist2Attraction=distance(X(:,i),Food_pos(:,1));
        if all(Dist2Attraction<=r)
            F=Food_pos-X(:,i);
            iter;
        else
            F=0;
        end
        
        % Distraction from enemy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % Eq. (3.5)
        Dist=distance(X(:,i),Enemy_pos(:,1));
        if all(Dist<=r)
            E=Enemy_pos+X(:,i);
        else
            E=zeros(dim,1);
        end
        
        for tt=1:dim
            if X(tt,i)>ub(tt)
                X(tt,i)=lb(tt);
                DeltaX(tt,i)=rand;
            end
            if X(tt,i)<lb(tt)
                X(tt,i)=ub(tt);
                DeltaX(tt,i)=rand;
            end
        end
        
        
        if any(Dist2Attraction>r)
            if neighbours_no>1
                for j=1:dim
                    DeltaX(j,i)=w*DeltaX(j,i)+rand*A(j,1)+rand*C(j,1)+rand*S(j,1);
                    if DeltaX(j,i)>V_max
                        DeltaX(j,i)=V_max;
                    end
                    if DeltaX(j,i)<-V_max
                        DeltaX(j,i)=-V_max;
                    end
                    X(j,i)=X(j,i)+DeltaX(j,i);
                end
                
            else
                X(:,i)=X(:,i)+Levy(dim)'.*X(:,i);
                DeltaX(:,i)=0;
            end
        else    
            for j=1:dim
                DeltaX(j,i)=s*S(j,1)+a*A(j,1)+c*C(j,1)+f*F(j,1)+e*E(j,1) + w*DeltaX(j,i);
                if DeltaX(j,i)>V_max
                    DeltaX(j,i)=V_max;
                end
                if DeltaX(j,i)<-V_max
                    DeltaX(j,i)=-V_max;
                end
                X(j,i)=X(j,i)+DeltaX(j,i);
            end
        end
        
        Flag4ub=X(:,i)>ub';
        Flag4lb=X(:,i)<lb';
        X(:,i)=(X(:,i).*(~(Flag4ub+Flag4lb)))+ub'.*Flag4ub+lb'.*Flag4lb;
        
    end
    
    display(['At the iteration ', num2str(iter), ' there are ', num2str(Archive_member_no), ' non-dominated solutions in the archive']);
end

其中有部分函数封装为了子函数,因篇幅原因文章中无法全部放下。因此,需要完整代码(能够运行出性能测评中的图片)的小伙伴只需点击下方小卡片,再后台回复关键词,不区分大小写:

MODA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值