SciPy 优化器给出了不满足约束的结果

SciPy Optimizer gives result that do not satisfy constraints

我正在使用scipy.optimize.minimize解决一个问题,但是包给出的结果违反了约束

这种情况非常简单,只给出了一个 objective 函数和一个约束。这是代码:

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

   def objective(x):
       return np.sum(np.dot(x,x))
   n = 5
   X_bound=[(0,4) for i in range(n)]
   X_guess=[1 for i in range(n)]
   _tmp = []
  func_list = []

  def temp_func(X):
      total = 0
      for i in range(n):
          total = total + np.maximum(X[i] * 5 - 6, 0)
      return total/n - 1
  func_list.append(temp_func)
  for ii in range(len(func_list)):
  _tmp.append({'type': 'ineq', 'fun': func_list[ii]})
  X_constraint=_tmp

  sol=scipy.optimize.minimize(objective,X_guess,method='SLSQP',bounds=X_bound,
                        constraints=X_constraint)
  result = sol.x
  result

以上代码给出的结果为

array([5.61582806e-12, 3.56925226e-12, 3.57912934e-12, 3.57912933e-12, 3.57872619e-12])

这显然违反了一个(也是唯一的)约束条件。

知道我做错了什么吗?谢谢

优化未成功。您可以看到解决方案报告失败...至少它知道它无法满足约束条件。

>>> result
array([5.61582806e-12, 3.56925226e-12, 3.57912934e-12, 3.57912933e-12,
       3.57872619e-12])
>>> temp_func(result)
-1.0
>>> sol
     fun: 8.270470124157974e-23
     jac: array([1.49123928e-08, 1.49082997e-08, 1.49083195e-08, 1.49083195e-08,
       1.49083186e-08])
 message: 'Iteration limit exceeded'
    nfev: 1697
     nit: 101
    njev: 101
  status: 9
 success: False
       x: array([5.61582806e-12, 3.56925226e-12, 3.57912934e-12, 3.57912933e-12,
       3.57872619e-12])

优化失败的原因是约束中的最大值函数。 Sequential quadratic programming 基于约束的线性化。在本地,(未满足的)约束线性化为一个常数值,因此迭代解决方案看不到任何方式来满足该约束 - 每次迭代都会减少 objective 而不会在解决方案方面取得进展。

我将约束更改为在区域中不平坦,以允许算法逐步改进它并且优化成功。

def temp_func(X):
  total = 0
  for i in range(n):
      val = total+X[i]*5 - 6
      if val < 0:
        val = np.arctan(val)
      total = val
  return total/n - 1

这可能是您实际尝试强制执行的约束,但也许您可以顺利地接近您的约束并获得成功。