Description
I'm trying pygad
(2.16.3) for the first time , and have found the check for the number of arguments of the fitness function to be overly sensitive, e.g. I would like to be able to pass fitness functions of the following types:
Class instance functions:
import pygad
class Fitness:
def fitness(self, x, idx):
return sum(x)
foo = Fitness()
ga_instance = pygad.GA(
num_generations=10,
num_parents_mating=5,
fitness_func=foo.fitness,
sol_per_pop=10,
num_genes=5,
)
Incorrectly triggers an error that fitness requires 3 parameters, since f.fit.__code__.co_argcount
returns 3 (including self
). Checking with signature
instead could be an alternative:
from inspect import signature
len(signature(f.fit).parameters)
>>> 2
Functions with additional parameters that have default values:
import pygad
def fitness(x, idx, y=3):
return sum(x)
ga_instance = pygad.GA(
num_generations=10,
num_parents_mating=5,
fitness_func=fitness,
sol_per_pop=10,
num_genes=5,
)
Also triggers an error, but fitness
can be called with 2 parameters as required. Unsure of a workaround for this one.
Is there any reason why pygad
couldn't use either of these fitness functions? I'd especially like to be able to use a function of a class instance for one of my projects.