【matlab】【多目标优化算法】【MOMPA】【附代码】

warning('off')
clear, clc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                      ZDT
%Parameters      numObj      dim	     lb & ub
%ZDT1-ZDT3	       2	     30	    xi∈[0,1],1≤i≤dim
%                                   final_lb = 0;
%                                   final_ub = 1;
%ZDT4              2	     10	    x1∈[0,1],xi∈[-5,5],2≤i≤dim
%                                   final_lb = [0 -5*ones(1,9)];
%                                   final_ub = [1 5*ones(1,9)];
%ZDT6              2	     10	    xi∈[0,1],1≤i≤dim
%                                   final_lb = 0;
%                                   final_ub = 1;
%%                      DTLZ
%Parameters      numObj      dim	     lb & ub
%DTLZ1             3	     7	    xi∈[0,1],1≤i≤dim
%                                   final_lb = 0;
%                                   final_ub = 1;
%DTLZ2-DTLZ6	   3	     12	    xi∈[0,1],1≤i≤dim
%                                   final_lb = 0;
%                                   final_ub = 1;
%DTLZ7             3	     22	    xi∈[0,1],1≤i≤dim
%                                   final_lb = 0;
%                                   final_ub = 1;
%%                       WFG
%Parameters      numObj      dim	     lb & ub
%WFG3-WFG9         3         12	    xi∈[0,2i],1≤i≤dim
%                                   final_lb = zeros(1,12);
%                                   final_ub = 2 : 2 : 2*12;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a_mompa=[];
for i=1:1
        final_lb =0;      %Different test functions choose different parameters
        final_ub =1;      %Different test functions choose different parameters
        [fit,IGD,P] = mompa('DTLZ1', ...  %test function name
        'Max_iter', 3000, ...  
        'SearchAgents_no',100,... 
        'minmax', 'min', ...      
        'plotFlag', 1, ...        
        'dim', 7, ...      %  Different test functions choose different parameters      
        'numObj', 3, ...    %  Different test functions choose different parameters  
        'numgroup', 1, ...        
        'lb', final_lb, ...       
        'ub', final_ub);         
    i
    a_mompa(i) = IGD(end);
end
a_mompa
b1=mean(a_mompa);
b2=std(a_mompa);

if size(P,2)==3
    scatter3(P(:, 1), P(:, 2),P(:,3));
else 
    scatter(P(:, 1), P(:, 2));
end
function [fit,sub_IGD,P_1] =mompa(FUN, varargin)

if ~mod(nargin, 2)
    error('MATLAB:narginchk:notEnoughInputs', ...
        'I have no idea about this, you can guess it');
end
%% Parameter processing
for ind = 1:2:nargin-1
    switch lower(varargin{ind})
        case 'lb'
            lb = varargin{ind + 1};
        case 'ub'
            ub = varargin{ind + 1};
        case 'numobj'
            numObj = varargin{ind + 1};
        case 'max_iter'
            Max_iter = varargin{ind + 1};
        case 'searchagents_no'
            SearchAgents_no = varargin{ind + 1};
        case 'dim'
            dim = varargin{ind + 1};
        case 'numgroup'
            numGroup = varargin{ind + 1};
        case 'minmax'
            if strcmp(varargin{ind + 1}, 'min')
                flagMinMax = 0;
            else
                flagMinMax = 1;
            end
        case 'plotflag'
            plotFlag = varargin{ind + 1};
        otherwise
            error('The function don''t support this parameter');
    end
end
%% Initialization
Iter=0;
FADs=0.2;
P=0.5;
sub_IGD=[];
if flagMinMax
    fit = -inf*ones(SearchAgents_no, numObj);
else
    fit = inf*ones(SearchAgents_no, numObj);
end
%% interative optimization start
if (plotFlag)
    figure(1); hold on;
    h = animatedline;
    h.LineStyle = 'none'; h.Marker = '.'; h.Color = 'r';
    title(FUN)
end

