如何在Python 3.10中并行运行两种全局优化算法?
并行运行全局优化器的实现方案
全局优化属于CPU密集型任务,受Python GIL限制,多线程无法有效提升效率,因此采用多进程实现并行,同时让每个进程的输出独立,方便在不同窗口查看进度。
修改思路
- 将两个优化任务封装为独立函数,让每个函数在单独进程中运行
- 利用进程独立输出流或日志文件分离进度信息,实现不同窗口查看各自优化进度
修改后的代码
import multiprocessing from scipy.optimize import basinhopping import dlib # 假设你的目标优化函数已定义(替换为实际逻辑) def opt(x): return (x[0]-0.3)**2 + (x[1]-0.6)**2 + (x[2]-0.8)**2 def opt_dlib(x): # dlib默认求最大值,若原opt是求最小值,返回其负值 return -opt(x) # 封装basinhopping优化任务 def run_basinhopping(): def build_show_bh(MIN=None): if MIN is None: MIN = [0] def fn(xx, f, accept): if f < MIN[-1]: print(f"[basinhopping] 新最优解: {[round(x, 2) for x in xx]}, 目标值: {f}") MIN.append(f) return fn x0 = (0.5, 0.5, 0.5) bounds = [(0,1)]*3 minimizer_kwargs = dict(method="L-BFGS-B", bounds=bounds) progress_f = [0] c = build_show_bh(progress_f) print("=== 启动basinhopping优化 ===") res = basinhopping( opt, x0, minimizer_kwargs=minimizer_kwargs, niter=10, callback=c, disp=True ) print(f"basinhopping完成,最优目标值追踪: {progress_f}") return res # 封装dlib优化任务 def run_dlib(): lower_bounds = [0]*3 upper_bounds = [1]*3 print("=== 启动dlib全局优化 ===") x, y = dlib.find_max_global(opt_dlib, lower_bounds, upper_bounds, 10) print(f"dlib完成,最优输入: {x}, 目标值: {y}") return x, y if __name__ == "__main__": # 创建两个进程分别运行优化任务 p1 = multiprocessing.Process(target=run_basinhopping) p2 = multiprocessing.Process(target=run_dlib) # 启动进程 p1.start() p2.start() # 可选:等待进程全部结束后再退出主进程 p1.join() p2.join()
不同窗口查看进度的方法
- 终端多窗口运行:将两个优化任务拆分为独立脚本(如
run_bh.py和run_dlib.py),在两个终端窗口分别执行,每个窗口仅显示对应优化器的输出 - 日志文件实时监控:在每个任务函数开头添加输出重定向到独立日志文件,再用
tail -f 日志文件名命令在不同窗口实时查看进度 - IDE多控制台:使用PyCharm等IDE时,为两个任务分别创建运行配置,每个配置对应独立控制台窗口
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

