如何结合joblib.parallel实现differential_evolution差分进化并行优化
问题原因分析
- 传参错误:调用
delayed(differential_evolution)((rosen, bounds))时,你把rosen和bounds打包成了一个元组作为第一个参数传入differential_evolution,不符合函数的入参要求,因此代码直接报错。 n_jobs=1等价于串行执行,没有实现并行效果。- 额外说明:
scipy.optimize.differential_evolution本身已经内置了并行能力,不需要额外封装joblib即可实现内部计算的并行。
解决方案
方案1:直接使用differential_evolution内置并行参数(推荐)
scipy 1.2.0及以上版本的差分进化函数提供了workers参数,直接指定并行进程数即可,无需引入额外依赖:
from scipy.optimize import rosen, differential_evolution bounds = [(0,2) for _ in range(5)] # workers设为-1时会自动使用设备所有可用CPU核心 result = differential_evolution(rosen, bounds, workers=-1) print(result)
这种方式并行的是每一代种群的适应度计算,是单次优化任务内部的并行,性能损耗最低。
方案2:使用joblib实现多轮优化任务并行
如果你需要并行执行多个独立的差分进化优化任务(比如多次重复实验取最优结果),可以用修正后的joblib写法:
from scipy.optimize import rosen, differential_evolution from joblib import Parallel, delayed bounds = [(0,2) for _ in range(5)] # 并行执行5次独立的优化任务,使用所有CPU核心 results = Parallel(n_jobs=-1)(delayed(differential_evolution)(rosen, bounds) for _ in range(5)) # 遍历输出所有结果 for i, res in enumerate(results): print(f"第{i+1}次优化结果:\n{res}\n")
注意这里调用delayed包装的函数时,参数需要分开传入,不要额外套一层括号打包成元组。
内容的提问来源于stack exchange,提问作者Charith
相关产品推荐
相关产品推荐

