# Multi-Objective Bayesian Optimization via ParEGO

Source:`R/bayesopt_parego.R`

`mlr_loop_functions_parego.Rd`

Loop function for multi-objective Bayesian Optimization via ParEGO. Normally used inside an OptimizerMbo.

In each iteration after the initial design, the observed objective function values are normalized and `q`

candidates are
obtained by scalarizing these values via the augmented Tchebycheff function, updating the surrogate with respect to
these scalarized values and optimizing the acquisition function.

## Usage

```
bayesopt_parego(
instance,
surrogate,
acq_function,
acq_optimizer,
init_design_size = NULL,
q = 1L,
s = 100L,
rho = 0.05,
random_interleave_iter = 0L
)
```

## Arguments

- instance
(bbotk::OptimInstanceMultiCrit)

The bbotk::OptimInstanceMultiCrit to be optimized.- surrogate
(SurrogateLearner)

SurrogateLearner 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. If`NULL`

and the bbotk::Archive contains no evaluations,`4 * d`

is used with`d`

being the dimensionality of the search space. Points are generated via a Sobol sequence.- q
(

`integer(1)`

)

Batch size, i.e., the number of candidates to be obtained for a single batch. Default is`1`

.- s
(

`integer(1)`

)

\(s\) in Equation 1 in Knowles (2006). Determines the total number of possible random weight vectors. Default is`100`

.- rho
(

`numeric(1)`

)

\(\rho\) in Equation 2 in Knowles (2006) scaling the linear part of the augmented Tchebycheff function. Default is`0.05`

- random_interleave_iter
(

`integer(1)`

)

Every`random_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, if`random_interleave_iter = 2`

, random interleaving is performed in the second, fourth, sixth, ... iteration. Default is`0`

, i.e., no random interleaving is performed at all.

## Note

The

`acq_function$surrogate`

, even if already populated, will always be overwritten by the`surrogate`

.The

`acq_optimizer$acq_function`

, even if already populated, will always be overwritten by`acq_function`

.The

`surrogate$archive`

, even if already populated, will always be overwritten by the bbotk::Archive of the bbotk::OptimInstanceMultiCrit.The scalarizations of the objective function values are stored as the

`y_scal`

column in the bbotk::Archive of the bbotk::OptimInstanceMultiCrit.To make use of parallel evaluations in the case of `q > 1, the objective function of the bbotk::OptimInstanceMultiCrit must be implemented accordingly.

## References

Knowles, Joshua (2006). “ParEGO: A Hybrid Algorithm With On-Line Landscape Approximation for Expensive Multiobjective Optimization Problems.”

*IEEE Transactions on Evolutionary Computation*,**10**(1), 50--66.

## See also

Other Loop Function:
`loop_function`

,
`mlr_loop_functions_ego`

,
`mlr_loop_functions_emo`

,
`mlr_loop_functions_mpcl`

,
`mlr_loop_functions_smsego`

,
`mlr_loop_functions`

## 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 = OptimInstanceMultiCrit$new(
objective = objective,
terminator = trm("evals", n_evals = 5))
surrogate = default_surrogate(instance, n_learner = 1)
acq_function = acqf("ei")
acq_optimizer = acqo(
optimizer = opt("random_search", batch_size = 100),
terminator = trm("evals", n_evals = 100))
optimizer = opt("mbo",
loop_function = bayesopt_parego,
surrogate = surrogate,
acq_function = acq_function,
acq_optimizer = acq_optimizer)
optimizer$optimize(instance)
}
#> x x_domain y1 y2
#> 1: 1.958381 <list[1]> 3.835254 0.00173218
# }
```