Я использую библиотеку DEAP в python для многоцелевой оптимизации. Я хотел бы использовать несколько процессоров для этой задачи; однако, у меня проблемы.Программирование DEAP со Scoop
Чтобы дать некоторый контекст, я использую networkx в сочетании с DEAP. Я также определяю функции функции фитнеса, кроссовера и мутации (которые я не буду показывать здесь по определенным причинам).
Это говорит here, что все, что мне нужно сделать, это установить Scoop и добавить строки
from scoop import futures
toolbox.register("map", futures.map)
Однако я, кажется, получаю сообщение об ошибке:
scoop._comm.scoopexceptions.ReferenceBroken: 'module' object has no attribute 'Chromosome'
После выполнения некоторого рытья, я нашел что мне нужно переместить вызовы creator.create в основном модуле, как указано here.
После этого, я получаю другую ошибку:
scoop._comm.scoopexceptions.ReferenceBroken: This element could not be pickled: FutureId(worker='127.0.0.1:49663', rank=1):partial(<Chromosome representation of a solution here>)=None
Я не совсем знаком с параллельными вычислениями, и я не совсем уверен, что это означает, что с помощью «не может быть маринованные». Полный код можно увидеть здесь с некоторыми изменениями:
def genetic(network, creator, no_sensors, sfpd, lambda1, lambda2, lambda3, k):
locations = network.graph.nodes()
#move creator.create calls to the main module
########################################
creator.create("FitnessMax", base.Fitness, weights=(lambda1, -lambda2, lambda3))
creator.create("Chromosome", list, fitness=creator.FitnessMax)
########################################
toolbox = base.Toolbox()
toolbox.register("attr_item", random.sample, locations, no_sensors)
toolbox.register("chromosome", tools.initRepeat, creator.Chromosome, toolbox.attr_item, n=1)
toolbox.register("population", tools.initRepeat, list, toolbox.chromosome)
toolbox.register("map", futures.map) #######<-- this line ##############
def evaluate(chromosome):
#fitness function defined here
# Crossover
def crossover(chromosome1, chromosome2): # Uniform Crossover
#crossover is defined here
# Mutation
def mutation(chromosome):
#mutation is defined here
toolbox.register("evaluate", evaluate)
toolbox.register("mate", crossover)
toolbox.register("mutate", mutation)
toolbox.register("select", tools.selNSGA2)
random.seed(64)
pop = toolbox.population(n=MU)
hof = tools.ParetoFront()
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", numpy.mean, axis=0)
stats.register("min", numpy.min, axis=0)
stats.register("max", numpy.max, axis=0)
algorithms.eaMuPlusLambda(pop, toolbox, MU, LAMBDA, CXPB, MUTPB, NGEN, stats, halloffame=hof)
return list(hof)
Спасибо, и любое понимание будет очень ценным.
Не могли бы вы предоставить рабочий минимальный пример с использованием встроенной функции карты (без использования совок)? – Ohjeah
Я использую алгоритм eaMuPlusLambda, который использует встроенную функцию карты. Есть ли способ распараллеливать это? – meraxes
Без минимального примера вы не можете рассчитывать на большую помощь. Альтернативой scoop являются dask.distributed, ipyparallel или multiprocessing (на укропе). Все они приходят с плюсами и минусами. – Ohjeah