我有以下简单的python代码:
from scipy.optimize import minimize
def cons_function(x):
return x[0] - 1000
def objective(x):
a = x[0]
return a ** 5
x0 = [0]
cons_dict = [{'type':'ineq', 'fun': cons_function}]
res = minimize(objective, x0, constraints=cons_dict)
print('x: ', res.x)
print('fun: ',res.fun)
产出如下:
x: [-2.64828354e+12]
fun: -1.3026339977067573e+62
但是x
的值应该大于1000
。目标函数的最小值为10e+15
。
发布于 2022-07-23 14:51:47
您最初的猜测是x0是不可行的,通过检查返回优化结果res
可以看出与约束相矛盾。
fun: -1.3026339977067573e+62
jac: array([2.45939306e+50])
message: 'Inequality constraints incompatible'
nfev: 50
nit: 16
njev: 15
status: 4
success: False
x: array([-2.64828354e+12])
您总是必须使用满足所有约束条件的可行的初始猜测。还请注意,您的约束是变量上的一个简单绑定,因此建议将其作为一个绑定传递,而不是更一般的约束:
from scipy.optimize import minimize
def objective(x):
a = x[0]
return a ** 5
# 1000 <= x[0] <= None is equivalent to 1000 <= x[0] <= Inf
bounds = [(1000, None)]
x0 = [1002]
res = minimize(objective, x0, bounds=bounds)
print('x: ', res.x)
print('fun: ',res.fun)
发布于 2022-07-23 14:31:55
请检查您正在使用的方法的文档。根据优化方法的不同,使用甚至忽略了约束。https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
备注
如果未给出
,则选择为BFGS、L B、SLSQP之一,这取决于问题是否具有约束或边界。
https://stackoverflow.com/questions/73091499
复制相似问题