while Iter<Max_iter

    %------------------------------------------------------------
    if Iter==0
        Prey=mompa_initialization(SearchAgents_no,dim,ub,lb);

        [Z,SearchAgents_no] = UniformPoint(SearchAgents_no,numObj);
        [subfit, ~,~] = mompa_getMOFcn(FUN, Prey, numObj);
        Zmin  = min(subfit,[],1);
        Prey=EnvironmentalSelection(FUN,Prey,SearchAgents_no,numObj,Z,Zmin);
        Prey_old=Prey;

    end
    Xmin=repmat(ones(1,dim).*lb,SearchAgents_no,1);
    Xmax=repmat(ones(1,dim).*ub,SearchAgents_no,1);

    Elite = repmat(Prey_old(randi(SearchAgents_no),:),SearchAgents_no,1);

    %------------------------------------------------------------

    CF=(1-Iter/Max_iter)^(2*Iter/Max_iter);
    RL=0.05*mompa_levy(SearchAgents_no,dim,1.5);   %Levy random number vector
    RB=randn(SearchAgents_no,dim);          %Brownian random number vector
    stepsize=zeros(SearchAgents_no,dim);
    for i=1:size(Prey,1)
        for j=1:size(Prey,2)
            R=rand();
            %------------------ Phase 1 (Eq.12) -------------------
            if Iter<Max_iter/3
                stepsize(i,j)=RB(i,j)*(Elite(i,j)-RB(i,j)*Prey(i,j));
                Prey(i,j)=Prey(i,j)+P*R*stepsize(i,j);

                %--------------- Phase 2 (Eqs. 13 & 14)----------------
            elseif Iter>Max_iter/3 && Iter<2*Max_iter/3

                if i>size(Prey,1)/2
                    stepsize(i,j)=RB(i,j)*(RB(i,j)*Elite(i,j)-Prey(i,j));
                    Prey(i,j)=Elite(i,j)+P*CF*stepsize(i,j);
                else
                    stepsize(i,j)=RL(i,j)*(Elite(i,j)-RL(i,j)*Prey(i,j));
                    Prey(i,j)=Prey(i,j)+P*R*stepsize(i,j);
                end

                %----------------- Phase 3 (Eq. 15)-------------------
            else

                stepsize(i,j)=RL(i,j)*(RL(i,j)*Elite(i,j)-Prey(i,j));
                Prey(i,j)=Elite(i,j)+P*CF*stepsize(i,j);

            end
        end
    end

    %------------------------------------------------------------
    for i=1:size(Prey,1)

        Flag4ub=Prey(i,:)>ub;
        Flag4lb=Prey(i,:)<lb;
        Prey(i,:)=(Prey(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;

    end
    Prey_evo=Prey;

    if rand()<FADs
        U=rand(SearchAgents_no,dim)<FADs;
        Prey=Prey+CF*((Xmin+rand(SearchAgents_no,dim).*(Xmax-Xmin)).*U);

    else
        r=rand();  Rs=size(Prey,1);
        stepsize=(FADs*(1-r)+r)*(Prey(randperm(Rs),:)-Prey(randperm(Rs),:));
        Prey=Prey+stepsize;
    end

    for i=1:size(Prey,1)

        Flag4ub=Prey(i,:)>ub;
        Flag4lb=Prey(i,:)<lb;
        Prey(i,:)=(Prey(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;

    end
    Prey_fads=Prey;

    Prey_gau = mompa_Gaussian_search(Prey,SearchAgents_no,dim,ones(1,dim).*ub,ones(1,dim).*lb);

    two_Prey = [Prey_old;Prey_evo;Prey_fads;Prey_gau];
    two_loc=unique(two_Prey,'rows');
    [subfit,~ ,P_1] = mompa_getMOFcn(FUN, two_loc, numObj);
    Zmin       = min([Zmin;subfit],[],1);
    Prey=EnvironmentalSelection(FUN,two_loc,SearchAgents_no,numObj,Z,Zmin);
    [fit, ~,~] = mompa_getMOFcn(FUN, Prey, numObj);
    Prey_old=Prey;
    sub_IGD(Iter+1)=mompa_IGD(fit,P_1);

    if (plotFlag && mod(Iter, 1)==0)
        clearpoints(h);
        if numObj==3
            addpoints(h, fit(:, 1), fit(:, 2), fit(:, 3));
        elseif numObj==2
            addpoints(h, fit(:, 1), fit(:, 2));
        end
        drawnow
        %         pause()
    end

    Iter=Iter+1;
    Iter
end

代码地址(非免费): https://download.csdn.net/download/wq6qeg88/89017208

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

资源存储库

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值