Numpy 数组随机变异
Numpy Array random mutation
我正在 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")中的每个子数组(每个子数组都是一个样本)执行不同的突变。
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))
我正在 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")中的每个子数组(每个子数组都是一个样本)执行不同的突变。
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))