1 内容介绍

本文介绍了一种称为 Mayfly 算法 (MA) 的新方法来解决优化问题。 受蜉蝣飞行行为和交配过程的启发,该算法结合了群体智能和进化算法的主要优点。为了评估所提出算法的性能,使用了 38 个数学基准函数,包括 13 个 CEC2017 测试函数,并将结果与七种最先进的著名元启发式优化方法的结果进行了比较。 MA 的性能也通过多目标优化中的收敛行为以及使用现实世界的离散流水车间调度问题进行评估。 比较结果证明了所提方法在收敛速度和收敛速度方面的优越性。 婚舞和随机飞行的过程增强了算法探索性和利用性之间的平衡,帮助算法摆脱了局部最优。

【智能优化算法】基于蜉蝣算法求解多目标优化问题附matlab代码_lua

【智能优化算法】基于蜉蝣算法求解多目标优化问题附matlab代码_lua_02

编辑

【智能优化算法】基于蜉蝣算法求解多目标优化问题附matlab代码_lua_03

【智能优化算法】基于蜉蝣算法求解多目标优化问题附matlab代码_调度问题_04

编辑

【智能优化算法】基于蜉蝣算法求解多目标优化问题附matlab代码_lua_05

【智能优化算法】基于蜉蝣算法求解多目标优化问题附matlab代码_调度问题_06

编辑

2 仿真代码

% Project Title: A multiobjective mayfly optimization algorithm (MOMA) in MATLAB

%

% Researchers are allowed to use this code in their research projects.

%

% Please cite as:

% Zervoudakis, K., & Tsafarakis, S. (2020). A mayfly optimization algorithm.

% Computers & Industrial Engineering, 145, 106559.

% https://doi.org/10.1016/j.cie.2020.106559

%%

clc; clear; close all;

%% Problem Definition

% Objective Functions

ANSWER=listdlg('PromptString','Choose Objective Function','SelectionMode','single', 'ListString', {'1. ZDT', '2. ZDT2', '3. ZDT3'});

if eq(ANSWER,1); ObjectiveFunction=@(x) ZDT(x); funcname='ZDT';

elseif eq(ANSWER,2); ObjectiveFunction=@(x) ZDT2(x); funcname='ZDT2';

elseif eq(ANSWER,3); ObjectiveFunction=@(x) ZDT3(x); funcname='ZDT3';

else; disp('Terminated'); return

end

ProblemSize=[1 10];       % Decision Variables Size

LowerBound=0;             % Decision Variables Lower Bound

UpperBound=1;             % Decision Variables Upper Bound

%% Mayfly Parameters

methname='Mayfly Algorithm';

MaxIt=100;         % Maximum Number of Iterations

nPop=20; nPopf=20;          % Population Size (males and females)

nPareto=50;       % Repository Size

g=0.8;                % Inertia Weight

gdamp=1;            % Inertia Weight Damping Ratio

a1=1.0;             % Personal Learning Coefficient

a2=1.5;  a3=1.5;           % Global Learning Coefficient

beta=2;             % Distance sight Coefficient

dance=0.77;          % Mutation Coefficient

dance_damp=0.99;    % Mutation Coefficient Damping Ratio

fl=0.77;                       % Random flight

fl_damp=0.99;

% Mating Parameters

nCrossover=20;  % Number of Parnets (Offsprings)

nMutation=round(0.5*nPop);        % Number of Mutants

mu=0.02;                                % Mutation Rate

% Velocity Limits

VelMax=1*(UpperBound-LowerBound)*5; VelMin=-VelMax;

%% Initialization

%run initial

empty_mayfly.Position=[];

empty_mayfly.Velocity=[];

empty_mayfly.Cost=[];

empty_mayfly.Best.Position=[];

empty_mayfly.Best.Cost=[];

empty_mayfly.Rank=[];

empty_mayfly.DominationSet=[];

empty_mayfly.DominatedCount=[];

empty_mayfly.CrowdingDistance=[];

Mayfly=repmat(empty_mayfly,nPop,1);

Mayflyf=repmat(empty_mayfly,nPopf,1);

