2016-12-19 7 views
13

मैं सीवीएक्सओपीटी में सीखने के अभ्यास के रूप में निम्नलिखित कोशिश कर रहा हूं। मैंने असमानता बाधाओं को दूर करके और कुछ और समानता बाधाओं को जोड़कर उदाहरण कोड here में मामूली संशोधन किए हैं।सीवीएक्सओपीटी केवल समानता बाधाओं के साथ

from cvxopt import solvers, blas, matrix, spmatrix, spdiag, log, div 
solvers.options['show_progress'] = False 
import numpy as np  
np.random.seed(1) 

# minimize  p'*log(p) 
# subject to 
#    sum(p) = 1 
#    sum(p'*a) = target1 
#    sum(p'*max(a-K,a^2)) = target2 

a = np.random.randint(20, 30, size=500) 
target1 = 30 
target2 = 0.60 
K = 26 

A = matrix(np.vstack([np.ones(500), a, np.array([max(x-K,x*x) for x in a])])) 
b = matrix([1.0, target1, target2]) 

n = 500 
def F(x=None, z=None): 
    if x is None: return 0, matrix(1.0, (n,1)) 
    if min(x) <= 0: return None 
    f = x.T*log(x) 
    grad = 1.0 + log(x) 
    if z is None: return f, grad.T 
    H = spdiag(z[0] * x**-1) 
    return f, grad.T, H 
sol = solvers.cp(F, A=A, b=b) 
p = sol['x'] 

लेकिन जब मैं प्रदर्शन निम्नलिखित:

np.sum(p) 
243.52686763225338 

यह अनुकूलन के पहले बाधा उल्लंघन किया है। मैं यह समझने में सक्षम नहीं हूं कि यहां क्या गलत हो रहा है। (कृपया ध्यान दें के बाद से मैं यादृच्छिक संख्या का उपयोग कर रहा चर a अपने np.sum(p) विभिन्न मूल्यों का उत्पादन करेगा उत्पन्न करने के लिए, लेकिन आप मेरा रूप में एक ही उल्लंघन का पालन करना चाहिए।

यहां तक ​​कि अगर मैं मूल लिंक से असमानता की कमी रखने के लिए और दो अतिरिक्त समानता जोड़ने बाधाओं, समानता की कमी का उल्लंघन होता है

किसी अन्य पैकेज मैं मज़बूती से उपयोग कर सकते हैं जो बनाए रखा है एक पैकेज यानी वहाँ है

संपादित करें:।? अगर कोई उपयुक्त समाधान नहीं है, नहीं वहाँ एक संदेश होना चाहिए कि कोई व्यवहार्य समाधान नहीं मिला?

+0

समस्या दो अतिरिक्त समानता बाधाओं के कारण अक्षम है। समाधान का निरीक्षण करें और आप देख सकते हैं कि इसकी अज्ञात स्थिति है और यह अक्षम है। – tihom

उत्तर

5

@tihom टिप्पणी के रूप में समस्या अक्षम है। क्या आप वाकई सुनिश्चित हैं कि यह समस्या आप हल करना चाहते हैं? आपका पहला बाधा का अर्थ है:

p1 + p2 + ... + pn = 1 
p1*a1 + p2*a2 + ... + an*pn = 30 
p1*a1^2 + p2*a2^2 + ... pn*an^2 = 0.6 

पिछले बाधा पहले या सभी i के लिए ai >= 20 के बाद से एक दूसरे के रूप में एक ही समय में संतुष्ट कभी नहीं हो सकता है। यही है, राशि p1*a1^2 + p2*a2^2 + ... pn*an^2 अन्य रकम से हमेशा अधिक है (ध्यान दें कि pi > 0)।

यदि आप target1 = sum(a/500.) और target2= sum(a*a/500.) को अपनी बाधाओं को संतुष्ट करने के लिए एक बिंदु मौजूद हैं और आप इष्टतम समाधान पा सकते हैं।

ध्यान दें कि अंतिम बाधा में अधिकतम max(a - K, a^2) = a^2 को सरल बनाता है, जो a पर ध्यान दिए बिना सत्य है।

संपादित करें:

{'status': 'unknown', 'zl': <0x1 matrix, tc='d'>, 'dual slack': 1.0000000000000007, 'relative gap': 0.005911420508296136, 'dual objective': -97.17320604198335, 'snl': <0x1 matrix, tc='d'>, 'gap': 0.9737154924375709, 'primal objective': -164.7176835197311, 'primal slack': 0.9737154924375703, 'znl': <0x1 matrix, tc='d'>, 'primal infeasibility': 0.5114570271204905, 'dual infeasibility': 0.5091221046374248, 'sl': <0x1 matrix, tc='d'>, 'y': <3x1 matrix, tc='d'>, 'x': <500x1 matrix, tc='d'>} 

सूचना है कि status'unknown', यानी, कोई उपयुक्त समाधान नहीं मिला है: आप समाधान का निरीक्षण करते हैं (उदा print sol) आप की तरह कुछ मिल जाएगा। यह cvxopt.solvers.cp के प्रलेखन में है: http://cvxopt.org/userguide/solvers.html?highlight=cp#cvxopt.solvers.cp

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