论文题目:A Steady-State and Generational Evolutionary Algorithm for Dynamic Multiobjective Optimization
一种用于动态多目标优化的稳态和世代进化算法(Shouyong Jiang and Shengxiang Yang, Senior Member, IEEE)IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION, VOL. 21, NO. 1, FEBRUARY 2017
刚开始学习多目标优化算法,不作商业用途,如果有不正确的地方请指正!
个人总结:
这是platemo上唯二的多目标动态优化算法
摘要
- 该文提出了一种新的算法,即稳态和世代进化算法,该算法结合了稳态算法的快速稳定跟踪能力和世代算法良好的多样性保持能力,用于处理动态多目标优化.
引言
多样性
一般来说,种群多样性可以通过以下方法处理:使用选定的旧解的突变来增加多样性,或者在检测到环境变化时随机生成一些新解,在整个优化过程中保持多样性,或采用多种群方案。适当的多样性有助于探索有前途的搜索区域,但过多的多样性可能会导致进化停滞。
本文提出的想法
SGEA充分利用了动态环境中稳态EA的优势,用于环境变化检测和响应。如果检测到变化,SGEA 会重用具有良好多样性的旧解决方案的一部分,并利用从以前环境和新环境中收集的信息来重新定位其不断发展的人口的一部分。在每一代的末尾,就像传统的世代EA一样,SGEA进行环境选择,为下一代保留良好的个体。通过混合稳态和世代方式,SGEA可以在发生变化时快速适应动态环境,为DMOP提供非常有前途的跟踪能力。
SGEA
算法伪代码框架如下:
A.环境选择策略
B.交叉变异
SGEA采用模拟二元交叉 和多项式变异的方法.
可以从亲本种群P或档案种群A中选择交配亲本
从P中选择交配亲本可以保持良好的种群多样性,但从A中选择亲本可以显著提高种群的收敛速度,这在快速变化的环境中是相当可取的。
如果要从 P 中选择交配亲本,SGEA 会根据个人的体能值进行二元锦标赛选择。如果没有,则可以从存档群体 A 中随机选择交配亲本。
C.种群更新
都是EA算法的经典步骤
对 P 的更新操作是用新生成的解 y 替换 P 的最差解,而对 A 的更新是使用 y 来更新存档的非支配集。
D.动态处理
1.变化检测
变化检测可以通过重新评估一部分现有的解决方案或者评估一些选定的种群成员的一些统计信息来进行
缺点:如果产生变化的是没有选择到的解决方案或者种群成员就会没有办法对变化进行相应;如果选择的方案过多则会消耗大量时间!
作者提出
以稳态的方式检测变化,如算法1的第7行所示。在每一代中,对种群成员(在随机序中)逐一检查其先前目标值与重新评估的目标值之间的差异。如果在一个种群成员中存在差异,我们假设一个变化被成功检测,并且没有必要对其他种群成员做进一步检查。当检测到变化时,SGEA立即以稳态的方式对其做出反应。该检测方法以较高的计算成本为代价,有利于快速、稳定的变化反应。为了提高效率,重新评估用于变化检测的个体数量被限制在种群规模的小百分比范围内,值得注意的是,基于再评价的变化检测方法假设函数评价中不存在噪声,即不具有鲁棒性。因此,所提出的方法可能不适用于检测噪声环境中的变化
2.响应策略
新环境的种群由一半旧解和一半重新初始化的解组成。半个旧解是通过最远优先选择方法来选择的,该方法最初是为了将近似集缩小到最大允许大小。
新种群中的另一半重新初始化的解是通过猜测改变后的POS的新位置产生的(老方法质心加步长)
利用最远第一次选择预选的旧解集R的一半来计算移动方向
具体代码
methods
function main(Algorithm,Problem)
%% 初始化种群
Population = Problem.Initialization();
% 对种群进行环境选择得到P,非支配解集A,适应度值,这个length(Pop)是不是就是Problem.N
[Population,Archive,Fitness] = EnvironmentalSelection(Population,length(Population));
% 计算出非支配解的质心
Centroid = mean(Archive.decs,1);
% Reset the number of saved populations (only for dynamic optimization)
% 重置保存的种群数量
Algorithm.save = sign(Algorithm.save)*inf;
% 保存在变化前的所有种群 主要用来结果展示
AllPop = [];
%% 判断种群是否到达终止条件
while Algorithm.NotTerminated(Population)
% 还是和DNSGA-2一样对10%个体进行判断
if Changed(Problem,Population)
% 保存下变化前的种群
AllPop = [AllPop,Population];
% 如果变化了就采取动态响应策略
[Population,Archive,Centroid] = ChangeResponse(Problem,Population,Archive,Centroid);
Fitness = CalFitness(Population.objs);
end
Elitists = Population;
% 对种群进行交叉变异产生后代
for i = 1 : Problem.N
% 一种策略根据适应度从P中选择两个进行交叉变异
if rand < 0.5
MatingPool = TournamentSelection(2,2,Fitness);
Offspring = OperatorGAhalf(Problem,Population(MatingPool));
% 从父代选一个,再从非支配解里随机选一个进行交叉变异
else
MatingPool = TournamentSelection(2,1,Fitness);
SubPop = Archive(randi(end));
Offspring = OperatorGAhalf(Problem,[Population(MatingPool),SubPop]);
end
% 交叉完以后更新
[Population,Archive,Fitness] = EnvironmentalSelection([Population,Offspring],Problem.N);
end
% 新旧个体再进行一次更新(有什么作用?)
[Population,Archive,Fitness] = EnvironmentalSelection([Population,Elitists],Problem.N);
% 在问题计算的最后一次展示所有的变化保存下来的解(动态算法最后展示)
if Problem.FE >= Problem.maxFE
Population = [AllPop,Population];
[~,rank] = sort(Population.adds(zeros(length(Population),1)));
Population = Population(rank);
end
end
end
end
function [Population,Archive,Fitness] = EnvironmentalSelection(Population,N)
%% 对每个目标计算适应度值
Fitness = CalFitness(Population.objs);
%% 环境选择部分
% 适应度为0的作为非支配解保存在A中
Next = Fitness < 1;
Archive = Population(Next);
% 如果A中个数小于N 保存最优的N个个体
if sum(Next) < N
[~,Rank] = sort(Fitness);
Next(Rank(1:N)) = true;
% 如果A中个数大于N,保留N个最优秀的个体 通过一个截断算法选择多样性好的
elseif sum(Next) > N
Del = Truncation(Population(Next).objs,sum(Next)-N);
Temp = find(Next);
Next(Temp(Del)) = false;
Archive = Population(Next);
end
% 更新种群和适应度值
Population = Population(Next);
Fitness = Fitness(Next);
end
function Del = Truncation(PopObj,K)
% Select part of the solutions by truncation
%% 截断算法
% 计算两个点之间的欧式距离
Distance = pdist2(PopObj,PopObj);
% 个体与自身距离无限大
Distance(logical(eye(length(Distance)))) = inf;
% 初始化del矩阵 每个值为false 意思为需要被删除
Del = false(1,size(PopObj,1));
while sum(Del) < K
Remain = find(~Del);
Temp = sort(Distance(Remain,Remain),2);
[~,Rank] = sortrows(Temp);
% 找到距离最远的个体并删除
Del(Remain(Rank(1))) = true;
end
end
function [Population,Archive,Centroid] = ChangeResponse(Problem,Population,Archive,Centroid)
%% Select old solutions
% 找到最远的一半个体
remain = ~Truncation(Population.objs,ceil(length(Population)/2));
Population(remain) = Problem.Evaluation(Population(remain).decs);
% 计算A中的平均解和质心与存档中解的距离
Ct = mean(Archive.decs,1);
St = norm(Ct-Centroid);
%% Generate new solutions
Archive = Population(remain).best;
% 旧解中的支配解的平均距离
CA = mean(Archive.decs,1);
% 旧解中的平均距离
CR = mean(Population(remain).decs,1);
X = Population(~remain).decs;
% 新解是通过CACR计算出移动方向,加上一点随机噪声
X = X + repmat(St.*(CA-CR)./norm(CA-CR),size(X,1),1) + randn(size(X)).*St/2/sqrt(size(X,2));
Population(~remain) = Problem.Evaluation(X);
Archive = Population.best;
Centroid = Ct;
end
function Del = Truncation(PopObj,K)
% Select part of the solutions by truncation
%% Truncation
Distance = pdist2(PopObj,PopObj);
Distance(logical(eye(length(Distance)))) = inf;
Del = false(1,size(PopObj,1));
while sum(Del) < K
Remain = find(~Del);
Temp = sort(Distance(Remain,Remain),2);
[~,Rank] = sortrows(Temp);
Del(Remain(Rank(1))) = true;
end
end