2015-11-03 8 views
6

मैं ऑप्टिमाइज़ेशन के लिए SciPy का उपयोग कर रहा हूं और विधि SLSQP मेरी बाधाओं को अनदेखा कर रहा है।Scipy.optimize.minimize method = 'SLSQP' बाधा को अनदेखा करता है

विशेष रूप से, मैं एक्स [3] और एक्स [4] सीमा [0-1]

मुझे संदेश मिल रहा में रहना चाहता हूँ: 'असमानता की कमी असंगत'

यहाँ है निष्पादन एक उदाहरण कोड के बाद के परिणाम (एक डमी फ़ंक्शन का उपयोग करता):

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) 
:

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 

यहाँ मेरी कोड है

संपादित करें - समस्या तब भी बनी रहती है जब पहली बाधा को हटाते समय भी।

समस्या तब होती है जब मैं सीमा चर का उपयोग करने का प्रयास करता हूं। अर्थात,

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

आप ऑप्टिमाइज़ करने के लिए एक गैर-कार्यशील फ़ंक्शन का उपयोग क्यों कर रहे हैं? यदि फ़ंक्शन केवल 'यादृच्छिक() '(और विशेष रूप से, उसी इनपुट के लिए लगातार परिणाम भी नहीं लौटाता है), निश्चित रूप से SciPy भ्रमित हो जा रहा है।उदाहरण के लिए – user2357112

+0

। यह समस्या मेरे द्वारा उपयोग किए जाने वाले फ़ंक्शन के बावजूद होती है। मुझे नहीं लगता कि यह समस्या है @ user2357112 – Zahy

+0

कम से कम scipy दस्तावेज़ों में, एक लैम्ब्डा का उपयोग करते समय वे एक np.array(), जैसे 'मजेदार': lambda x: np.array ([x [ 0] ** 3 - एक्स [1]])। –

उत्तर

0

मैं जानता हूँ कि यह एक बहुत पुरानी सवाल है, लेकिन मैं intrigued गया था।

ऐसा कब होता है?

यह समस्या तब होती है जब अनुकूलन फ़ंक्शन विश्वसनीय रूप से भिन्न नहीं होता है। यदि आप इस तरह एक अच्छा चिकनी फ़ंक्शन का उपयोग करते हैं:

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 के लिए फोरट्रान कोड की जांच पैदावार जब यह त्रुटि आती में निम्नलिखित अंतर्दृष्टि। दिनचर्या एक 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 subproblem (mode = 6) में एकवचन मैट्रिक्स के साथ विफल रहता है, तो इसका कारण यह है कि यदि सभी बाधा समीकरणों का मूल्यांकन किया गया और कोई भी उपज नहीं हुआ सफल मूल दिशा निर्देश, यह विपक्ष का एक विरोधाभासी सेट होना चाहिए ट्रेन (mode = 4)।

संबंधित मुद्दे