使用并行黑盒优化器的动态绘图

2024-07-02 14:12:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用matplotlibFuncAnimation函数来动态更新绘图线。在计算馈送给rbfopt的黑箱optimize方法的目标函数后,重新绘制该行。这里是PyPi documentation以及rbfoptuser manual

在我的例子中optimize方法是并行的,几个Stackoverflow线程表明Process/Queue工作流因此需要实现以更新绘图,因为matplotlib不是线程安全的

问题是我想将rbfoptoptimize方法视为“黑盒”,这意味着我不想编辑源代码。现在,我在optimize方法的目标函数中调用queue.put。然后在update_plot函数中调用queue.get,这需要在启动以rbfoptoptimize方法为目标的Process后执行。以下是一些伪代码:

def obj_func(..., queue):
    # run simulation that calculates new y_data for line
    queue.put(results_of_simulation)
    return results_of_simulation

def update_plot(..., queue):
   y_data = queue.get
   # set new ydata in figure

if name == '__main__':
    queue = Queue()
    # set up matplotlib figure
    # set up settings for algorithm

    # `functools`'s `partial` is used to pass `queue` to `obj_func`                                             
    bb = rbfopt.RbfoptUserBlackBox(..., obj_func)  
    alg = rbfopt.RbfoptAlgorithm(settings, bb)

    optimization = Process(target=alg.optimize)
    optimization.start() # /!\ throws error here /!\
    ani = FuncAnimation(fig, update_plot, blit=True, fargs=(..., queue,))
    plt.show()
    optimization.join()

不幸的是Process无法启动。我得到一个酸洗错误:

..\epcalibrator\calibration.py:94: in calibrate_model
    optimization.start()

..\..\..\..\Anaconda3\envs\epcalibrator\lib\multiprocessing\process.py:112: in start
    self._popen = self._Popen(self)

..\..\..\..\Anaconda3\envs\epcalibrator\lib\multiprocessing\context.py:223: in _Popen
    return _default_context.get_context().Process._Popen(process_obj)

..\..\..\..\Anaconda3\envs\epcalibrator\lib\multiprocessing\context.py:322: in _Popen
    return Popen(process_obj)

..\..\..\..\Anaconda3\envs\epcalibrator\lib\multiprocessing\popen_spawn_win32.py:89: in __init__
    reduction.dump(process_obj, to_child)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

obj = <Process(Process-3, initial)>, file = <_io.BufferedWriter name=10>
protocol = None

    def dump(obj, file, protocol=None):
        '''Replacement for pickle.dump() using ForkingPickler.'''
>       ForkingPickler(file, protocol).dump(obj)
E       TypeError: cannot serialize '_io.TextIOWrapper' object

..\..\..\..\Anaconda3\envs\epcalibrator\lib\multiprocessing\reduction.py:60: TypeError

我无法理解错误所指的文件。以前是否有人能够使用并行黑盒优化器动态绘制结果


Tags: 方法函数inpyobjqueuelibmultiprocessing