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.