MOGWO 多目标灰狼优化算法(Matlab,Python)
由于灰狼优化算法( Grey Wolf Optimizer,GWO )的新颖性,目前还没有文献研究设计该算法的多目标版本。本文首次提出了多目标灰狼优化算法( Multi-Objective Grey Wolf Optimizer,MOGWO )来优化多目标问题。在GWO中集成一个固定大小的外部存档,用于保存和检索Pareto最优解。该档案被用来定义社会等级和模拟灰狼在多目标搜索空间中的狩猎行为。将所提方法在10个多目标基准问题上进行测试,并与两个著名的元启发式算法:基于分解的多目标进化算法( MOEA / D )和多目标粒子群算法( MOPSO )进行比较。定性和定量结果表明,所提出的算法能够提供非常有竞争力的结果,并优于其他算法。
主要创新
多目标演化算法文献表明,这些算法能够有效地逼近多目标问题的真实Pareto最优解。然而,这里有一个定理叫做No Free Lunch ( NFL ) ,它已经从理论上证明了不存在求解所有优化问题的优化技术。根据该定理,一个优化器在一类问题上的优越表现并不能保证在另一类问题上的类似表现。该定理是文献中许多工作的基础,并允许该领域的研究人员适应当前的技术来处理新的问题或提出新的优化算法。这也是本文工作的基础和动力,我们在最近提出的灰狼优化算法( GWO )的基础上,提出了一种新的多目标优化算法- -多目标灰狼优化算法( MOGWO )。本研究的贡献如下:
- 在GWO算法中集成了一个归档文件来维护非支配解;·
- 在GWO中集成了一个网格机制来改善归档文件中的非支配解;
- ·提出了一种基于alpha、beta和delta狼的领导者选择机制来更新和替换归档文件中的解;·
- 利用上述三种算子提出了GWO的多目标版本。
为了通过GWO进行多目标优化,我们集成了两个新的组件。所采用的组件与MOPSO 非常相似。第一个是档案集,它负责存储迄今为止获得的非支配Pareto最优解。第二个组件是领导者选择策略,辅助从档案集中选择alpha、beta和delta解决方案作为狩猎过程的领导者。
档案集
档案集是一个简单的存储单元,可以保存或检索到目前为止获得的非支配Pareto最优解。归档文件的关键模块是归档控制器,它在解决方案想要进入归档文件时或者归档文件满时控制归档文件。注意,存档有一个最大的成员数量。在迭代过程中,将迄今得到的非支配解与存档居民进行比较。可能有以下三种不同的情况:
- 新成员由至少一个档案集解支配。在这种情况下,不允许解进入档案集。
- 新解在档案集中支配一个或多个解。在这种情况下,应该移除档案集中被支配的解,新的解将能够进入档案集。
- 如果新的解和存档成员都非支配,则应该将新的解添加到档案集中。
- 如果存档已满,则应该首先运行网格机制来重新安排目标空间的分割,并找到最拥挤的片段来移除其一个解。然后,为了提高最终近似Pareto最优前沿的多样性,需要将新解插入到最不拥挤的部分。
删除一个解的概率与超立方体(线段)中解的个数成正比增加。如果存档文件已满,则首先选择最拥挤的片段,并从其中一个片段中随机省略一个解决方案,以便为新的解决方案提供空间。有一种特殊情况,即在超立方体外部插入一个解。在这种情况下,为了覆盖新解,对所有片段进行扩展。因此,其他解的分段也可以改变。
领导者选择机制
第二个组成部分是领导者选择机制。在GWO中,迄今为止获得的三个最佳解决方案被用作alpha、beta和delta狼。这些领导者指导其他搜索代理向搜索空间的有希望的区域搜索,希望找到一个接近全局最优的解。然而,在多目标搜索空间中,由于前文讨论的帕累托最优概念,解的比较并不容易。领导者选择机制就是为了处理这个问题而设计的。如前所述,有一个迄今为止得到的最佳非支配解的存档。领导者选择部分选择搜索空间中最不拥挤的部分,并提供其非支配解之一为alpha、beta或delta狼。对于每个超立方体,通过轮盘赌法以如下概率进行选择:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0BayXfk-1691845826444)(attachments/DT6IRNV5.png)]
其中c是大于1的常数,N是在第i段得到的Pareto最优解的个数.
从上式中可以看出。即拥挤度较小的超立方体有更高的概率推荐新的领导者.当超立方体中获得的解的数量减少时,选择超立方体来选择领导者的概率增加。需要注意的是,由于我们必须选择三个领导者,因此可能存在一些特殊情况。如果在最不拥挤的片段中有三个解,将其中三个随机分配到alpha、beta和delta解。如果最小拥挤超立方体中少于三个解,那么第二个最小拥挤超立方体也可以从中选择其他领导者。如果第二个最小拥挤超立方体有一个解,这种情况是相同的,所以应该从第三个最小拥挤超立方体中选择delta领导者。通过这种方法,我们可以防止MOGWO为alpha、beta或delta挑选相似的领导者。因此,搜索总是朝向搜索空间的未探索/未暴露区域,因为如果在最不拥挤的超立方体中没有足够数量的领导者(小于3),则领导者选择机制偏向于最不拥挤的超立方体,并提供来自不同片段的领导者。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q0QEylDK-1691845826447)(attachments/MA77QALX.png)]
未来方向
在未来的研究中,我们计划研究所提出的算法在计算流体力学( CFD )问题中的应用。此外,我们将研究不同的鲁棒处理方法对MOGWO的有效性,使其能够处理不同类型的不确定性,这对于解决实际问题是必不可少的。提出一个多目标版本的MOGWO也将是一个有价值的贡献。
参考文献
Mirjalili, Seyedali, Shahrzad Saremi, Seyed Mohammad Mirjalili和Leandro Dos S. Coelho. 《Multi-Objective Grey Wolf Optimizer: A Novel Algorithm for Multi-Criterion Optimization》. Expert Systems with Applications 47 (2016年4月): 106–19. https://doi.org/10.1016/j.eswa.2015.10.039.
源代码
clear all
clc
drawing_flag = 1;
TestProblem='UF3';
nVar=10;
fobj = cec09(TestProblem);
xrange = xboundary(TestProblem, nVar);
% Lower bound and upper bound
lb=xrange(:,1)';
ub=xrange(:,2)';
VarSize=[1 nVar];
GreyWolves_num=100;
MaxIt=1000; % Maximum Number of Iterations
Archive_size=100; % Repository Size
alpha=0.1; % Grid Inflation Parameter
nGrid=10; % Number of Grids per each Dimension
beta=4; %=4; % Leader Selection Pressure Parameter
gamma=2; % Extra (to be deleted) Repository Member Selection Pressure
% Initialization
GreyWolves=CreateEmptyParticle(GreyWolves_num);
for i=1:GreyWolves_num
GreyWolves(i).Velocity=0;
GreyWolves(i).Position=zeros(1,nVar);
for j=1:nVar
GreyWolves(i).Position(1,j)=unifrnd(lb(j),ub(j),1);
end
GreyWolves(i).Cost=fobj(GreyWolves(i).Position')';
GreyWolves(i).Best.Position=GreyWolves(i).Position;
GreyWolves(i).Best.Cost=GreyWolves(i).Cost;
end
GreyWolves=DetermineDomination(GreyWolves);
Archive=GetNonDominatedParticles(GreyWolves);
Archive_costs=GetCosts(Archive);
G=CreateHypercubes(Archive_costs,nGrid,alpha);
for i=1:numel(Archive)
[Archive(i).GridIndex Archive(i).GridSubIndex]=GetGridIndex(Archive(i),G);
end
% MOGWO main loop
for it=1:MaxIt
a=2-it*((2)/MaxIt);
for i=1:GreyWolves_num
clear rep2
clear rep3
% Choose the alpha, beta, and delta grey wolves
Delta=SelectLeader(Archive,beta);
Beta=SelectLeader(Archive,beta);
Alpha=SelectLeader(Archive,beta);
% If there are less than three solutions in the least crowded
% hypercube, the second least crowded hypercube is also found
% to choose other leaders from.
if size(Archive,1)>1
counter=0;
for newi=1:size(Archive,1)
if sum(Delta.Position~=Archive(newi).Position)~=0
counter=counter+1;
rep2(counter,1)=Archive(newi);
end
end
Beta=SelectLeader(rep2,beta);
end
% This scenario is the same if the second least crowded hypercube
% has one solution, so the delta leader should be chosen from the
% third least crowded hypercube.
if size(Archive,1)>2
counter=0;
for newi=1:size(rep2, 1)
if sum(Beta.Position ~= rep2(newi).Position)~=0
counter=counter + 1;
rep3(counter, 1)=rep2(newi);
end
end
Alpha=SelectLeader(rep3, beta);
end
% Eq.(3.4) in the paper
c=2.*rand(1, nVar);
% Eq.(3.1) in the paper
D=abs(c.*Delta.Position-GreyWolves(i).Position);
% Eq.(3.3) in the paper
A=2.*a.*rand(1, nVar)-a;
% Eq.(3.8) in the paper
X1=Delta.Position-A.*abs(D);
% Eq.(3.4) in the paper
c=2.*rand(1, nVar);
% Eq.(3.1) in the paper
D=abs(c.*Beta.Position-GreyWolves(i).Position);
% Eq.(3.3) in the paper
A=2.*a.*rand()-a;
% Eq.(3.9) in the paper
X2=Beta.Position-A.*abs(D);
% Eq.(3.4) in the paper
c=2.*rand(1, nVar);
% Eq.(3.1) in the paper
D=abs(c.*Alpha.Position-GreyWolves(i).Position);
% Eq.(3.3) in the paper
A=2.*a.*rand()-a;
% Eq.(3.10) in the paper
X3=Alpha.Position-A.*abs(D);
% Eq.(3.11) in the paper
GreyWolves(i).Position=(X1+X2+X3)./3;
% Boundary checking
GreyWolves(i).Position = min(max(GreyWolves(i).Position,lb),ub);
GreyWolves(i).Cost = fobj(GreyWolves(i).Position')';
end
GreyWolves=DetermineDomination(GreyWolves);
non_dominated_wolves=GetNonDominatedParticles(GreyWolves);
Archive=[Archive
non_dominated_wolves];
Archive=DetermineDomination(Archive);
Archive=GetNonDominatedParticles(Archive);
for i=1:numel(Archive)
[Archive(i).GridIndex Archive(i).GridSubIndex]=GetGridIndex(Archive(i),G);
end
if numel(Archive)>Archive_size
EXTRA=numel(Archive)-Archive_size;
Archive=DeleteFromRep(Archive,EXTRA,gamma);
Archive_costs=GetCosts(Archive);
G=CreateHypercubes(Archive_costs,nGrid,alpha);
end
disp(['In iteration ' num2str(it) ': Number of solutions in the archive = ' num2str(numel(Archive))]);
save results
% Results
costs=GetCosts(GreyWolves);
Archive_costs=GetCosts(Archive);
if drawing_flag==1
hold off
plot(costs(1, :), costs(2, :), 'k.');
hold on
plot(Archive_costs(1,:), Archive_costs(2,:), 'rd');
legend('Grey wolves','Non-dominated solutions');
drawnow
end
end
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a7e2f9447e825f0e91eddea3ab89c5aa.png#pic_center)