当我尝试最小化目标函数时,SciPy约束无法正常工作

4dbbbstv  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(143)

下面是一个简单的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

vm0i2vca

vm0i2vca1#

您的初始猜测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)
f4t66c6m

f4t66c6m2#

请查看文档以了解您正在使用的方法。根据优化方法的不同,会使用或甚至忽略约束。https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
备注
如果没有给出,则根据问题是否有约束或边界,选择BFGS、L-BFGS-B、SLSQP中的一个。

相关问题