首页 > 解决方案 > 在 scipy.optimize. 中使用回调函数在一定时间后停止进程

问题描述

我正在尝试使用scipy.optimize.differential_evolutioncallback方法中的参数来在某些指定参数之后停止最小化过程。max_time

下面的代码显然会callbackF()一次到达该函数,然后再也不会。

我在这里做错了什么?


from scipy.optimize import differential_evolution as DE
import time as t

# Max time in seconds
max_time = 3.

def callbackF(start_t):
    time_elapsed = t.time() - start_t
    if time_elapsed > max_time:
        print("Stop")
        return True

def DEdist(model):
    res = (1. - model[0])**2 + 100.0 * (model[1] - model[0]**2)**2 + \
        (1. - model[1])**2 + 100.0 * (model[2] - model[1]**2)**2
    return res

start_t = t.time()
bounds = [[0., 10.], [0., 10.], [0., 10.], [0., 10.]]
result = DE(
    DEdist, bounds, popsize=100, maxiter=1500, callback=callbackF(start_t))
print(t.time() - start_t)

标签: pythonscipy

解决方案


您正在从调用中传递返回值callbackF(start_t)。你想要的是传递函数本身。这是执行此操作的一种方法

from scipy.optimize import differential_evolution as DE
import time as t

# Max time in seconds
max_time = 3.

def get_callback(start_t):
    def callbackF(current_params, convergence):
        time_elapsed = t.time() - start_t
        if time_elapsed > max_time:
            print("Stop")
            return True
    return callbackF

def DEdist(model):
    res = (1. - model[0])**2 + 100.0 * (model[1] - model[0]**2)**2 + \
        (1. - model[1])**2 + 100.0 * (model[2] - model[1]**2)**2
    return res

start_t = t.time()
bounds = [[0., 10.], [0., 10.], [0., 10.], [0., 10.]]
result = DE(
    DEdist, bounds, popsize=100, maxiter=1500, callback=get_callback(start_t))
print(t.time() - start_t)

我添加了*args, **kwargs因为一些 kwarg 调用convergence被传入,我不想在文档中查找是否有其他任何东西传递给回调函数。

编辑 - 使函数签名更有意义。


推荐阅读