如何使用PyGAD计算种群适应度求解作业分配问题
1 初始种群生成操作是否正确
是正确的。
PyGAD的initial_population参数要求传入形状为(种群个体数, 基因数)的二维数组,你通过numpy生成的new_population完全符合该格式要求,每一行对应种群中的一条染色体,适配你2个员工、4个工位的作业分配场景。
2 cal_pop_fitness()调用是否正确
是错误的,存在两个核心问题:
cal_pop_fitness()是PyGAD内部自动调用的方法,作用是遍历种群所有染色体、逐个调用自定义的fitness_func计算适应度。你在fitness_func中反过来调用它会触发无限递归,直接导致程序运行异常。fitness_func的作用是计算单条染色体的适应度,入参中solution就是当前待计算的单条染色体,你只需要针对这条染色体计算适应度返回即可,不需要处理整个种群。
修正后代码示例
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(ga_instance, solution, solution_idx): # 此处替换为你自己的作业分配适应度计算逻辑,示例为统计当前染色体中1的数量 fitness = numpy.sum(solution) # 可补充作业分配约束:比如工位不可重复分配、员工工位数量限制等逻辑 return fitness 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() # 如需获取完整最终种群,直接读取populations属性的最后一个元素即可 final_population = ga_instance.populations[-1] print("最终种群:\n", final_population)
内容的提问来源于stack exchange,提问作者clement
相关产品推荐
相关产品推荐

