参考文献
IGD Indicator-Based Evolutionary Algorithm for Many-Objective Optimization Problems
Yanan Sun, Member, IEEE, Gary G. Yen , Fellow, IEEE, and Zhang Yi, Fellow, IEEE
1. 创新点
- 一种基于分解的nadir point评估方法
- 一种新的非支配比较策略:个体和参考点之间比较
- 3种近似距离分配方案
- 基于新的非支配比较策略和3种新的近似距离分配方案改进了环境选择和交叉选择机制。
2. DNPE
-
公式:
-
好处:不用每次都进行非支配排序,挑选出PF的边界点,可以让算法更节约计算成本。
-
目的:找到乌托邦PF,使之能够准确的用于计算IGD指标
3. 算法框架
3.1 产生均匀的参考点
-
先根据DNPE找到每个维度的nadir point和ideal point
-
再使用MOEA/D中的分参考方向的方式产生一系列参考点集,其中这些参考点的每个维度的和都为1
-
最后,根据由DNPE得出的nadir point和ideal point将参考点集转换为乌托邦PF,记为p*,这个乌托邦PF将用于IGD的计算
-
伪代码:
3.2 分配rank值
-
大多数文章中的支配比较都是在个体和个体之间的,而本文中提出的一个新的支配关系比较策略是:个体和参考点之间进行支配比较
-
共有3种rank值:
-
r1
:如果某个个体a至少支配一个p*中的参考点,则个体a的rank值为1 -
r2
:如果某个个体a和p*中所有的个体都互不支配,则个体a的rank值为2 -
r3
:若果某个个体a- 被p*中的所有参考点所支配;
- 或被p*中一部分参考点支配,与另一部分参考点互不支配
则,a的ran值为3
-
-
好处:
- 在连续的情况下(前提),根据算法结束时得到的PS,我们可以根据PS中的个体的rank值来推断真实PF的形状。如果PS中所有的个体的rank值为r1,则PF的形状为凹的;如果为r2,PF的形状为超平面;如果为r3,则PF的形状为凸的
- 根据rank值,我们可以粗略的估计出rank值为1的个体很可能是支配rank值为2和3的个体的,至少可以保证rank值越小的个体,是有较好的收敛性的。因此,可以将rank值作为环境选择和交叉选择中的第一个选择标准。(rank值这样分配的潜在缺点:不能保持传统的Pareto支配关系,因为rank值为1的个体,有可能不支配rank值为2的个体)
- 可以根据3种rank值,设计不同的近似距离
3.3 近似距离的分配
-
rank值为1的个体:个体到参考点的欧式距离的负数(统一标准,都是选择有较小的距离的个体是有较好收敛性的个体)
-
rank值为2的个体:即图2中的d+。即IGD+指标
- rank值为3的个体:正欧式距离
3.4 产生后代
- 如何选择父代进入交叉池?
- 首先,随机选择两个个体,比较rank值,较小者进入交叉池
- 若rank值相同,则比较近似距离,较小者进入交叉池
- 如果近似距离还一样,随机选择一个
- 在一个大的搜索空间中(高维空间)怎么确保产生一个有希望的后代?
- 限制性的交叉方法:在邻居中交叉、变异产生后代
- SBX:使用一个大的分布索引值的模拟二进制交叉(本文采用)
3.5 环境选择
-
先选r1层,再选r2层,最后选r3层
-
如果所选取的最后一层的数量与前几层的数量相加大于N,则需要从最后一层中均匀的选取
-
假设需要从最后一层中选A个个体
-
均匀的选取参考点A个参考点
%% Select K points from W Distance = pdist2(W,W); % 计算参考点之间的欧式距离 Distance(logical(eye(length(Distance)))) = inf; % 将自己到自己的距离设置为inf Del = false(1,size(W,1)); % 初始化删除的矩阵,此时Del矩阵中全是逻辑false while sum(~Del) > K % 如果没有被删除的参考点的数量大于要选择的数量K,进入循环 Remain = find(~Del); % 找到剩余的参考点 Temp = sort(Distance(Remain,Remain),2); % 按照欧氏距离排序 [~,Rank] = sortrows(Temp); % 按行排序, Del(Remain(Rank(1))) = true; % 将要删除的参考点设置为true end Dis = Dis(:,~Del); % 取反
-
然后选取距离每个参考点最近的个体(这些个体是最后一层中的个体),共A个,以准确的填满下一代种群
%% Greedy algorithm based selection (more efficient) Choose = false(1,size(Dis,1)); % 初始化 size(Dis,1) ===> 个体数量 for i = 1 : size(Dis,2) % (Dis,2) ===> 参考点数量 remain = find(~Choose); % 找到剩余的参考点的索引值 [~,best] = min(Dis(remain,i)); % 找到到第i个参考点的距离最小的个体的索引值 Choose(remain(best)) = true; % 将这个被选中的个体移除 end
-