for i=1:nPop

    % Initialize Male Position

    Mayfly(i).Position=unifrnd(LowerBound,UpperBound,ProblemSize);

    % Initialize Velocity

    Mayfly(i).Velocity=zeros(ProblemSize);

    % Evaluation

    Mayfly(i).Cost=ObjectiveFunction(Mayfly(i).Position);

    % Update Personal Best

    Mayfly(i).Best.Position=Mayfly(i).Position;

    Mayfly(i).Best.Cost=Mayfly(i).Cost;

    % Initialize female Position

    if i<=nPopf

        Mayflyf(i).Position=unifrnd(LowerBound,UpperBound,ProblemSize);

        Mayflyf(i).Velocity=zeros(ProblemSize);

        Mayflyf(i).Cost=ObjectiveFunction(Mayflyf(i).Position);

        Mayflyf(i).Best.Position=Mayflyf(i).Position;

        Mayflyf(i).Best.Cost=Mayflyf(i).Cost;

    end

end

% Merge

Pareto=[Mayfly;Mayflyf];

% Non-Dominated Sorting

[Pareto, F]=ParetoSorting(Pareto);

% Calculate Crowding Distance

Pareto=CalcCD(Pareto,F);

% Sort Population

Pareto=SortSolutions(Pareto);

Pareto=Pareto(F{1});

% Truncate

if numel(Pareto)>nPareto

    Pareto=Pareto(1:nPareto);

end

%% Mayfly Main Loop

