def mutate_standard(self, percent, population):
"""
Randomly change some parameters. The change in value uses the populations
standard deviation.
"""
def mutate_value(value, pop_values):
if random.random() > percent:
return value
pop_values = [v for v in pop_values if v is not None]
if len(np.unique(pop_values)) < 3:
# Use alternative method when diversity is very low.
return value * 1.5 ** (random.random()*2-1)
else:
std = np.std(pop_values)
return float(random.gauss(value, std))
for param in self.parameters:
value = getattr(self, param)
pop_values = [getattr(indiv, param) for indiv in population]
if value is None:
continue # cant mutate.
elif isinstance(value, Parameters):
value.mutate_standard(percent, pop_values)
elif isinstance(value, tuple):
new_tup = []
for index, value_indexed in enumerate(value):
pop_values_indexed = [v[index] for v in pop_values]
new_value = mutate_value(value_indexed, pop_values_indexed)
new_tup.append(new_value)
setattr(self, param, tuple(new_tup))
else: # Mutate a floating point or boolean number.
setattr(self, param, mutate_value(value, pop_values))
评论列表
文章目录