【问题标题】:callback function throws a error in scipy.optimize.minimize class回调函数在 scipy.optimize.minimize 类中引发错误
【发布时间】:2019-09-29 01:31:19
【问题描述】:

我正在使用 scipy.minimize 来解决优化问题。

这是我的代码


import numpy as np
from scipy.optimize import minimize
from scipy.optimize import Bounds

#bounds = Bounds([25, 36], [26, 38],[10,27],[6,28],[0,1800],[0,800],[0,100],[25,60],[2,7])

bounds = Bounds([20,6,20,23],[35,9,50,26])

energy_history = []
x_values = []

def objective(x):
    return (-0.20859863*x[0:1] -1.5088649*x[1:2] +0.10707853*x[2:3] +1.6829923*x[3:4] -0.008870916*x[0:1]*x[1:2] + 0.0007393111*x[0:1]*x[2:3] +0.010610705*x[0:1]*x[3:4] + 0.005123541*x[1:2]*x[2:3] +  0.086458616*x[1:2]*x[3:4] -0.007695199*x[2:3]*x[3:4] + 0.00016993227*x[0:1]*x[0:1] -0.026582083*x[1:2]*x[1:2]  + 0.00014467833*x[2:3]*x[2:3] -0.051599417*x[3:4]*x[3:4] - 9.540932)

def callback(x):
    fobj = objective(x)
    x_values.append(x)
    energy_history.append(fobj)


x0 = np.array([34,8,49,25])
res = minimize(objective, x0, method='trust-constr',
               options={'verbose': 1}, bounds=bounds,callback=callback)



optimal_values= res.x

print('optimal values found: ' + str(res.x))
print('energy consumed: ' + str(res.fun))

我在运行时遇到错误。

错误在于回调函数,它说

TypeError: callback() takes 1 positional argument but 2 were given

我哪里错了?

【问题讨论】:

    标签: python-3.x optimization scipy scipy-optimize scipy-optimize-minimize


    【解决方案1】:

    根据docs,回调函数签名取决于选择的求解器。 (这不是很好。)

    虽然对于所有其他人来说它是callback(x),但在你的情况下它是callback(x, status),因为你正在使用method='trust-constr'

    只需将此附加参数添加到您的参数中(如果您不需要状态信息,请忽略它)。

    【讨论】:

    • 谢谢!!此外,对于不同的初始值,我得到了不同的最佳值,在我的情况下是 x0。知道为什么会这样。尝试浏览文档但一无所获。
    • 因为那里的所有求解器都只提供局部收敛。如果您的优化问题是非凸的(您正在乘以变量),这是正常的。有一个 全局求解器 的概念,但不在 scipy 中,并且局部收敛与非凸问题的全局收敛被简化为 P 与 NP 的事情。
    • 啊!!我的优化问题是一个非凸问题。您能否建议我应该使用哪些算法/包来获得非凸问题的良好结果。
    • 或任何我可以参考的链接?
    • 那些更难使用(如果有的话,python-lib 的进化程度较低;很多可能出错的东西:例如梯度计算)。关键字全局优化将导致包括调查在内的论文。一个流行的开源求解器是couennePyomo 可能是在 python 中访问它的最轻松的库。
    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 2018-11-06
    • 2021-03-28
    • 2013-07-02
    • 2014-01-11
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    相关资源
    最近更新 更多