Пакет Gene AI python — определение пользовательской функции фитнеса

#python #genetic-algorithm

Вопрос:

Я использую пакет Gene AI в python для тестирования генетического алгоритма (https://github.com/diogomatoschaves/geneal/blob/master/geneal/genetic_algorithms/genetic_algorithm_base.py).

Мне нужна моя собственная функция фитнеса, поэтому я написал

 def my_fitness(chromosome):   
    fitness = mean_absolute_percentage_error(chromosome, [0.5 0.5 0.5 0.5])
    return fitness
 

А затем последовал документации и написал ниже код:

     from geneal.genetic_algorithms import ContinuousGenAlgSolver
    from geneal.applications.fitness_functions.continuous import fitness_functions_continuous
    
    solver = ContinuousGenAlgSolver(
    n_genes=4, 
    fitness_function=my_fitness(chromosome),
    pop_size=10,
    max_gen=200,
    mutation_rate=0.1,
    selection_rate=0.6,
    selection_strategy="roulette_wheel",
    problem_type=float, # Defines the possible values as float numbers
    variables_limits=(-10, 10) # Defines the limits of all variables between -10 and 10. 
                               # Alternatively one can pass an array of tuples defining the limits
                               # for each variable: [(-10, 10), (0, 5), (0, 5), (-20, 20)]
)

solver.solve()
 

Непонятно, как я могу использовать свою собственную функцию фитнеса. получаю ошибку, что хромосома не определена (очевидно!).
как использовать мою собственную функцию фитнеса с этим пакетом. пожалуйста, покажи.

Ответ №1:

Функция фитнеса имеет 2 требования:

  • Ему должен быть передан один и только один аргумент — хромосома. Хромосома представляет собой массив чисел numpy из 1 и 0, если это решатель бинарного генетического алгоритма, или массив чисел numpy от 0 до 9, если это решатель непрерывного генетического алгоритма. Размер этого массива определяется количеством генов, с помощью которых вы инициализируете решатель, и каждая позиция в массиве соответствует другой переменной.
  • Он должен возвращать реальное число.

Внутренняя работа этой функции зависит от вас, чтобы решить. А затем вы передаете его объекту во время инициализации, например:

 from geneal.genetic_algorithms import ContinuousGenAlgSolver
from geneal.applications.fitness_functions.continuous import fitness_functions_continuous
    
    solver = ContinuousGenAlgSolver(
    n_genes=4, 
    fitness_function=my_fitness,
    pop_size=10,
    max_gen=200,
    mutation_rate=0.1,
    selection_rate=0.6,
    selection_strategy="roulette_wheel",
    problem_type=float, # Defines the possible values as float numbers
    variables_limits=(-10, 10) # Defines the limits of all variables between -10 and 10. 
                               # Alternatively one can pass an array of tuples defining the limits
                               # for each variable: [(-10, 10), (0, 5), (0, 5), (-20, 20)]
)
 

Я предлагаю вам ознакомиться с примерами, представленными в пакете, чтобы получить лучшее представление о том, как определить пользовательскую функцию фитнеса: примеры