我正在使用来自scipy.optimize的differential_evolution解决我的优化问题。我的优化程序接受了一些优化参数。
代码-
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
'''
它抛出一个错误。
将参数传递给回调函数的正确方法是什么?
答案 0 :(得分:2)
这是不可能的。您只能使用提供给您的两个值。回调的目的是按照您的优化进行操作,如果您根据返回的满足条件({{1})选择这样做,则尽早停止优化。
有关更多详细信息,请参见reference中的描述:
callback:可调用,callback(xk,convergence = val),可选
跟踪最小化进度的功能。 xk是x0的当前值。 val表示总体收敛的分数。当val大于1时,函数停止。如果回调返回True,则最小化将停止(仍然进行任何抛光)。
如果您确实需要使用参数,则应该直接从函数内部访问它们。
答案 1 :(得分: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),