1 内容介绍
本文介绍了一种称为 Mayfly 算法 (MA) 的新方法来解决优化问题。 受蜉蝣飞行行为和交配过程的启发,该算法结合了群体智能和进化算法的主要优点。为了评估所提出算法的性能,使用了 38 个数学基准函数,包括 13 个 CEC2017 测试函数,并将结果与七种最先进的著名元启发式优化方法的结果进行了比较。 MA 的性能也通过多目标优化中的收敛行为以及使用现实世界的离散流水车间调度问题进行评估。 比较结果证明了所提方法在收敛速度和收敛速度方面的优越性。 婚舞和随机飞行的过程增强了算法探索性和利用性之间的平衡,帮助算法摆脱了局部最优。
编辑
编辑
编辑
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 运行结果
编辑
4 参考文献
[1] Zervoudakis K , Tsafarakis S . A mayfly optimization algorithm[J]. Computers & Industrial Engineering, 2020, 145:106559.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。