遗传算法锦标赛选择,random.choice()选择相同的父项

时间:2019-12-22 18:19:22

标签: python random genetic-algorithm

我正在尝试实现一种遗传算法,问题是当人口减少时,我的函数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

2 个答案:

答案 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())