Loop function for sequential multi-objective Bayesian Optimization. Normally used inside an OptimizerMbo. The conceptual counterpart to mlr_loop_functions_ego.
In each iteration after the initial design, the surrogate and acquisition function are updated and the next candidate is chosen based on optimizing the acquisition function.
Usage
bayesopt_emo(
instance,
surrogate,
acq_function,
acq_optimizer,
init_design_size = NULL,
random_interleave_iter = 0L
)
Arguments
- instance
(bbotk::OptimInstanceBatchMultiCrit)
The bbotk::OptimInstanceBatchMultiCrit to be optimized.- surrogate
(SurrogateLearnerCollection)
SurrogateLearnerCollection to be used as a surrogate.- acq_function
(AcqFunction)
AcqFunction to be used as acquisition function.- acq_optimizer
(AcqOptimizer)
AcqOptimizer to be used as acquisition function optimizer.- init_design_size
(
NULL
|integer(1)
)
Size of the initial design. IfNULL
and the bbotk::ArchiveBatch contains no evaluations,4 * d
is used withd
being the dimensionality of the search space. Points are generated via a Sobol sequence.- random_interleave_iter
(
integer(1)
)
Everyrandom_interleave_iter
iteration (starting after the initial design), a point is sampled uniformly at random and evaluated (instead of a model based proposal). For example, ifrandom_interleave_iter = 2
, random interleaving is performed in the second, fourth, sixth, ... iteration. Default is0
, i.e., no random interleaving is performed at all.
Note
The
acq_function$surrogate
, even if already populated, will always be overwritten by thesurrogate
.The
acq_optimizer$acq_function
, even if already populated, will always be overwritten byacq_function
.The
surrogate$archive
, even if already populated, will always be overwritten by the bbotk::ArchiveBatch of the bbotk::OptimInstanceBatchMultiCrit.
Examples
# \donttest{
if (requireNamespace("mlr3learners") &
requireNamespace("DiceKriging") &
requireNamespace("rgenoud")) {
library(bbotk)
library(paradox)
library(mlr3learners)
fun = function(xs) {
list(y1 = xs$x^2, y2 = (xs$x - 2) ^ 2)
}
domain = ps(x = p_dbl(lower = -10, upper = 10))
codomain = ps(y1 = p_dbl(tags = "minimize"), y2 = p_dbl(tags = "minimize"))
objective = ObjectiveRFun$new(fun = fun, domain = domain, codomain = codomain)
instance = OptimInstanceBatchMultiCrit$new(
objective = objective,
terminator = trm("evals", n_evals = 5))
surrogate = default_surrogate(instance)
acq_function = acqf("ehvi")
acq_optimizer = acqo(
optimizer = opt("random_search", batch_size = 100),
terminator = trm("evals", n_evals = 100))
optimizer = opt("mbo",
loop_function = bayesopt_emo,
surrogate = surrogate,
acq_function = acq_function,
acq_optimizer = acq_optimizer)
optimizer$optimize(instance)
}
#> x x_domain y1 y2
#> <num> <list> <num> <num>
#> 1: 0.7722247 <list[1]> 0.5963309 1.5074323
#> 2: 1.0853905 <list[1]> 1.1780725 0.8365106
# }