The fitness function, which should take a
vector as argument and return a numeric value (See
details).
lb
A numeric vector specifying the lower bounds
for the search domain.
ub
A numeric vector specifying the upper bounds
for the search domain.
popSize
The population size.
mutRate
The mutation rate, a numeric value between
0 and 1. When implementing a custom mutation function,
this value should be one of the parameters (see details
and examples).
cxRate
The crossover rate, a numeric value between
0 and 1. This parameter specifies the probability of two
individuals effectively exchange DNA during crossover. In
case the individuals didn't crossover, the offspring is a
exact copy of the parents. When implementing a custom
crossover function, this value should be one of the
arguments (see details and examples).
eliteRate
A numeric value between 0 and 1. The
eliteRate * popSize best-fitted individuals will
automatically be selected for the next generation.
selection
The selection operator to be used. You
can also implement a custom selection function (see
details and examples).
crossover
The crossover operator to be used. You
can also implement a custom crossover function (see
details and examples).
mutation
The mutation operator to be used. You can
also implement a custom mutation function (see details
and examples).
Details
This is the function used to configure and fine-tune a
real-based optimization. The basic usage requires only
the FUN parameter (function to be maximized),
together with the lb and ub parameters
(lower and upper search domain), all the other parameters
have sensible defaults.
The parameters selection, crossover and
mutation can also take a custom function as
argument, which needs to be in the appropriate format
(see the examples). The text below explains the default
behaviour for these parameters, which will be usefull if
you want to override one or more genetic operators.
selection: The fitness
option performs a fitness-proportionate selection,
so that the fittest individuals will have greater chances
of being selected. If you choose this option, the value
returned by FUN (the fitness value) should be
non-negative. The uniform option will
randomly sample the individuals to mate, regardless of
their fitness value. See the examples if you want to
implement a custom selection function.
crossover: The blend option
will perform a linear combination of the individuals DNA,
effectively introducing new information into the
resulting offspring. For details, see Practical
genetic algorithms in the references. The
two.points option will perform the classic 2-point
crossover. See the examples if you need to implement a
custom crossover function.
mutation: The default
implementation will uniformly sample n mutation
points along the population matrix, where n is
given by mutRate * popSize * nvars and
nvars is the number of variables in your problem.
Each sampled locus will be replaced by a
random-uniform number between 0 and 1. See the examples
to learn how to use a custom mutation function.
Value
An object of class GAReal, which you can pass as
an argument to plot or summary. This object
is a list with the following accessor functions:
bestFit:
Returns a vector with
the best fitness achieved in each generation.
meanFit:
Returns a vector with the mean
fitness achieved in each generation.
bestIndividual:
Returns a vector with the
best solution found.
evolve(h):
This is
the function you call to evolve your population.
You also need to specify the number of generations to
evolve.
population:
Returns the current
population matrix.
References
Randy L. Haupt, Sue Ellen Haupt (2004). Practical genetic
algorithms - 2nd ed.
# Maximize a trivial 5 variable function
# The function and search-space below will be used for all examples
fitness.FUN = function(x) sum(x)
lb = c(0, 0, 0, 0, 0)
ub = c(10, 10, 10, 10, 10)
ga1 = GAReal(fitness.FUN, lb, ub)
ga1$evolve(200)
plot(ga1)
# A custom selection example
selec.FUN = function(population, fitnessVec, nleft)
{
# population - The population matrix
# fitnessVec - The corresponding fitness vector for the population matrix
# nleft - The number of individuals you should select
half = as.integer(nleft/2)
remain = nleft - half
idxs = 1:nrow(population)
# pick half using fitness-proportionate
rowIdxs = sample(idxs, half, replace = TRUE, prob = fitnessVec)
# pick the other half randomly
rowIdxs = c(rowIdxs, sample(idxs, remain, replace = TRUE))
# Just return the nLeft selected row indexes
return(rowIdxs)
}
ga2 = GAReal(fitness.FUN, lb, ub, selection = selec.FUN)
ga2$evolve(200)
summary(ga2)
# A custom crossover example
crossover.FUN = function(parent1, parent2, prob)
{
# parent1, parent2 - The individuals to crossover
# prob - The probability of a crossover happen (cxRate parameter)
# Respect the cxRate parameter: if DNA is not exchanged, just return the parents
if (runif(1) > prob)
return(matrix(c(parent1, parent2), nrow = 2, byrow = TRUE))
# A simple uniform crossover - just swap the 'genes' with a probability of 0.5
for (i in 1:length(parent1))
{
if (runif(1) > 0.5)
{
tempval = parent1[i]
parent1[i] = parent2[i]
parent2[i] = tempval
}
}
# You should return a matrix in this format
return(matrix(c(parent1, parent2), nrow = 2, byrow = TRUE))
}
ga3 = GAReal(fitness.FUN, lb, ub, crossover = crossover.FUN)
ga3$evolve(200)
plot(ga3)
# A custom mutation example
mutation.FUN = function(population, nMut)
{
# population - The population matrix to apply mutation
# nMut - The number of mutations you supposed to apply, according to mutRate
rows = sample(1:nrow(population), nMut, replace = TRUE)
cols = sample(1:ncol(population), nMut, replace = TRUE)
noise = (runif(nMut))^2
# extract the matrix indexes
ext = matrix(c(rows, cols), nMut, 2)
population[ext] = noise
return(population)
}
ga4 = GAReal(fitness.FUN, lb, ub, mutation = mutation.FUN)
ga4$evolve(200)
summary(ga4)