如何在scipy.optimize.differential_evolution

时间:2019-07-16 12:36:10

标签: python scipy scipy-optimize differential-evolution

我正在使用来自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
   '''

它抛出一个错误。

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

2 个答案:

答案 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),