簡體   English   中英

Scipy.optimize.minimize method ='SLSQP'忽略約束

[英]Scipy.optimize.minimize method='SLSQP' ignores constraint

我正在使用SciPy進行優化,SLSQP方法似乎忽略了我的約束。

具體來說,我希望x [3]和x [4]在[0-1]的范圍內

我收到的消息是:'不平等約束不兼容'

以下是執行結果,后跟示例代碼(使用虛函數):

  status: 4
  success: False
njev: 2
nfev: 24
 fun: 0.11923608071680103
   x: array([-10993.4278558 , -19570.77080806, -23495.15914299, -26531.4862831 ,
     4679.97660534])
message: 'Inequality constraints incompatible'
 jac: array([ 12548372.4766904 ,  12967696.88362279,  39928956.72239509,
    -9224613.99092537,   3954696.30747453,         0.        ])
 nit: 2

這是我的代碼:

from random import random
from scipy.optimize import minimize

def func(x):
   """ dummy function to optimize """
   print 'x'+str(x)
   return random()

my_constraints = ({'type':'ineq', 'fun':lambda(x):1-x[3]-x[4]},
                  {'type':'ineq', 'fun':lambda(x):x[3]},
                  {'type':'ineq', 'fun':lambda(x):x[4]},
                  {'type':'ineq', 'fun':lambda(x):1-x[4]},
                  {'type':'ineq', 'fun':lambda(x):1-x[3]})

minimize(func, [57.9499 ,-18.2736,1.1664,0.0000,0.0765],
         method='SLSQP',constraints=my_constraints)

編輯 - 即使刪除第一個約束,問題仍然存在。

當我嘗試使用bounds變量時問題仍然存在。

bounds_pairs = [(None,None),(None,None),(None,None),(0,1),(0,1)]
minimize(f,initial_guess,method=method_name,bounds=bounds_pairs,constraints=non_negative_prob)

我知道這是一個非常古老的問題,但我很感興趣。

它什么時候發生?

當優化功能不可靠地可區分時,會發生此問題。 如果你使用這樣一個很好的平滑函數:

opt = numpy.array([2, 2, 2, 2, 2])

def func(x):
   return sum((x - opt)**2)

問題消失了。

我如何施加硬約束?

請注意, scipy.minimize中的約束算法都不能保證函數永遠不會在約束之外進行求值。 如果這是您的要求,您應該使用轉換。 因此,例如,為了確保不使用x [3]的負值,可以使用變換x3_real = 10^x[3] 這樣x [3]可以是任何值,但你使用的變量永遠不會是負數。

更深入的分析

調查slsqp的Fortran代碼可以獲得有關何時發生此錯誤的以下見解。 例程返回一個MODE變量,該變量可以采用以下值:

C*        MODE = -1: GRADIENT EVALUATION, (G&A)                        *
C*                0: ON ENTRY: INITIALIZATION, (F,G,C&A)               *
C*                   ON EXIT : REQUIRED ACCURACY FOR SOLUTION OBTAINED *
C*                1: FUNCTION EVALUATION, (F&C)                        *
C*                                                                     *
C*                   FAILURE MODES:                                    *
C*                2: NUMBER OF EQUALITY CONTRAINTS LARGER THAN N       *
C*                3: MORE THAN 3*N ITERATIONS IN LSQ SUBPROBLEM        *
C*                4: INEQUALITY CONSTRAINTS INCOMPATIBLE               *
C*                5: SINGULAR MATRIX E IN LSQ SUBPROBLEM               *
C*                6: SINGULAR MATRIX C IN LSQ SUBPROBLEM               *

分配模式4的部分(這是你得到的錯誤)如下:

C   SEARCH DIRECTION AS SOLUTION OF QP - SUBPROBLEM

      CALL dcopy_(n, xl, 1, u, 1)
      CALL dcopy_(n, xu, 1, v, 1)
      CALL daxpy_sl(n, -one, x, 1, u, 1)
      CALL daxpy_sl(n, -one, x, 1, v, 1)
      h4 = one
      CALL lsq (m, meq, n , n3, la, l, g, a, c, u, v, s, r, w, iw, mode)

C   AUGMENTED PROBLEM FOR INCONSISTENT LINEARIZATION

      IF (mode.EQ.6) THEN
          IF (n.EQ.meq) THEN
              mode = 4
          ENDIF
      ENDIF

所以基本上你可以看到它試圖找到一個下降方向,如果約束是活動的,它會嘗試沿約束進行衍生評估,並在lsq子問題( mode = 6 )中使用奇異矩陣失敗,那么它會導致所有約束方程如果進行評估並且沒有一個成功下降方向,這必然是一組相互矛盾的約束( mode = 4 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM