У меня такая проблема с реализацией генерации нового населения. У меня есть набор матриц, я определил функцию пригодности, и мне нужно, чтобы значение пригодности было как можно ниже. Итак, я реализовал функцию воссоздания населения, сохранив только лучших людей из предыдущего, как показано ниже:
def new_generation(old_generation, real_coords, elit_rate = ELIT, mutation_rate = MUTATION_RATE, half = HALF, mtype = "strong"):
fit = [fitness(individual, real_coords) for individual in old_generation]
idx = np.argsort(fit)
print(idx)
new_gen = []
for i in range(n_population):
if i < ELIT:
new_gen.append(old_generation[idx[i]])
else:
new_gen.append(crossover(old_generation[idx[np.random.randint(0,n_population)]], old_generation[idx[np.random.randint(0,n_population)]]))
for i in range(n_population):
if np.random.rand() < mutation_rate:
if i > ELIT:
new_gen[i] = mutate(new_gen[i],mtype)
print("new gen")
print([fitness(individual, real_coords) for individual in new_gen])
return new_gen
Моя проблема в том, что новое поколение, которое я получаю, на самом деле не заказано с первыми с наименьшей возможной пригодностью!
(ELIT равен 10, а n_population равен 100)
Я думаю, что моя проблема в той части, где я делаю:
for i in range(n_population):
if i < ELIT:
new_gen.append(old_generation[idx[i]])
потому что в моей голове это должно гарантировать, что я буду первым человеком в new_gen, как я желаю.
Где я не прав?
Спасибо!