如何从池重用工人遗传算法

如何从池重用工人遗传算法

问题描述:

我对这个问题以前的相关的问题:Parallelize for loop in python如何从池重用工人遗传算法

我有一个遗传算法,我想通过并行的评价函数加快。 GA是一个类,代码如下所示:

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循环内为每一代创建了一组新的进程工作者。有没有办法重用这些工人,这样我可以加快速度?

+0

了什么是nprocs设置功能问题是否解决?在CPU,内存,IO或其他方面,'self.costly_function''昂贵'? –

+0

它设置为4,costly_function在CPU方面代价很高。 – Chicony

加入下面是我从https://stackoverflow.com/a/25385582/4759898

def __getstate__(self): 
    self_dict = self.__dict__.copy() 
    del self_dict['pool'] 
    return self_dict 

def __setstate__(self, state): 
    self.__dict__.update(state)