Genex v0.2.0 Genex.Operators.Crossover View Source
Implementation of several popular crossover methods.
Crossover is analagous to reproduction or biological crossover. Genex utilizes pairs of chromosomes to create offspring from the genetic material of parent chromosomes. Crossover happens with some probability P(c)
. Typically this is a high probability.
The probability of crossover or crossover_rate
as it is called in our case, determines the number of parents selected to breed for the next generation. See more on this in the Selection
documentation.
Crossover operators are generic. As with any optimization problem, no single method will be perfect. Genex offers a variety of crossover operators to experiment with; however, you may find that you need to write your own to fit your specific use case. You can do this by overriding the crossover
method.
Each time a crossover takes place, 2 new children are created. These children then populate the children
field of the Population
struct before they are merged into the new population.
Link to this section Summary
Functions
Performs a blend crossover.
Performs Davis Order crossover of a random slice.
Performs a messy single point crossover at random points.
Performs a messy single point crossover at known points.
Performs a simulated binary crossover.
Performs single point crossover at a random point.
Performs single point crossover at a known point.
Performs two-point crossover at a random point.
Performs two-point crossover at a known point.
Performs uniform crossover.
Link to this section Functions
blend(p1, p2, alpha)
View Sourceblend(Genex.Chromosome.t(), Genex.Chromosome.t(), float()) :: {Genex.Chromosome.t(), Genex.Chromosome.t()}
Performs a blend crossover.
This will blend genes according to some alpha between 0 and 1.
Returns {%Chromosome{}, %Chromosome{}}
.
Parameters
p1
: Parent one.p2
: Parent two.alpha
:Float
between 0 and 1 representing percentage of each parent to blend into children.
davis_order(p1, p2)
View Sourcedavis_order(Genex.Chromosome.t(), Genex.Chromosome.t()) :: {Genex.Chromosome.t(), Genex.Chromosome.t()}
Performs Davis Order crossover of a random slice.
Returns {%Chromosome{}, %Chromosome{}}
.
Parameters
p1
: Parent one.p2
: Parent two.
messy_single_point(p1, p2)
View Sourcemessy_single_point(Genex.Chromosome.t(), Genex.Chromosome.t()) :: {Genex.Chromosome.t(), Genex.Chromosome.t()}
Performs a messy single point crossover at random points.
This crossover disregards the length of the chromosome and will often arbitrarily increase or decrease it's size.
Returns {%Chromosome{}, %Chromosome{}}
.
Parameters
p1
: Parent one.p2
: Parent two.
messy_single_point(p1, p2, point1, point2)
View Sourcemessy_single_point( Genex.Chromosome.t(), Genex.Chromosome.t(), integer(), integer() ) :: {Genex.Chromosome.t(), Genex.Chromosome.t()}
Performs a messy single point crossover at known points.
This crossover disregards the length of the chromosome and will often arbitrarily increase or decrease it's size.
Returns {%Chromosome{}, %Chromosome{}}
.
Parameters
p1
: Parent one.p2
: Parent two.point1
:p1
split point.point2
:p2
split point.
Examples
iex> c1 = %Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}
iex> c2 = %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}
iex> messy_single_point(c1, c2, 2, 4)
{%Elixir.Genex.Chromosome{genes: [1, 2, 10], size: 3}, %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 3, 4, 5], size: 7}}
iex> c1 = %Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}
iex> c2 = %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}
iex> messy_single_point(c1, c2, 0, 10)
{%Elixir.Genex.Chromosome{genes: [], size: 0}, %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10, 1, 2, 3, 4, 5], size: 10}}
iex> c1 = %Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}
iex> c2 = %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}
iex> messy_single_point(c1, c2, -2, 3)
{%Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}, %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}}
simulated_binary(p1, p2, eta)
View Sourcesimulated_binary(Genex.Chromosome.t(), Genex.Chromosome.t(), number()) :: {Genex.Chromosome.t(), Genex.Chromosome.t()}
Performs a simulated binary crossover.
Returns {%Chromosome{}, %Chromosome{}}
.
Parameters
p1
: Parent one.p2
: Parent two.eta
:Float
single_point(p1, p2)
View Sourcesingle_point(Genex.Chromosome.t(), Genex.Chromosome.t()) :: {Genex.Chromosome.t(), Genex.Chromosome.t()}
single_point(Genex.Chromosome.t(), Genex.Chromosome.t()) :: {Genex.Chromosome.t(), Genex.Chromosome.t()}
Performs single point crossover at a random point.
This will swap a random slice of genes from each chromosome, producing 2 new chromosomes.
Returns {%Chromosome{}, %Chromosome{}}
.
Parameters
p1
: Parent one.p2
: Parent two.
Performs single point crossover at a known point.
This will swap a known slice of genes from each chromosome, producing 2 new chromosomes.
Returns {%Chromosome{}, %Chromosome{}}
.
Parameters
p1
: Parent one.p2
: Parent two.point
: Slice to swap.
Examples
iex> c1 = %Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}
iex> c2 = %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}
iex> single_point(c1, c2, 2)
{%Elixir.Genex.Chromosome{genes: [1, 2, 8, 9, 10], size: 5}, %Elixir.Genex.Chromosome{genes: [6, 7, 3, 4, 5], size: 5}}
iex> c1 = %Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}
iex> c2 = %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}
iex> single_point(c1, c2, 10)
{%Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}, %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}}
iex> c1 = %Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}
iex> c2 = %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}
iex> single_point(c1, c2, 0)
{%Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}, %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}}
iex> c1 = %Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}
iex> c2 = %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}
iex> single_point(c1, c2, -5)
{%Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}, %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}}
two_point(p1, p2)
View Sourcetwo_point(Genex.Chromosome.t(), Genex.Chromosome.t()) :: {Genex.Chromosome.t(), Genex.Chromosome.t()}
Performs two-point crossover at a random point.
This will swap two random slices of genes from each chromosome, producing 2 new chromosomes.
Returns %Chromosome{}
.
Parameters
p1
: Parent one.p2
: Parent two.
two_point(p1, p2, first, second)
View Sourcetwo_point(Genex.Chromosome.t(), Genex.Chromosome.t(), integer(), integer()) :: {Genex.Chromosome.t(), Genex.Chromosome.t()}
Performs two-point crossover at a known point.
This will swap a known slice of genes from each chromosome, producing 2 new chromosomes.
Returns {%Chromosome{}, %Chromosome{}}
.
Parameters
p1
: Parent one.p2
: Parent two.first
: First Split Point.second
: Second Split Point.
Examples
iex> c1 = %Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}
iex> c2 = %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}
iex> two_point(c1, c2, 1, 3)
{%Elixir.Genex.Chromosome{genes: [1, 7, 8, 4, 5], size: 5}, %Elixir.Genex.Chromosome{genes: [6, 2, 3, 9, 10], size: 5}}
iex> c1 = %Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}
iex> c2 = %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}
iex> two_point(c1, c2, 10, 3)
{%Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}, %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}}
iex> c1 = %Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}
iex> c2 = %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}
iex> two_point(c1, c2, -3, 3)
{%Elixir.Genex.Chromosome{genes: [1, 2, 3, 4, 5], size: 5}, %Elixir.Genex.Chromosome{genes: [6, 7, 8, 9, 10], size: 5}}
uniform(p1, p2, rate)
View Sourceuniform(Genex.Chromosome.t(), Genex.Chromosome.t(), float()) :: {Genex.Chromosome.t(), Genex.Chromosome.t()}
Performs uniform crossover.
This will swap random genes from each chromosome according to some specified rate, producing 2 new chrmosomes.
Returns Chromosome
.
Parameters
p1
: Parent one.p2
: Parent two.rate
:Float
between 0 and 1 representing rates to swap genes.