Simple interface to the C-implementation of the Omni-optimizer by Deb and Tiwari [1,2]. The algorithm “is designed as a generic multi-objective, multi-optima optimizer” [2].

omniopt(
  fn,
  pop.size = 4L,
  n.gens = 100L,
  p.cross = 0.6,
  p.mut = 1/smoof::getNumberOfParameters(fn),
  eta.cross = 20L,
  eta.mut = 20L,
  mate = "normal",
  delta = 0.001,
  var.space.niching = FALSE,
  obj.space.niching = TRUE,
  init = "random",
  frequency = 10L,
  seed = runif(1),
  verbose = TRUE,
  envir = environment()
)

Arguments

fn

[function]
Single- or multi-objective function of type smoof_function (see smoof) with continuous decision space.

pop.size

[integer(1)]
Population size. Must be a multiple of 4. The default is 4.

n.gens

[integer(1)]
The number of generations (the only stopping condition). Defaults to 100.

p.cross

[numeric(1)]
Probability of crossover (within \([0.6, 1.0]\)). Defaults to 0.6.

p.mut

[numeric(1)]
Probablity of mutation (within \([0,1]\)). Default to \(1/n\) where \(n\) is the number of decision variables of fn.

eta.cross

[numeric(1)]
Value of distribution index for crossover in \([5, \ldots, 20]\). Default is 20.

eta.mut

[numeric(1)]
Value of distribution index for mutation in \([5, , 50]\). Default is 20.

mate

[character(1)]
Choice for selection restriction. Either “normal” for normal selection or “restricted” for restricted selection.

delta

[numeric(1)]
Value \(\delta \in [0.0,1.0]\) for loose domination. Default is \(0.001\).

var.space.niching

[logical(1)]
Use variable space niching? Default is FALSE. Note that at least one of var.space.niching or obj.space.niching must be TRUE.

obj.space.niching

[logical(1)]
Use objective space niching? Default is TRUE. Note that at least one of var.space.niching or obj.space.niching must be TRUE.

init

[character(1)]
This parameter determines how to initialize the population: “random” (the default) for uniform random generation and “lhs” for Latin-Hypercube-Sampling (LHS).

frequency

[integer(1)]
Frequency with which the population information (points and objetive function values) is to be stored. Defaults to 10, i.e., information is stored in every 10th generation.

seed

[numeric(1)]
Seed for random number generaator. Must be a scalar numeric value in \([0,1]\). Defaults to a random number within this interval.

verbose

[logical(1)]
If TRUE the algorithm is verbose, i.e., it prints some informative messages in the course of optimization. Default is TRUE.

envir

[environment]
This parameter is required for calling R functions from C. Do not change the default unless you know what you are doing!

Value

[List] List with the following entries:

dec

Matrix of points in decision space (each column is a point).

obj

Matrix of objective values in objective space (each column is a point). Note that this is a matrix even in the single-objective case.

history

A list of named lists. The i-th component contains the “dec” and “obj” values (see preceding bullet points) if the population was logged in i-th generation or NULL if it was not logged.

Details

The function expects a real-valued benchmark function from package smoof, the population size and the number of generations (the only stopping condition) as mandatory arguments. Besides there are various parameters that can be adjusted (see the referenced papers for an in-depth explanation of the algorithms working principles).

The original C-code can be found at the COIN laboratory website.

References

[1] Kalyanmoy Deb, Santosh Tiwari: Omni-optimizer: A generic evolutionary algorithm for single and multi-objective optimization. European Journal of Operations Research 185(3): 1062-1087.

[2] Kalyanmoy Deb, Santosh Tiwari: Omni-optimizer: A Procedure for Single and Multi-objective Optimization. In: Proceedings of the Evolutionary Multi-Criterion Optimization Conference (EMO) 2005: 47-61.

Examples

library(smoof) # Single-Objective Example (see reference [2], Section 4.2) # === set.seed(1) # reproducibility fn = smoof::makeHimmelblauFunction() res = omniopt(fn, 100, 200, var.space.niching = TRUE, delta = 0.001, verbose = FALSE) if (FALSE) { plot(fn) points(t(res$dec)) } # Multi-Objective Example # === set.seed(1) # reproducibility fn = smoof::makeZDT2Function(dimension = 4L) res = omniopt(fn, 100, 1000, p.cross = 0.9, verbose = FALSE) if (FALSE) { plot(t(res$obj)) pairs(t(res$dec)) }