Когда я определяю пользовательский UDP, переменная self
внутри фитнес-функции относится к другому объекту, чем переменная self
, например, __init__
.Например, если у меня есть этот минимальный код с переменной self.counter
, которая увеличивается в каждой оценке пригодности, последняя print
выводит ноль в конце скрипта:
import pygmo as pg
class CostFunction:
def __init__(self, fn):
self.fn = fn
self.counter = 0
def fitness(self, x):
self.counter += 1
print(self.counter)
return self.fn(x)
def get_bounds(self):
return ([-10], [10])
def target_function(x):
return x**3 - x**2 + x
cf = CostFunction(target_function)
prob = pg.problem(cf)
pop = pg.population(prob, 50)
algo = pg.algorithm(pg.pso(gen=200))
algo.set_verbosity(10)
algo.evolve(pop)
print(cf.counter)
С другой стороныhand, print
внутри метода пригодности выводит правильно увеличенное значение.Кроме того, печать переменной self
из метода пригодности дает объект по другому адресу, чем self
из любого другого места.Может кто-нибудь объяснить, почему это реализовано таким образом и какой-то обходной путь?Мне нужны другие переменные, которые изменяются динамически, чтобы правильно вычислить значение пригодности.
Моя версия PyGMO - 2.10