Numpy 数组随机突变



我正在用Python编写我的第一个遗传算法。 我特别关心优化和总体可扩展性。

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

在这里,我做了一个 [10,10] 数组,随机数介于 -1 和 1 之间。
现在我想对阵列的每个标本进行特定的突变(突变率取决于标本的适应性(。

例如,我有:

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]]

我想对群体中的每个子阵列执行具有特定突变率的该阵列的突变。我尝试了这个,但优化并不完美,我需要对总体(主数组,"人口"(中的每个子阵列(每个子数组都是一个标本(执行不同的突变。

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

我正在寻找一种在所有主阵列上应用突变掩码之类的方法。像这样:

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

我认为这是最好的方法(因为我们只选择数组,然后用随机数组替换此选择(,但我不知道如何执行此操作。如果您有其他解决方案,我^^。

假设您有一个数组fitness每个标本的适合性,大小为len(population)。假设您有一个函数fitness_mutation_prob对于给定的适应度,它为您提供标本中每个元素的突变概率。例如,如果fitness的值范围从 0 到 1,则fitness_mutation_prob(fitness)可以是(1 - fitness)np.square(1 - fitness)或其他什么。然后,您可以执行以下操作:

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))

最新更新