Skip to content

Wrong number of arguments exceptions for fitness functions with 2 required parameters #112

Open
@jack89roberts

Description

@jack89roberts

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions