python - 在 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)
解决方案
您正在从调用中传递返回值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
被传入,我不想在文档中查找是否有其他任何东西传递给回调函数。
编辑 - 使函数签名更有意义。
推荐阅读
- javascript - 在我的起始日期选择框中,我想显示当前会话日期范围之间的日期范围
- javascript - 上传时显示预览图
- xpath - 如何在 Odoo 中使用 xpath 替换同名的第二个按钮
- latex - 如何从乳胶的侧边栏中删除作者姓名?
- java - int 和 Integer 影响并发结果
- php - fpdf 库在 WAMP 服务器上不起作用
- android - 谷歌云端硬盘同意屏幕卡住
- powershell - 如何从域范围的 PowerShell 脚本中排除单个特定机器
- java - 当孩子和父母都使用 JPA Hibernate 存储在同一个表中时,在当前和所有连续的父母中搜索提供的值
- sql-server - 如何从一些非常大(1GB -5GB)的供应商的新旧excel表中插入?