Julien Blanchon
Julien Blanchon

Reputation: 57

Numpy Array random mutation

I'm coding my first genetic algorithm in Python. I particularly care about the optimization and population scalability.

import numpy as np
population = np.random.randint(-1, 2, size=(10,10))

Here I make a [10,10] array, with random number between -1 and 1.
And now I want to perform a specific mutation ( mutation rate depends on the specimens fitness ) for each specimen of my array.

For example, I have:

print population
[[ 0  0  1  1 -1  1  1  0  1  0]
[ 0  1 -1 -1  0  1 -1 -1  0 -1]
[ 0  0  0  0  0  0  0  0  0  0]
[ 0  0  0  0  0  0  0  0  0  0]
[ 0  0  0  0  0  0  0  0  0  0]
[ 0  1  1  0  0  0  1  1  0  1]
[ 1 -1  0  0  1  0 -1  1  1  0]
[ 1 -1  1 -1  0 -1  0  0  1  1]
[ 0  0  0  0  0  0  0  0  0  0]
[ 0  1  1  0  0  0  1 -1  1  0]]

I want to perform the mutation of this array with a specific mutation rate for each sub-array in population. I try this but the optimization is not perfect and I need to perform a different mutation for each sub-array (each sub-array is a specimen) in the population (the main array, "population").

population[0][numpy.random.randint(0, len(population[0]), size=10/2)] = np.random.randint(-1, 2, size=10/2)

I'm looking for a way to apply something like a mutation mask on all the main-array. Something like that:

 population[array element select with the mutation rate] = random_array[with the same size]

I think it's the best way (because we only to an array selection and after we replace this selection with the random array), but I don't know how to perform this. And if you have other solution I am on it ^^.

Upvotes: 3

Views: 2000

Answers (1)

javidcf
javidcf

Reputation: 59701

Let's say you have an array fitness with the fitness of each specimen, with size len(population). Let's also say you have a function fitness_mutation_prob that, for a given fitness, gives you the mutation probability for each of the elements in the specimen. For example, if the values of fitness range from 0 to 1, fitness_mutation_prob(fitness) could be something like (1 - fitness), or np.square(1 - fitness), or whatever. You can then do:

r = np.random.random(size=population.shape)
mut_probs = fitness_mutation_prob(fitness)
m = r < mut_probs[:, np.newaxis]
population[m] = np.random.randint(-1, 2, size=np.count_nonzero(m))

Upvotes: 1

Related Questions