for it=1:MaxIt

    for i=1:nPop

        leader=Pareto(randi(size(Pareto,2)));

        % Update Females

        if i<=nPopf

            if Dominates(Mayfly(i),Mayflyf(i))

                rmf=norm(Mayfly(i).Position-Mayflyf(i).Position);

                Mayflyf(i).Velocity = g*Mayflyf(i).Velocity ...

                    +a3*exp(-beta*rmf^2).*(Mayfly(i).Position-Mayflyf(i).Position);

            else

                e=unifrnd(-1,+1,ProblemSize);

                Mayflyf(i).Velocity = g*Mayflyf(i).Velocity+fl*(e);

            end

            % Apply Velocity Limits

            Mayflyf(i).Velocity = max(Mayflyf(i).Velocity,VelMin);

            Mayflyf(i).Velocity = min(Mayflyf(i).Velocity,VelMax);

            % Update Position

            Mayflyf(i).Position = Mayflyf(i).Position + Mayflyf(i).Velocity;

            % Velocity Mirror Effect

            IsOutside=(Mayflyf(i).Position<LowerBound | Mayflyf(i).Position>UpperBound);

            Mayflyf(i).Velocity(IsOutside)=-Mayflyf(i).Velocity(IsOutside);

            % Apply Position Limits

            Mayflyf(i).Position = max(Mayflyf(i).Position,LowerBound);

            Mayflyf(i).Position = min(Mayflyf(i).Position,UpperBound);

            % Evaluation

            Mayflyf(i).Cost=ObjectiveFunction(Mayflyf(i).Position);

            Mayflyf(i).Best.Position=Mayflyf(i).Position;

            Mayflyf(i).Best.Cost=Mayflyf(i).Cost;

        end

        % Update Males

        % Update Velocity

        if Dominates(leader,Mayfly(i))

            rpbest=norm(Mayfly(i).Best.Position-Mayfly(i).Position);

            rgbest=norm(leader.Position-Mayfly(i).Position);

            Mayfly(i).Velocity = g*Mayfly(i).Velocity ...

                +a1*exp(-beta*rpbest^2).*(Mayfly(i).Best.Position-Mayfly(i).Position) ...

                +a2*exp(-beta*rgbest^2).*(leader.Position-Mayfly(i).Position);

        else

            e=unifrnd(-1,+1,ProblemSize);

            Mayfly(i).Velocity = g*Mayfly(i).Velocity+dance*(e);

        end

        % Apply Velocity Limits

        Mayfly(i).Velocity = max(Mayfly(i).Velocity,VelMin);

        Mayfly(i).Velocity = min(Mayfly(i).Velocity,VelMax);

        % Update Position

        Mayfly(i).Position = Mayfly(i).Position + Mayfly(i).Velocity;

        % Velocity Mirror Effect

        IsOutside=(Mayfly(i).Position<LowerBound | Mayfly(i).Position>UpperBound);

        Mayfly(i).Velocity(IsOutside)=-Mayfly(i).Velocity(IsOutside);

        % Apply Position Limits

        Mayfly(i).Position = max(Mayfly(i).Position,LowerBound);

        Mayfly(i).Position = min(Mayfly(i).Position,UpperBound);

        % Evaluation

        Mayfly(i).Cost=ObjectiveFunction(Mayfly(i).Position);

        % Update Personal Best

        if Dominates(Mayfly(i),Mayfly(i).Best)

            Mayfly(i).Best.Position=Mayfly(i).Position;

            Mayfly(i).Best.Cost=Mayfly(i).Cost;

        elseif Dominates(Mayfly(i).Best,Mayfly(i))

            % Do Nothing

        else

            if rand<0.5

                Mayfly(i).Best.Position=Mayfly(i).Position;

                Mayfly(i).Best.Cost=Mayfly(i).Cost;

            end

        end

    end

    % MATE

    popc=repmat(empty_mayfly,nCrossover/2,2);

    for k=1:nCrossover/2

        % Select Parents

        i1=randi(numel(Pareto));

        i2=randi(numel(Pareto));

        %p1=Mayfly(i1).Best;

        %p2=Mayflyf(i2).Best;

        % Apply Crossover

        [popc(k,1).Position, popc(k,2).Position]=Crossover(Pareto(i1).Position,Pareto(i2).Position);

        % Evaluation

        popc(k,1).Position = max(popc(k,1).Position, LowerBound);

        popc(k,1).Position = min(popc(k,1).Position, UpperBound);

        popc(k,1).Cost=ObjectiveFunction(popc(k,1).Position);

        % Evaluation

        popc(k,2).Position = max(popc(k,2).Position, LowerBound);

        popc(k,2).Position = min(popc(k,2).Position, UpperBound);

        popc(k,2).Cost=ObjectiveFunction(popc(k,2).Position);

        popc(k,1).Best.Position = popc(k,1).Position;

        popc(k,1).Best.Cost = popc(k,1).Cost;

        popc(k,1).Velocity= zeros(ProblemSize);

        popc(k,2).Best.Position = popc(k,2).Position;

        popc(k,2).Best.Cost = popc(k,2).Cost;

        popc(k,2).Velocity= zeros(ProblemSize);

    end

    % break

    popc=popc(:);

    % Mutation

    popm=repmat(empty_mayfly,nMutation,1);

    for k=1:nMutation

        i=randi(numel(Pareto));

        popm(k)=Pareto(i);

        popm(k).Position=Mutate(popm(k).Position,mu,LowerBound,UpperBound);

        % Evaluation

        popm(k).Position = max(popm(k).Position, LowerBound);

        popm(k).Position = min(popm(k).Position, UpperBound);

        popm(k).Cost=ObjectiveFunction(popm(k).Position);

    end

    % Create Merged Population

    popc=[popc

        popm]; %#ok

    split=round((nCrossover/2+nMutation)/2);

    males=popc(1:split);

    Mayfly=[Mayfly

        males]; %#ok

    males=popc(split+1:nCrossover/2+nMutation);

    Mayflyf=[Mayflyf

        males]; %#ok

    % SHORT

    % Non-Dominated Sorting

    [Mayfly, F]=ParetoSorting(Mayfly);

    Mayfly=CalcCD(Mayfly,F);

    [Mayfly, F]=SortSolutions(Mayfly);

    [Mayflyf, F]=ParetoSorting(Mayflyf);

    Mayflyf=CalcCD(Mayflyf,F);

    [Mayflyf, F]=SortSolutions(Mayflyf);

    Mayfly=Mayfly(1:nPop);

    Mayflyf=Mayflyf(1:nPopf);

    Pareto=[Pareto

        Mayfly

        Mayflyf]; %#ok

    all=Pareto;

    % Non-Dominated Sorting

    [Pareto, F]=ParetoSorting(Pareto);

    % Calculate Crowding Distance

    Pareto=CalcCD(Pareto,F);

    % Sort Population

    [Pareto, F]=SortSolutions(Pareto);

    % Store F1

    Pareto=Pareto(F{1});

    % Truncate

    if numel(Pareto)>nPareto

        Pareto=Pareto(1:nPareto);

    end

    % Show Iteration Information

    disp(['Iteration ' num2str(it) ': Number of Solution in repository = ' num2str(numel(Pareto))]);

    % Plot F1 Costs

    figure(1);

    PlotCosts(all,Pareto);

    %pause(0.01);

    g=g*gdamp;

    dance = dance*dance_damp;

    fl = fl*fl_damp;

end

%% Results

3 运行结果

【智能优化算法】基于蜉蝣算法求解多目标优化问题附matlab代码_调度问题_07

【智能优化算法】基于蜉蝣算法求解多目标优化问题附matlab代码_ide_08

编辑

4 参考文献

[1] Zervoudakis K ,  Tsafarakis S . A mayfly optimization algorithm[J]. Computers & Industrial Engineering, 2020, 145:106559.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。