Python 如何在scipy.optimize.differential_evolution中将参数传递给回调函数

Python 如何在scipy.optimize.differential_evolution中将参数传递给回调函数,python,scipy,scipy-optimize,differential-evolution,Python,Scipy,Scipy Optimize,Differential Evolution,我使用scipy.optimize中的差分进化来解决我的优化问题。我的优化器为优化提供了一些参数 代码- res = optimize.differential_evolution(objective,bounds,args=arguments,disp=True,callback = callback_DE(arguments)) 我还有一个回调函数。我想将参数发送到回调函数,这就是我的问题所在 如果我没有将任何参数传递给回调函数,它可以正常工作- def callback_DE(x,con

我使用scipy.optimize中的差分进化来解决我的优化问题。我的优化器为优化提供了一些参数

代码-

res = optimize.differential_evolution(objective,bounds,args=arguments,disp=True,callback = callback_DE(arguments))
我还有一个回调函数。我想将参数发送到回调函数,这就是我的问题所在

如果我没有将任何参数传递给回调函数,它可以正常工作-

def callback_DE(x,convergence):        
   '''
   some code
   '''
但是,如果我将
参数
作为函数定义中的参数,如-

def callback_DE(x,convergence,arguments):        
   '''
   some code
   '''
它抛出了一个错误


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

这是不可能的。您只能使用提供给您的两个值。回调的目的是跟踪您的优化,如果您根据它满足的某些条件选择提前停止优化,则返回
True

有关更多详细信息,请参见中的说明:

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

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


如果您确实需要使用参数,您应该直接从函数内部访问它们。

这是不可能的。您只能使用提供给您的两个值。回调的目的是跟踪您的优化,如果您根据它满足的某些条件选择提前停止优化,则返回
True

有关更多详细信息,请参见中的说明:

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

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


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

当然,我找到了一种方法。您需要使用functools.partial来实现这一点

以下是一个小例子:

从functools导入部分
#具有两个“不需要的”参数的回调函数
def print_fun_DE(xk、收敛、名称、方法):
print({}by{}:x={}on convergence={}.格式(名称、方法、xk、convergence))
#我们调用此回调函数的方式:
callback=partial(print\u fun\u DE,name=data\u name,method=method),

自然而然,我找到了一种方法。您需要使用functools.partial来实现这一点

以下是一个小例子:

从functools导入部分
#具有两个“不需要的”参数的回调函数
def print_fun_DE(xk、收敛、名称、方法):
print({}by{}:x={}on convergence={}.格式(名称、方法、xk、convergence))
#我们调用此回调函数的方式:
callback=partial(print\u fun\u DE,name=data\u name,method=method),

有两条建议可以让别人更容易地帮助你:(1)阅读并相应地更新你的问题;(2) 你说“它抛出了一个错误”,但这还不够告诉我们。无论何时报告Python错误,都要在问题中包含完整的回溯(即完整的错误消息)。其中包含有用的信息。
optimize
使用定义的参数集调用回调。你无法控制。你定义了接受所给的功能。两条建议可以让别人更容易地帮助你:(1)阅读并相应地更新你的问题;(2) 你说“它抛出了一个错误”,但这还不够告诉我们。无论何时报告Python错误,都要在问题中包含完整的回溯(即完整的错误消息)。其中包含有用的信息。
optimize
使用定义的参数集调用回调。你无法控制。您可以定义函数来接受给定的内容。