We have seen before how just by mutation and selecting the top best candidates that are closer to the goal, we have some kind learning by evolutionary effect. In theory people call this genetic algorithm. So in this blog we will be building our own mutation function that will mutate values and give it to us. So here it is:

function mutate(value, mutation_percent_range, number_of_mutations)
    output = []
    for i in 1:number_of_mutations
        mutation = value * (1 + (rand(mutation_percent_range) / 100))
        push!(output, mutation)
    end
    output
end

Let’s see how it works. First we have an empty function:

function mutate()
end

We need to mutate a value here, so let’s have it:

function mutate(value)
end

We need say how much we need to mutate an value, lets exploit the property of Range in Julia. So if we want to mutate it by +/- 10%, we say -10:10, so let that be our second argument named mutation_percent_range:

function mutate(value, mutation_percent_range)
end

So we need to pick a random value from mutation_percent_range:

function mutate(value, mutation_percent_range)
    rand(mutation_percent_range)
end

divide it by hundred since it’s a percentage:

function mutate(value, mutation_percent_range)
    rand(mutation_percent_range) / 100
end

multiply add it to mutation value:

function mutate(value, mutation_percent_range)
    value * (1 + (rand(mutation_percent_range) / 100))
end

and this will give a mutated value. But we want lot of mutations for the next generation as many of them could be rejected and only few would survive, so let’s add a third parameter called number_of_mutations:

function mutate(value, mutation_percent_range, number_of_mutations)
    value * (1 + (rand(mutation_percent_range) / 100))
end

Now, for number of mutations times we need to mutate:

function mutate(value, mutation_percent_range, number_of_mutations)
    for i in 1:number_of_mutations
        mutation = value * (1 + (rand(mutation_percent_range) / 100))
    end
end

Collect it so that it won’t be lost, for that let’s use an Array called output to capture it and return it as shown:

function mutate(value, mutation_percent_range, number_of_mutations)
    output = []
    for i in 1:number_of_mutations
        mutation = value * (1 + (rand(mutation_percent_range) / 100))
        push!(output, mutation)
    end
    output
end

So our mutation function is ready. Let’s test it out

mutate(100, -10:10, 10)

Output:

10-element Array{Any,1}:
  92.0
 100.0
  93.0
  99.0
 108.0
  92.0
 109.00000000000001
 106.0
  91.0
 110.00000000000001

And it works! You can get the Jupyter notebook file for this blog here https://gitlab.com/data-science-with-julia/code/-/blob/master/mutate.ipynb.