✨ 注意:本文使用Pymoo版本为0.6.0。
对于单目标优化算法,由于每次优化运行都会产生一个最优解,因此算法的性能比较相当简单。然而,在多目标优化算法中,每次运行都会返回一组非支配解集(non-dominated set of solutions)。为了比较多组解的性能1,Pymoo实现了以下常用的性能指标:
1、GD / IGD:给定一个Pareto前沿,这两个指标衡量了非支配集合(non-dominated set)与最优集(optimum)之间的偏差(deviation)。
2、GD+ / IGD+2:GD与IGD指标的变体,在该指标中,欧几里德距离被一个考虑支配关系的距离度量所替代,并实现了与弱Pareto的相容性。
3、Hypervolume:目标空间的支配部分(dominated portion)可用于衡量非支配解的质量。Hypervolume指标越大表示解的性能越好。并且由于实际应用中我们并不能得到Pareto前沿,而该指标只需要提供参考点而不是Pareto前沿,这也是这个指标的一大优点。
算法的性能衡量是算法设计的基础。通常情况下在多目标优化场景中,我们无法计算得到真实的全局最优的距离,有时候甚至不知道最优解集,此时我们需要使用其他技术实现。但是,本文的重点在于入门Pymoo的优化算法性能指标代码实现方法,所以下面以一个Pareto前沿已知的情况。
首先定义一个zdt1
问题,后面性能指标的实现都基于该问题:
import numpy as np
from pymoo.problems import get_problem
from pymoo.visualization.scatter import Scatter
# 得到zdt1问题的Pareto前沿
pf = get_problem("zdt1").pareto_front()
# 假设一个优化算法得到的非支配解集,从zdt1问题的Pareto前沿
# 中每隔10个抽一个,并乘以1.1
A = pf[::10] * 1.1
# 绘制结果
Scatter(legend=True).add(pf, label="Pareto Front").add(A, label="Non-Dominated Set Result").show()
代码执行结果如下图所示:
GD性能指标测量多目标优化算法求得最优解集到Pareto前沿的距离3。假设优化算法得到的目标向量集合为 A = { a 1 , a 2 , . . . , a ∣ A ∣ } A=\{a_1, a_2, ..., a_{|A|} \} A={a1,a2,...,a∣A∣},参考点集合(reference points set)也成为Pareto 前沿为 Z = { z 1 , z 2 , . . . , z ∣ Z ∣ } Z=\{z_1, z_2, ..., z_{|Z|} \} Z={z1,z2,...,z∣Z∣},此时GD可以表示为:
G D ( A ) = 1 ∣ A ∣ ( ∑ i = 1 ∣ A ∣ d i p ) 1 / p {\rm GD}(A) = \frac{1}{|A|} \bigg(\sum_{i=1}^{|A|}d_i^p \bigg)^{1/p} GD(A)=∣A∣1(i=1∑∣A∣dip)1/p
其中, d i d_i di为 a i a_i ai到参考点 Z Z Z(Pareto前沿)中距离最近点的Euclidean距离。其结果表示目标向量集合 A A A到Pareto前沿中最近点的平均距离。Pymoo的GD实现方法如下所示:
from pymoo.indicators.gd import GD
ind = GD(pf)
print("GD", ind(A))
代码执行结果如下图所示:
GD+的数学表达式如下所示:
G D + ( A ) = 1 ∣ A ∣ ( ∑ i = 1 ∣ A ∣ d i + 2 ) 1 / 2 {\rm GD}^+(A) = \frac{1}{|A|} \bigg(\sum_{i=1}^{|A|}d_i^{+^2} \bigg)^{1/2} GD+(A)=∣A∣1(i=1∑∣A∣di+2)1/2
其中, d i + = m a x { a i − z i , 0 } d_i^+=max\{a_i - z_i, 0 \} di+=max{ai−zi,0}为对应于 z i z_i zi的 a i a_i ai到参考点 Z Z Z(Pareto前沿)中距离最近点的修正距离,Pymoo的GD实现方法如下所示:
from pymoo.indicators.gd_plus import GDPlus
ind = GDPlus(pf)
print("GD+", ind(A))
代码执行结果如下图所示:
IGD性能指标表示GD的反向距离,即Pareto前沿 Z Z Z中的点到目标向量集合 A A A中距离最近点的GD距离,IGD的数学表达式如下所示:
I G D ( A ) = 1 ∣ Z ∣ ( ∑ i = 1 ∣ Z ∣ d ^ i p ) 1 / p {\rm IGD}(A) = \frac{1}{|Z|} \bigg(\sum_{i=1}^{|Z|}{\hat d_i}^p \bigg)^{1/p} IGD(A)=∣Z∣1(i=1∑∣Z∣d^ip)1/p
其中, d ^ i \hat d_i d^i为 z i z_i zi到目标向量集合 A A A中距离最近点的Euclidean距离,Pymoo的IGD实现方法如下所示:
from pymoo.indicators.igd import IGD
ind = IGD(pf)
print("IGD", ind(A))
代码执行结果如下图所示:
IGD+实现了IGD不具有的弱Pareto相容性,其数学表达式如下所示:
I G D + ( A ) = 1 ∣ Z ∣ ( ∑ i = 1 ∣ Z ∣ d i + 2 ) 1 / 2 {\rm IGD}^+(A) = \frac{1}{|Z|} \bigg(\sum_{i=1}^{|Z|}d_i^{+^2} \bigg)^{1/2} IGD+(A)=∣Z∣1(i=1∑∣Z∣di+2)1/2
其中, d i + = m a x { a i − z i , 0 } d_i^+=max\{a_i - z_i, 0 \} di+=max{ai−zi,0}为对应于 z i z_i zi的 a i a_i ai到参考点 Z Z Z(Pareto前沿)中距离最近点的修正距离,Pymoo的IGD+实现方法如下所示:
from pymoo.indicators.igd_plus import IGDPlus
ind = IGDPlus(pf)
print("IGD+", ind(A))
代码执行结果如下图所示:
上面四种优化算法性能指标都是需要知道一个目标集。然而对于Hypervolume性能指标,我们只需要提供一个参考点即可。Pymoo是基于DEAP实现Hypervolume指标的。它通过计算面积/体积,这些面积/体积主要由参考点的一组解决定。
上图是来自于文献4,它展示了一个带有两个目标的例子,其中灰色面积表示被一个点集支配的区域。相比较于其他指标,目标是最小化Pareto前沿的距离,而这里我们希望最大化性能指标,Pymoo中实现Hypervolume性能指标的代码如下所示:
from pymoo.indicators.hv import HV
ref_point = np.array([1.2, 1.2])
ind = HV(ref_point=ref_point)
print("HV", ind(A))
参考文献
Quality Evaluation of Solution Sets in Multiobjective Optimisation: A Survey ↩︎
Modified Distance Calculation in Generational Distance and Inverted Generational Distance ↩︎
David A. Van Veldhuizen and David A. Van Veldhuizen. Multiobjective evolutionary algorithms: classifications, analyses, and new innovations. Technical Report, Evolutionary Computation, 1999. ↩︎
Carlos M. Fonseca, Luís Paquete, and Manuel López-Ibáñez. An improved dimension sweep algorithm for the hypervolume indicator. In Proceedings of the 2006 Congress on Evolutionary Computation (CEC 2006), pages 1157–1163. IEEE Press, Piscataway, NJ, July 2006. doi:10.1109/CEC.2006.1688440. ↩︎