【发布时间】:2020-07-10 07:52:31
【问题描述】:
所以我正在制作遗传算法,其中最适合的染色体是全为 [1,1,1,1...] 的染色体。我在调试时对下面的整个代码进行了编码,我发现交叉、突变、generate_population 有效,并且我浏览了其他函数的代码,它们都很有意义。但是每当我运行它时,我发现在第二代或第三代之后,我所有的其他代都一样。所以我的问题是为什么会发生这种情况,因为我浏览了我的代码,每一代都应该有一个不同的“更健康”的人群,每个人群之间应该有多样性。任何帮助将非常感激。 result image
import random
def generate_population(size):
population = []
for i in range(size):
individual = []
for g in range(64):
x = random.randrange(0,2)
individual.append(x)
population.append(individual)
return population
def fitnessFunc(individual):
fit = 0
for i in individual:
if i == 1:
fit += 1
else:
fit = fit
return fit
def choice_by_roulette(sorted_population, fitness_sum):
offset = 0
normalized_fitness_sum = fitness_sum
lowest_fitness = fitnessFunc(sorted_population[0])
if lowest_fitness < 0:
offset = lowest_fitness
normalized_fitness_sum += offset * len(sorted_population)
draw = random.uniform(0, 1)
accumulated = 0
for individual in sorted_population:
fitness = fitnessFunc(individual)+offset
probability = fitness / normalized_fitness_sum
accumulated += probability
if draw <= accumulated:
return individual
def sort_population_by_fitness(population):
return sorted(population, key=fitnessFunc)
def crossover(individual_a, individual_b):
for i in range(64):
pop = random.randint(1,2)
if pop == 1:
individual_a[i] = individual_b[i]
else:
individual_a = individual_a
return individual_a
def mutate(individual):
rand = random.randrange(0,10)
if rand == 5:
if individual[rand]==1:
individual[rand]=0
else:
individual[rand]=1
return individual
def make_next_generation(previous_population):
next_generation = []
sorted_by_fitness_population = sort_population_by_fitness(previous_population)
population_size = len(previous_population)
fitness_sum = sum(fitnessFunc(individual) for individual in population)
for i in range(population_size):
choice = choice_by_roulette(sorted_by_fitness_population, fitness_sum)
schoice = choice_by_roulette(sorted_by_fitness_population, fitness_sum)
if choice != None:
first_choice = choice
if schoice != None:
second_choice = schoice
individual = crossover(first_choice, second_choice)
individual = mutate(individual)
next_generation.append(individual)
return next_generation
population = generate_population(size=10)
generations = 1000
i = 1
while True:
print(f" GENERATION {i}")
for individual in population:
print(individual, fitnessFunc(individual))
if i == generations:
break
i += 1
population = make_next_generation(population)
best_individual = sort_population_by_fitness(population)[-1]
print(" FINAL RESULT")
print(best_individual, fitnessFunc(best_individual))
【问题讨论】:
-
看起来您期望函数参数和返回值是副本。这不是 Python 的工作方式。见nedbatchelder.com/text/names.html
-
您所指的代码中是否有特定的行?
-
例如,
crossover变异并返回其输入之一。 -
你能说得更具体点吗?究竟是什么问题?
-
是的,我添加了1000代后的结果图。正如你所看到的,人口中的所有个体都是一样的,这不应该是一样的,所有宝贵的人口也是一样的
标签: python genetic-algorithm genetic-programming