如何重用池中的工人进行遗传算法
How to reuse workers from Pool for a genetic algorithm
我之前有一个关于这个问题的相关问题:
我有一个遗传算法,我试图通过并行化评估函数来加快速度。 GA 是 class,代码看起来像这样:
copy_reg.pickle(types.MethodType,lambda method: (getattr, (method.im_self, method.im_func.__name__)),getattr)
class GA:
...
...
def evaluation(self):
self.scores = Pool(processes=nprocs).map(self.costly_function,self.population)
def run(self):
self.initial_population()
self.evaluation()
while self.Gen > i:
self.select()
self.crossover()
self.mutation()
self.evaluation()
i += 1
与顺序方法相比,这给出了正确的结果,但速度明显较慢。我的猜测是,这是因为我在函数 evaluation
的 while 循环内为每一代创建了一组新的流程工作者。有没有一种方法可以重用工人,这样我就可以加快速度?
通过添加我从
获得的函数解决了问题
def __getstate__(self):
self_dict = self.__dict__.copy()
del self_dict['pool']
return self_dict
def __setstate__(self, state):
self.__dict__.update(state)
我之前有一个关于这个问题的相关问题:
我有一个遗传算法,我试图通过并行化评估函数来加快速度。 GA 是 class,代码看起来像这样:
copy_reg.pickle(types.MethodType,lambda method: (getattr, (method.im_self, method.im_func.__name__)),getattr)
class GA:
...
...
def evaluation(self):
self.scores = Pool(processes=nprocs).map(self.costly_function,self.population)
def run(self):
self.initial_population()
self.evaluation()
while self.Gen > i:
self.select()
self.crossover()
self.mutation()
self.evaluation()
i += 1
与顺序方法相比,这给出了正确的结果,但速度明显较慢。我的猜测是,这是因为我在函数 evaluation
的 while 循环内为每一代创建了一组新的流程工作者。有没有一种方法可以重用工人,这样我就可以加快速度?
通过添加我从
获得的函数解决了问题def __getstate__(self):
self_dict = self.__dict__.copy()
del self_dict['pool']
return self_dict
def __setstate__(self, state):
self.__dict__.update(state)