我想用PyGAD来解决工作分配问题,希望不仅能得到一个染色体的结果,而且能得到整个群体的结果。如[1,1,1,0,0]代表4个插槽,第一染色体中的1指分配给这些插槽的一个人,另两个根据第二染色体分配给另一个人的插槽。
按照PyGAD网站(https://pygad.readthedocs.io)上的教程,我是否正确地使用initial_population
来生成人口?使用cal_pop_fitness()
函数正确吗?我做了一些尝试,但仍然不知道。
import pygad
import numpy
sol_per_pop = 2
num_genes = 4
pop_size = (sol_per_pop,num_genes)
new_population = numpy.random.randint(low=0,high=2,size=pop_size)
num_generations = 100
num_parents_mating = 2
def fitness_func(solution,solution_idx):
fitness = ga_instance.cal_pop_fitness(new_population)
#do something
ga_instance = pygad.GA(initial_population = new_population,
num_generations=num_generations,
num_parents_mating=num_parents_mating,
sol_per_pop=sol_per_pop,
num_genes=num_genes,
mutation_type=None,
fitness_func=fitness_func)
ga_instance.run()
发布于 2022-01-27 15:13:31
我有一些笔记:
cal_pop_fitness()
不是一个函数。它是pygad.GA
类中的一个方法。cal_pop_fitness()
方法不接受任何参数。把new_population
传递给它是不正确的。fitness_func
参数的适应度函数调用cal_pop_fitness()
方法。在PyGAD中,cal_pop_fitness()
方法调用自定义适应度函数。因此,您将进入一个无限循环,其中两个函数相互调用。因此,您的代码不能这样工作。
如果您想获得最新人群的适配性,可以使用last_generation_fitness
属性。只要在你的健身功能中访问它:
ga_instance.last_generation_fitness
注意,这个属性是第一代的None
。因此,可以在调用run()
方法之前将其设置为一些初始适应度值:
ga_instance.last_generation_fitness = numpy.array([1, 1])
https://stackoverflow.com/questions/70189790
复制