The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Short Description

caRamel is a multiobjective evolutionary algorithm combining the MEAS algorithm and the NGSA-II algorithm.

Download the package from CRAN or GitHub and then install and load it.

library(caRamel)
## Le chargement a nécessité le package : geometry
## Le chargement a nécessité le package : parallel
## Package 'caRamel' version 1.3

Test functions

Schaffer

Schaffer test function has two objectives with one variable.

schaffer <- function(i) {
  if (x[i,1] <= 1) {
    s1 <- -x[i,1]
  } else if (x[i,1] <= 3) {
    s1 <- x[i,1] - 2
  } else if (x[i,1] <= 4) {
    s1 <- 4 - x[i,1]
  } else {
    s1 <- x[i,1] - 4
  }
  s2 <- (x[i,1] - 5) * (x[i,1] - 5)
  return(c(s1, s2))
}

Note that :

  • parameter i is mandatory for the management of parallelism.
  • the variable must be named x and is a matrix of size [npopulation, nvariables].

The variable lies in the range [-5, 10]:

nvar <- 1 # number of variables
bounds <- matrix(data = 1, nrow = nvar, ncol = 2) # upper and lower bounds
bounds[, 1] <- -5 * bounds[, 1]
bounds[, 2] <- 10 * bounds[, 2]

Both functions are to be minimized:

nobj <- 2 # number of objectives
minmax <- c(FALSE, FALSE) # min and min

Before calling caRamel in order to optimize the Schaffer’s problem, some algorithmic parameters need to be set:

popsize <- 100 # size of the genetic population
archsize <- 100 # size of the archive for the Pareto front
maxrun <- 1000 # maximum number of calls
prec <- matrix(1.e-3, nrow = 1, ncol = nobj) # accuracy for the convergence phase

Then the minimization problem can be launched:

results <-
  caRamel(nobj,
          nvar,
          minmax,
          bounds,
          schaffer,
          popsize,
          archsize,
          maxrun,
          prec,
          carallel=FALSE) # no parallelism
## Beginning of caRamel optimization <-- Wed Feb  2 07:29:28 2022
## Number of variables : 1
## Number of functions : 2
## Done in 6.67691111564636 secs --> Wed Feb  2 07:29:35 2022
## Size of the Pareto front : 76
## Number of calls : 1020

Test if the convergence is successful:

print(results$success==TRUE)
## [1] TRUE

Plot the Pareto front:

plot(results$objectives[,1], results$objectives[,2], main="Schaffer Pareto front", xlab="Objective #1", ylab="Objective #2")

plot(results$parameters, main="Corresponding values for X", xlab="Element of the archive", ylab="X Variable")

Kursawe

Kursawe test function has two objectives of three variables.

kursawe <- function(i) {
  k1 <- -10 * exp(-0.2 * sqrt(x[i,1] ^ 2 + x[i,2] ^ 2)) - 10 * exp(-0.2 * sqrt(x[i,2] ^2 + x[i,3] ^ 2))
  k2 <- abs(x[i,1]) ^ 0.8 + 5 * sin(x[i,1] ^ 3) + abs(x[i,2]) ^ 0.8 + 5 * sin(x[i,2] ^3) + abs(x[i,3]) ^ 0.8 + 5 * sin(x[i,3] ^ 3)
  return(c(k1, k2))
}

The variables lie in the range [-5, 5]:

nvar <- 3 # number of variables
bounds <- matrix(data = 1, nrow = nvar, ncol = 2) # upper and lower bounds
bounds[, 1] <- -5 * bounds[, 1]
bounds[, 2] <- 5 * bounds[, 2]

Both functions are to be minimized:

nobj <- 2 # number of objectives
minmax <- c(FALSE, FALSE) # min and min

Set algorithmic parameters and launch caRamel:

popsize <- 100 # size of the genetic population
archsize <- 100 # size of the archive for the Pareto front
maxrun <- 1000 # maximum number of calls
prec <- matrix(1.e-3, nrow = 1, ncol = nobj) # accuracy for the convergence phase

results <- 
  caRamel(nobj,
          nvar,
          minmax,
          bounds,
          kursawe,
          popsize,
          archsize,
          maxrun,
          prec,
          carallel=FALSE) # no parallelism
## Beginning of caRamel optimization <-- Wed Feb  2 07:29:37 2022
## Number of variables : 3
## Number of functions : 2
## Done in 3.89774394035339 secs --> Wed Feb  2 07:29:41 2022
## Size of the Pareto front : 86
## Number of calls : 1011

Test if the convergence is successful and plot the optimal front:

print(results$success==TRUE)
## [1] TRUE
plot(results$objectives[,1], results$objectives[,2], main="Kursawe Pareto front", xlab="Objective #1", ylab="Objective #2")

Finally plot the convergences of the objective functions:

matplot(results$save_crit[,1],cbind(results$save_crit[,2],results$save_crit[,3]),type="l",col=c("blue","red"), main="Convergence", xlab="Number of calls", ylab="Objectives values")

References

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.