Combine operators to be applied to individuals that conform to parameter set param.set
.
Parameters are the param.set
, and the names / types of params with the operator to use.
Parameter groups that use a single operator can be defined using .params.<groupname> = [character]
.
Say param.set
has three logical params 'l1', 'l2', 'l3' and two numeric params 'n1', 'n2'.
To use operatorA for 'l1' and 'l2', operatorB for 'l3', and operatorC for all numeric
params, call
combineOperator(param.set, .params.group1 = c("l1", "l2"), group1 = operatorA, l3 = operatorB, numeric = operatorC)
.
Use arguments by types, names of parameters, or group name. Valid types are 'numeric', 'logical', 'integer', 'discrete'. Operators given for groups or individual parameters supercede operators given for types.
Strategy parameters can be created by using .strategy.<groupname|parametername|type>
. They must be a function
taking a named list of parameter values (i.e. an individuum) as input and return a named list of parameter values
to be given to the respective group's / parameter's or type's operator. If, in the example above, operatorA
has
a parameter sigma
that should also be treated as a parameter under evolution (and in fact be equal to l3
), then
the above call would become
combineOperator(param.set, .params.group1 = c("l1", "l2"), group1 = operatorA, .strategy.group1 = function(x) list(sigma = x$l3), l3 = operatorB, numeric = operatorC)
.
If .binary.discrete.as.logical is TRUE, then binary discrete params are handled as logical params.
Operators for logical parameters must have only one argument. Operators for discrete parameters must have an additional argument 'values'. Operators for continuous or integer parameters must have an additional argument 'lower', 'upper'.
Use the ecr::setup function to set parameters for operators ("currying").
combine.operators(param.set, ..., .binary.discrete.as.logical = TRUE)
param.set |
|
---|---|
... | additional parameters. See description. |
.binary.discrete.as.logical |
|
ecr_operator
ecr operator.
library(mlrCPO) # Create parameter set ps <- pSS( logi: logical, disc: discrete[yes, no], discvec: discrete[letters]^3, numer: numeric[0, 10]) # Define mutators for groups of parameters combo.mut <- combine.operators(ps, .params.group1 = c("logi", "disc"), # define group for which same mutator is used group1 = ecr::setup(mutBitflip, p = 1), # set probability for mutation to 1 discrete = mutRandomChoice, # define operator for all other discrete parameters numer = mutGauss) # specific operator for parameter numer combo.mut(list(logi = FALSE, disc = "yes", discvec = c("a", "x", "y"), numer = 2.5))#> $logi #> [1] TRUE #> #> $disc #> [1] "no" #> #> $discvec #> [1] "a" "x" "y" #> #> $numer #> [1] 2.385461 #># Define mutator with strategy parameter combo.strategy <- combine.operators(ps, logical = ecr::setup(mutBitflip, p = 0), discrete = mutRandomChoice, numeric = mutGauss, .strategy.numeric = function(ind) { if (ind$disc == "yes") { return(list(p = 1L)) } else { return(list(p = 0L)) } }) combo.strategy(list(logi = FALSE, disc = "no", discvec = c("a", "x", "y"), numer = 2.5))#> $logi #> [1] FALSE #> #> $disc #> [1] "no" #> #> $discvec #> [1] "a" "x" "y" #> #> $numer #> [1] 2.5 #># Define recombinators for groups of parameters combo.rec <- combine.operators(ps, .params.group1 = c("logi", "disc"), # define group for which same mutator is used group1 = recPCrossover, discrete = recPCrossover, numer = recGaussian) combo.rec(list(list(logi = FALSE, disc = "no", discvec = c("a", "x", "y"), numer = 2.5), list(logi = TRUE, disc = "yes", discvec = c("c", "e", "g"), numer = 7.5)))#> [[1]] #> [[1]]$logi #> [1] FALSE #> #> [[1]]$disc #> [1] "no" #> #> [[1]]$discvec #> [1] "a" "x" "y" #> #> [[1]]$numer #> [1] 4.131664 #> #> #> [[2]] #> [[2]]$logi #> [1] TRUE #> #> [[2]]$disc #> [1] "yes" #> #> [[2]]$discvec #> [1] "c" "e" "g" #> #> [[2]]$numer #> [1] 6.709286 #> #> #> attr(,"multiple") #> [1] TRUE