def tournament(population: List[Genome], group_size: int, epsilon: float, **kwargs) -> Iterator[PAIR_T]:
def get_one(group: Sequence[Genome]) -> Genome:
r = random()
if r < epsilon:
return choice(group)
return max(group, key=attrgetter('fitness'))
try:
assert len(population) > 1
except AssertionError:
raise TooFewIndividuals
while True:
pool = list(population) # make a shallow copy
group_a = sample(pool, group_size)
a = get_one(group_a)
pool.remove(a)
group_b = sample(pool, group_size)
b = get_one(group_b)
yield (a, b)
评论列表
文章目录