Computes the hypervolume contribution of each point of a set of points with respect to a given reference point. The hypervolume contribution of point \(\vec{p} \in X\) is \(\text{hvc}(\vec{p}) = \text{hyp}(X) - \text{hyp}(X \setminus \{\vec{p}\})\). Dominated points have zero contribution but they may influence the contribution of other points. Duplicated points have zero contribution even if not dominated, because removing one of the duplicates does not change the hypervolume of the remaining set.
Arguments
- x
matrix()
|data.frame()
Matrix or data frame of numerical values, where each row gives the coordinates of a point.- reference
numeric()
Reference point as a vector of numerical values.- maximise
logical()
Whether the objectives must be maximised instead of minimised. Either a single logical value that applies to all objectives or a vector of logical values, with one value per objective.
Value
numeric()
A numerical vector
Details
The current implementation uses the \(O(n\log n)\) dimension-sweep algorithm for 2D and the naive algorithm that requires calculating the hypervolume \(|X|+1\) times for dimensions larger than 2.
For details about the hypervolume, see hypervolume()
.
References
Carlos M. Fonseca, Luís Paquete, Manuel López-Ibáñez (2006). “An improved dimension-sweep algorithm for the hypervolume indicator.” In Proceedings of the 2006 Congress on Evolutionary Computation (CEC 2006), 1157–1163. doi:10.1109/CEC.2006.1688440 .
Nicola Beume, Carlos M. Fonseca, Manuel López-Ibáñez, Luís Paquete, Jan Vahrenhold (2009). “On the complexity of computing the hypervolume indicator.” IEEE Transactions on Evolutionary Computation, 13(5), 1075–1082. doi:10.1109/TEVC.2009.2015575 .
Examples
x <- matrix(c(5,1, 1,5, 4,2, 4,4, 5,1), ncol=2, byrow=TRUE)
hv_contributions(x, reference=c(6,6))
#> [1] 0 3 2 0 0
# hvc[(5,1)] = 0 = duplicated
# hvc[(1,5)] = 3 = (4 - 1) * (6 - 5)
# hvc[(4,2)] = 2 = (5 - 4) * (4 - 2)
# hvc[(4,4)] = 0 = dominated
# hvc[(5,1)] = 0 = duplicated
data(SPEA2minstoptimeRichmond)
# The second objective must be maximized
# We calculate the hypervolume contribution of each point of the union of all sets.
hv_contributions(SPEA2minstoptimeRichmond[, 1:2], reference = c(250, 0),
maximise = c(FALSE, TRUE))
#> [1] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [8] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [15] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [22] 0.000 4.380 0.000 0.000 0.000 0.000 0.000
#> [29] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [36] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [43] 0.000 0.000 0.000 0.000 0.000 0.000 6397.052
#> [50] 1945.800 3386.197 0.000 0.000 0.000 0.000 0.000
#> [57] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [64] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [71] 26.255 0.000 0.000 0.000 0.000 0.000 0.000
#> [78] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [85] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [92] 0.000 15.840 0.000 0.000 0.066 0.000 0.000
#> [99] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [106] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [113] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [120] 0.000 3069.000 779.240 0.000 0.000 0.000 0.000
#> [127] 0.000 0.000 0.000 0.000 0.000 12428.431 0.000
#> [134] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [141] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [148] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
#> [155] 0.000 0.000 0.000 0.000 0.000 2294.064 0.000
#> [162] 0.000 0.000 0.000 0.000 0.000
# Duplicated points show zero contribution above, even if not
# dominated. However, filter_dominated removes all duplicates except
# one. Hence, there are more points below with nonzero contribution.
hv_contributions(filter_dominated(SPEA2minstoptimeRichmond[, 1:2], maximise = c(FALSE, TRUE)),
reference = c(250, 0), maximise = c(FALSE, TRUE))
#> [1] 89283.920 255278.978 8.197 2242.660 7959.940 1945.800
#> [7] 8147.132 73.054 26.255 3698.640 5.971 193143.324
#> [13] 3069.000 779.240 41994.755 2294.064