Scalor
that returns a the number of (weakly, epsilon-) dominated or dominating individuals for each individuum.
output
:: character(1)
What to count: individuals that are being dominated by the point under consideration("count_dominated"
),
or individuals that do not dominate the point under consideration ("count_not_dominating"
).
In both cases, a larger output means the individual is "better", in some way, according to the fitness values.
Initialized with "count_not_dominating"
.
epsilon
:: numeric
Epsilon-value for non-dominance, as used by rank_nondominated
. Initialized to 0
.
jitter
:: logical(1)
Whether to add random jitter to points, with magnitude sqrt(.Machine$double.eps)
relative to fitness values.
This is used to effectively break ties.
scale_output
:: logical(1)
Whether to scale output by the total numberof individuals, giving output between 0
and 1
(inclusive) when TRUE
or integer outputs ranging from 0 and nrow(fitnesses)
(inclusive) when FALSE
. Initialized to TRUE
.
This Scalor
can be created with the short access form scl()
(scls()
to get a list), or through the the dictionary
dict_scalors
in the following way:
miesmuschel::MiesOperator
-> miesmuschel::Scalor
-> ScalorDomcount
p = ps(x = p_dbl(-5, 5))
data = data.frame(x = rep(0, 5))
sd = scl("domcount")
sd$prime(p)
(fitnesses = matrix(c(1, 5, 2, 3, 0, 3, 1, 0, 10, 8), ncol = 2))
#> [,1] [,2]
#> [1,] 1 3
#> [2,] 5 1
#> [3,] 2 0
#> [4,] 3 10
#> [5,] 0 8
# to see the fitness matrix, use:
## plot(fitnesses, pch = as.character(1:5))
# note that for both 2 and 4, all points do not dominate them
# their value is therefore 1
sd$operate(data, fitnesses)
#> [1] 0.8 1.0 0.6 1.0 0.8
sd$param_set$values$scale_output = FALSE
sd$operate(data, fitnesses)
#> [1] 4 5 3 5 4
sd$param_set$values$output = "count_dominated"
# point 4 dominates three other points, point 2 only one other point.
sd$operate(data, fitnesses)
#> [1] 0 1 0 3 0