2015-11-03 66 views
6

私は最適化のためにSciPyを使用していますが、SLSQPは自分の制約を無視するようです。Scipy.optimize.minimize method = 'SLSQP'は制約を無視します

具体的には、私はメッセージを取得しています

[0-1]×[3]及びX [4]の範囲内であることがしたい: '不等式制約は、互換性のない'

をここにありますサンプルコードに続く実行の結果(ダミー関数を使用):ここ

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) 

EDIT- 最初の制約を削除しても問題は解決しません。

境界値変数を使用しようとすると問題は解決しません。 すなわち、

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

なぜ無意味な関数を使用して最適化していますか?関数が 'random()'を返すだけであれば(特に、同じ入力に対して一貫した結果を返していない)、もちろんSciPyは混乱するでしょう。 – user2357112

+0

例のために。この問題は、使用する関数に関係なく発生します。私はそれが問題だとは思わない@ user2357112 – Zahy

+0

少なくともscipyのドキュメントでは、lambdaを使うときに、np.array()を返すのに苦労する: 'fun':lambda x:np.array([x [ 0] ** 3 - x [1]])。 –

答えて

0

私は、これは非常に古い質問ですけど、私は興味をそそられました。

いつ発生しますか?

この問題は、最適化機能が確実に区別できない場合に発生します。このような素敵なスムーズな関数を使用すると:

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

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

問題が解消します。

どのようにハード制約を課すのですか?

の制約付きアルゴリズムのどれも、関数が制約の外で決して評価されないことを保証していないことに注意してください。これが必要な場合は、むしろ変換を使用する必要があります。したがって、x [3]の負の値が使用されないようにするには、変換x3_real = 10^x[3]を使用します。このようにx [3]は任意の値にできますが、使用する変数は決して負ではありません。

slsqpのためのFortranコードの調査より深い分析が

このエラーが発生したときに、以下の知見が得られます。次のようにモード4を(あなたが取得しているエラーである)を割り当て部分がある

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    * 

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 

だから、基本的にこれらの値を取ることができるMODE変数、リターンします制約がアクティブであれば制約に沿って派生評価を試み、lsqサブ問題(​​)の特異行列では失敗すると、すべての制約式が評価され、何も出されなかった場合成功した降下の方向性、これは矛盾した一組の短所でなければならないtraints(mode = 4)。

関連する問題