【发布时间】:2021-11-04 19:12:57
【问题描述】:
我正在 GA 中选择两个父母,问题是当我实现“锦标赛选择”函数时,它总是返回两个相同的父母。
初始种群为:
num_emitter_coefficients = 782
sol_per_pop_1=1
sol_per_pop_2=3
sol_per_pop=sol_per_pop_1+sol_per_pop_2
pop_size_1 = [sol_per_pop_1, num_emitter_coefficients]
pop_size_2 = [sol_per_pop_2, num_emitter_coefficients]
initial_population_1 = np.random.uniform(low=0.0, high=0.0, size=pop_size_1)
initial_population_2 = np.random.uniform(low=0.0, high=0.0, size=pop_size_2)
for row in initial_population_2:
locations_used_in_this_row = 0
while locations_used_in_this_row != 5:
column = np.random.randint(num_emitter_coefficients)
if row[column] == 0.0:
row[column] = np.random.rand()*10
locations_used_in_this_row += 1
population=np.vstack([initial_population_1, initial_population_2])
print('Population: ',population)
假设每个人的分数是:
[44,56,63,34]
在我的项目中,每个人的得分越高,每个人的适应度就越低。 选择父母的功能如下图:
def tournament_selection(population, scores, k=4):
first_pick = np.random.randint(0,len(population))
for second_pick in np.random.randint(0,len(population),k-1):
if scores[second_pick] < scores[first_pick]:
winner = second_pick
else:
winner = first_pick
return population[winner,:]
当我实现这个功能时,
for i in range(0, len(population),2):
parent_1 = tournament_selection(population, scores)
parent_2 = tournament_selection(population, scores)
它总是返回两个相同的父母。 你能告诉我如何避免这个问题吗?
也许如果我可以从人口列表中排除“获胜者”,可以解决选择两个相同父母的问题,但我不知道如何用代码实现,请你给我一些想法?提前非常感谢。
【问题讨论】:
-
您在 for 循环中重复设置“winner”(丢弃前一个值),但在循环后仅读取一次(使用其最后一个值)。