2015-11-03 15 views
6

Tôi đang sử dụng SciPy để tối ưu hóa và phương pháp SLSQP dường như bỏ qua những ràng buộc của tôi.Scipy.optimize.minimize method = 'SLSQP' bỏ qua ràng buộc

Cụ thể, tôi muốn x [3] và x [4] để được trong khoảng [0-1]

Tôi nhận được thông báo: 'hạn chế bất bình đẳng không tương thích'

Đây là Kết quả của việc thực hiện tiếp theo là một ví dụ mã (sử dụng một chức năng dummy):

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 

đây là mã của tôi:

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) 

EDIT - Sự cố vẫn tiếp diễn khi ngay cả khi tháo ràng buộc đầu tiên.

Sự cố vẫn tiếp diễn khi tôi cố gắng sử dụng các biến số giới hạn. tức là,

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) 
+3

Tại sao bạn sử dụng chức năng vô nghĩa để tối ưu hóa? Nếu hàm chỉ trả về 'random()' (và đặc biệt, thậm chí không trả về các kết quả nhất quán cho cùng một đầu vào), tất nhiên SciPy sẽ bị lẫn lộn. – user2357112

+0

Vì lợi ích của ví dụ. Vấn đề này xảy ra bất kể chức năng tôi sử dụng. Tôi không nghĩ rằng đó là vấn đề @ user2357112 – Zahy

+0

Ít nhất trong các tài liệu scipy, khi sử dụng một lambda họ mất đau để trả về một np.array(), như: 'fun': lambda x: np.array ([x [ 0] ** 3 - x [1]]). –

Trả lời

0

Tôi biết đây là một câu hỏi rất cũ, nhưng tôi đã bị cuốn hút.

Khi nào điều đó xảy ra?

Sự cố này xảy ra khi hàm tối ưu không thể phân biệt một cách đáng tin cậy. Nếu bạn sử dụng một chức năng mượt mà như sau:

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

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

Sự cố sẽ biến mất.

Làm cách nào để áp đặt các ràng buộc cứng?

Lưu ý rằng không có thuật toán ràng buộc nào trong đảm bảo rằng hàm sẽ không bao giờ được đánh giá bên ngoài các ràng buộc. Nếu đây là một yêu cầu cho bạn, bạn nên sử dụng các phép biến đổi. Vì vậy, ví dụ để đảm bảo rằng không có giá trị âm cho x [3] đã từng được sử dụng, bạn có thể sử dụng phép biến đổi x3_real = 10^x[3]. Bằng cách này x [3] có thể là bất kỳ giá trị nào nhưng biến bạn sử dụng sẽ không bao giờ là số âm.

Phân tích sâu hơn

Điều tra mã Fortran cho slsqp mang lại những hiểu biết sau đây khi lỗi này xảy ra. Những thói quen trả về một biến MODE, có thể mất trên các giá trị:

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    * 

Phần mà gán chế độ 4 (đó là lỗi mà bạn đang nhận được) như sau:

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 

Vì vậy, về cơ bản bạn có thể thấy nó cố gắng tìm hướng gốc, nếu các ràng buộc đang hoạt động nó cố gắng đánh giá phái sinh dọc theo ràng buộc và thất bại với một ma trận số ít trong lsq subproblem (mode = 6), sau đó nó lý giải nếu tất cả các phương trình ràng buộc được đánh giá và không có lợi nhuận hướng đi gốc thành công, đây phải là một tập hợp trái ngược traints (mode = 4).

Các vấn đề liên quan