Пользовательский UDP PyGMO, само в фитнесе относится к другому объекту, чем остальная часть класса - PullRequest
0 голосов
/ 25 января 2019

Когда я определяю пользовательский 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

...