def survive(self, fraction=None, n=None, luck=False) -> 'Population':
"""Let part of the population survive.
Remove part of the population. If both fraction and n are specified,
the minimum resulting population size is taken.
:param fraction: Fraction of the original population that survives.
Defaults to None.
:type fraction: float/None
:param n: Number of individuals of the population that survive.
Defaults to None.
:type n: int/None
:param luck: If True, individuals randomly survive (with replacement!)
with chances proportional to their fitness. Defaults to False.
:type luck: bool
:return: self
"""
if fraction is None:
if n is None:
raise ValueError('everyone survives! must provide either "fraction" and/or "n".')
resulting_size = n
elif n is None:
resulting_size = round(fraction*len(self.individuals))
else:
resulting_size = min(round(fraction*len(self.individuals)), n)
self.evaluate(lazy=True)
if resulting_size == 0:
raise RuntimeError('no one survived!')
if resulting_size > len(self.individuals):
raise ValueError('everyone survives! must provide "fraction" and/or "n" < population size')
if luck:
self.individuals = choices(self.individuals, k=resulting_size,
weights=[individual.fitness for individual in self.individuals])
else:
sorted_individuals = sorted(self.individuals, key=lambda x: x.fitness, reverse=self.maximize)
self.individuals = sorted_individuals[:resulting_size]
return self
评论列表
文章目录