【问题标题】:How to calculate population fitness using PyGAD?如何使用 PyGAD 计算种群适应度?
【发布时间】:2022-01-08 08:58:57
【问题描述】:

我想用 PyGAD 解决工作分配问题,希望得到的结果不仅是一条染色体,而且是整个人群。如[[1,1,0,0][0,0,1,1]]表示4个slots,第一个染色体中的1表示一个人分配给这些slots,另外两个slots根据第二个染色体分配给另一个人.

按照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()

【问题讨论】:

    标签: python genetic-algorithm


    【解决方案1】:

    我有一些笔记:

    1. cal_pop_fitness() 不是函数。它是pygad.GA 类中的一个方法。
    2. cal_pop_fitness() 方法不接受任何参数。将new_population 传递给它是不正确的。
    3. 这是一个重要说明。您传递给fitness_func 参数的适应度函数调用cal_pop_fitness() 方法。在 PyGAD 中,cal_pop_fitness() 方法调用您的自定义适应度函数。因此,您进入了一个无限循环,其中 2 个函数相互调用。

    所以,你的代码不能这样工作。

    如果要获取最近人群的适应度,可以使用last_generation_fitness属性。只需在您的健身功能中访问它:

    ga_instance.last_generation_fitness
    

    请注意,第一代该属性为None。因此,您可以在调用run() 方法之前将其设置为一些初始适应度值:

    ga_instance.last_generation_fitness = numpy.array([1, 1])
    

    【讨论】:

      猜你喜欢
      • 2018-07-23
      • 2021-12-01
      • 2019-05-28
      • 2018-04-01
      • 2011-07-11
      • 2021-04-18
      • 2019-06-13
      • 1970-01-01
      • 2013-08-09
      相关资源
      最近更新 更多