Genetic Algorithm setup
Description
Setup a GAReal
object that can be used to perform
a realbased optimization.
Usage
1 2 3 4 5 
Arguments
FUN 
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

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 finetune a
realbased 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
: Thefitness
option performs a fitnessproportionate selection, so that the fittest individuals will have greater chances of being selected. If you choose this option, the value returned byFUN
(the fitness value) should be nonnegative. Theuniform
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
: Theblend
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. Thetwo.points
option will perform the classic 2point crossover. See the examples if you need to implement a custom crossover function.

mutation
: The default implementation will uniformly samplen
mutation points along the population matrix, wheren
is given bymutRate * popSize * nvars
andnvars
is the number of variables in your problem. Each sampled locus will be replaced by a randomuniform 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.
Michalewicz, Zbigniew. Genetic Algorithms + Data Structures = Evolution Programs  3rd ed.
Examples
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82  # Maximize a trivial 5 variable function
# The function and searchspace 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 fitnessproportionate
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)
