我正在尝试实现一种遗传算法,问题是当人口减少时,我的函数tour_selection返回相同的父代。这是两个主要功能
def crossover(agents, x):
offspring = []
for _ in range(len(agents)):
p1 = tournament_selection(agents)
p2 = tournament_selection(agents)
split = random.randint(0, len(p2.individual) - 1)
child1 = p1
child1.individual = p1.individual[0:split] + p2.individual[split:len(p1.individual)]
offspring.append(child1)
agents = offspring
return agents
def tournament_selection(population):
parents = random.choices(population, k=5)
parents = sorted(parents, key=lambda agent: agent.fitness, reverse=True)
bestparent = parents[0]
return bestparent
答案 0 :(得分:0)
您可以修改tournament_selection
以返回两个父母:
def tournament_selection(population):
parents = random.choices(population, k=5)
parents = sorted(parents, key=lambda agent: agent.fitness, reverse=True)
return parents[0], parents[1]
然后,唯一需要进行的其他调整是将p1 =
和p2 =
行替换为一行:
p1, p2 = tournament_selection(agents)
答案 1 :(得分:0)
我会这样实现
def tournament_selection(self, population):
parent_population = copy.deepcopy(population)
offspring_population = []
for p in range(len(population)):
parents = []
for i in range(2):
temp_population = []
for j in range(Parameters.tournament_size):
temp_population.append(r.choice(parent_population))
#sort solutions by fitness
temp_population.sort(key=lambda x: x.fitness, reverse=False)
parents.append(temp_population[0].ind.copy())