0

我正在使用来自 scipy.optimize 的差分进化来解决我的优化问题。我的优化器需要一些参数进行优化。

代码 -

res = optimize.differential_evolution(objective,bounds,args=arguments,disp=True,callback = callback_DE(arguments))

我还有一个回调函数。我想将我的参数发送到我的回调函数,这就是我的问题出现的地方。

如果我不将任何参数传递给我的回调函数,它工作正常 -

def callback_DE(x,convergence):        
   '''
   some code
   '''

但是,如果我arguments在函数定义中作为参数给出 -

def callback_DE(x,convergence,arguments):        
   '''
   some code
   '''

它抛出一个错误。

将参数传递给回调函数的正确方法是什么?

4

2 回答 2

2

这是不可能的。您只能使用提供给您的两个值。回调的重点是遵循您的优化,如果您根据它满足的某些条件选择这样做,则提前停止它,方法是返回True.

有关详细信息,请参阅参考中的描述:

回调:可调用,回调(xk,收敛=val),可选

跟踪最小化进度的功能。xk 是 x0 的当前值。val 表示总体收敛的小数值。当 val 大于 1 时,函数停止。如果回调返回 True,则停止最小化(仍然进行任何抛光)。

如果你真的需要使用参数,你应该直接从函数内部访问它们。

于 2019-07-16T13:05:54.533 回答
0

准确地说,我找到了一种方法来做到这一点。您需要使用 functools.partial 来实现。

下面是一个小例子:

    from functools import partial
    # the callback function with two 'undesired' arguments
    def print_fun_DE(xk, convergence, name, method):
    print('for {} by {} : x= {} on convergence = {} '.format(name, method, xk,convergence))
    # the way we call this callback function:
    callback=partial(print_fun_DE, name=data_name, method=method),
于 2021-04-25T07:00:55.457 回答