Get fitness values in the correct form as used by Selector operators from an
OptimInstance.
This works for both single-criterion and multi-criterion optimization, and entails multiplying
objectives with -1 if they are being minimized, since Selector tries to maximize fitness.
mies_get_fitnesses(inst, rows)(OptimInstance)
Optimization instance to evaluate.
optional (integer)
Indices of rows within inst to consider. If this is not given, then the entire archive is used.
numeric
matrix with length(rows) (if rows is given, otherwise nrow(inst$archive$data)) rows
and one column for each objective: fitnesses to be maximized.
Other mies building blocks:
mies_evaluate_offspring(),
mies_generate_offspring(),
mies_init_population(),
mies_select_from_archive(),
mies_step_fidelity(),
mies_survival_comma(),
mies_survival_plus()
set.seed(1)
library("bbotk")
lgr::threshold("warn")
# Define the objective to optimize
objective <- ObjectiveRFun$new(
fun = function(xs) {
z <- exp(-xs$x^2 - xs$y^2) + 2 * exp(-(2 - xs$x)^2 - (2 - xs$y)^2)
list(Obj = z)
},
domain = ps(x = p_dbl(-2, 4), y = p_dbl(-2, 4)),
codomain = ps(Obj = p_dbl(tags = "maximize"))
)
# Get a new OptimInstance
oi <- OptimInstanceSingleCrit$new(objective,
terminator = trm("evals", n_evals = 100)
)
mies_init_population(inst = oi, mu = 3)
oi$archive
#> <Archive>
#> x y dob eol x_id Obj timestamp batch_nr
#> <num> <num> <num> <num> <num> <num> <POSc> <int>
#> 1: -0.41 3.45 1 NA 1 0.00075 2024-05-13 04:41:07 1
#> 2: 0.23 -0.79 1 NA 2 0.50760 2024-05-13 04:41:07 1
#> 3: 1.44 3.39 1 NA 3 0.21083 2024-05-13 04:41:07 1
mies_get_fitnesses(oi, c(2, 3))
#> Obj
#> [1,] 0.5076046
#> [2,] 0.2108264
###
# Multi-objective, and automatic maximization:
objective2 <- ObjectiveRFun$new(
fun = function(xs) list(Obj1 = xs$x^2, Obj2 = -xs$y^2),
domain = ps(x = p_dbl(-2, 4), y = p_dbl(-2, 4)),
codomain = ps(
Obj1 = p_dbl(tags = "minimize"),
Obj2 = p_dbl(tags = "maximize")
)
)
# Using MultiCrit!
oi <- OptimInstanceMultiCrit$new(objective2,
terminator = trm("evals", n_evals = 100)
)
mies_init_population(inst = oi, mu = 3)
oi$archive
#> <Archive>
#> x y dob eol x_id Obj1 Obj2 timestamp batch_nr
#> <num> <num> <num> <num> <num> <num> <num> <POSc> <int>
#> 1: 3.7 -1.63 1 NA 1 13.5 -2.65 2024-05-13 04:41:07 1
#> 2: 2.0 -0.76 1 NA 2 3.9 -0.58 2024-05-13 04:41:07 1
#> 3: 1.8 -0.94 1 NA 3 3.1 -0.88 2024-05-13 04:41:07 1
# Note Obj1 has a different sign than in the archive.
mies_get_fitnesses(oi, c(2, 3))
#> Obj1 Obj2
#> [1,] -3.860387 -0.5839291
#> [2,] -3.149504 -0.8848403