IGD反转世代距离-多目标优化评价指标概念及实现
IGD反转世代距离-多目标优化评价指标概念及实现
觉得有用的话,欢迎一起讨论相互学习~
参考资料
多目标进化优化[1]-郑金华老师,邹娟老师著
实验室人手一本人人必看的宝藏图书!
- IGD(Inverted Generational Distance)是常用的可以同时评价算法收敛性和多样性的指标,中文名反转世代距离。
从GD到IGD
-
先被提出的用于评价多目标算法收敛性的指标是GD(Generational Distance),用来表示\(PF_{known}\)与\(PF_{true}\)之间的间隔距离,计算式被定义为:
\[GD=\frac{(\sum^{n}_{i=1}d^p_i)^{1/p}}{n} \]
其中n表示\(PF_{known}\)中点的个数,p表示目标维数,\(d_{i}\)表示目标空间中得到的 每个点 \(PF_{known}\) 距离 \(PF_{true}\) 参考点(类似于答案)的最近欧式距离的平均值 。若此值为0,则表示 \(PF_{known} == PF_{true}\).
-
欧式距离的平面版本初中我们就学过^ _ ^
-
举个[1]中二维目标的例子
计算可得:
\[d_1=\sqrt[2]{(2.5-2)^2+(9-8)^2}
\]
\[d_1=\sqrt[2]{(3-3)^2+(6-6)^2}
\]
\[d_1=\sqrt[2]{(5-4)^2+(4-4)^2}
\]
-
因此,\(PF_{known}\) 和 \(PF_{true}\) 之间的间隔距离为 $$GD=\sqrt[2]{1.1182+02+1^2}/3=0.5$$
-
值得一提的是,某种意义上可以这样认为: GD是从自己得到的每个点指向最近的真实前沿上的点的欧式距离的平均 。
IGD
- 可以发现,GD的方式只能够评价算法的收敛性 。为了同时评价算法的 收敛性和多样性 ,IGD被提出了。区别在于 IGD是从真实帕累托前沿上的参考点射向算法的得到的解,即是从\(PF_{true}\) 射向 \(PF_{known}\) 的 ,因此被称为 反向世代距离 。
- 思路是:从真实帕累托前沿上均匀取点,对于 真实前沿上的每个点找到已知帕累托前沿上距离最近的点 ,将这些点之间距离相加并取平均。和GD略微不同的是没有开方的操作!只用取平均就行,分母是从真实前沿上取点的个数。
-
\[IGD=\frac{\sum^{n}_{i=1}|d_i|}{n} \]
其中n表示\(PF_{true}\)中点的个数,\(d_{i}\)表示目标空间中 真实前沿的每个点距已知前沿的最近欧式距离 。此值越小,意味着算法的综合性能越好。
关于IGD的解释
- 由于两点间的距离是可逆的,A->B的距离和B->A的距离相等,那么真实前沿上点到已知前沿的最小值必定包含了,已知前沿到真实前沿的最小值(IGD),假设真实前沿上的点比已知前沿的点多 这种观点是错的,因为边是有向的,从一个顶点出发只能连接一另一端的点,而不能同时连接两个终点。 GD和IGD并不是从所有边集合中挑选出其中距离最短的边,而是从指定顶点出发的距离最短的有向边!
- 例如,显然A-D和A-B是最短的两条边。计算GD时,遍历PFknown,会选择A->D,然后到B,B会选择B->D。计算IGD时,遍历PFtrue,C会选C->A,即使A->D更短,但是对于C而言并不会考虑A的感受,D会选择D->B,即时D->A也很短,但是D只能做出最好的选择,很明显D->B比D->A更好。而为了避免同一个点指向两个端点,即取最小的距离,使用循环的方法。在找到最近点后就会跳过该点进入下一个点的查找最近距离的步骤
- 也直接引用郑金华老师书[1]中的例子进行介绍。
- 为什么选择从PFtrue出发放出射线呢?还是因为PFtrue是分布均匀的答案,从PFtrue出发才能让一个PFknown不仅仅是 靠向PFtrue还要分布均匀 ,因此PF true中采样点的数目十分重要,采样点越多,分布越均匀结果才越精确可靠 。
IGD实现
matlab
IGD = 0;% 初始化IGD为0
for i = 1:51 % 遍历PFtrue中的所有电
% data中保存的是真实PF
% data(i,1)表示第i行的第1列数
% 得到一个单元格中数值是data(i,)形状是(pop2,1)的长条状列向量
c1 = data(i,1)*ones(pop2,1);% 第一个目标的目标值
c2 = data(i,2)*ones(pop2,1);% 第二个目标的目标值
%对于一个参考点,使用所有实际点在两个目标上对应项相减后分别在两个目标上平方
% sum(,2)按行相加
% min 取最小的距离开方
IGD = IGD + sqrt(min(sum((T2_data-[c1 c2]).^2,2)));
end
% 对PFtrue上所有点取平均
store(2,generation)=IGD/51;