2017-03-03 114 views
2

嘗試使用scipy.optimize.minimize,看起來優化失敗。我做了以下:
1的目標函數是:f(x)= x[0]+x[1]+x[2]+x[3]+10
2.約束爲:x_i >= 0
3.最初的猜測是:x0 = [1,1,1,1]
很瑣碎的問題,用最佳的解決方案x=[0,0,0,0], f(x)=10
代碼:Python scipy優化未找到最小值

def pos(x): 
    return min(x) 
def f1(p): 
    return (p[0] + p[1] + p[2] +p[3] + 10) 
cons2 = ({'type' : 'ineq', 'fun' : pos}) 
x0 = np.array([1,1,1,1]) 
res = opt.minimize(f1, x0,method='SLSQP',constraints=cons2) 

我得到以下結果:

fun: 100543626.59510386 
jac: array([ 0., 0., 0., 0., 0.]) 
message: 'Optimization terminated successfully.' 
nfev: 54 
nit: 9 
njev: 9 
status: 0 
success: True 
    x: array([ 24128556.46553156, 24130378.42917114, 28154390.61929696, 
    24130291.0811042 ]) 

這顯然是錯誤的答案(但成功的標誌是真實的)。
我知道有一些假設「f」必須遵循,但在這種情況下,「f」只是一個超平面,所以我非常困惑。有任何想法嗎?

回答

2

替換

def pos(x): 
    return min(x) 

def pos(x): 
    return x 

(不等式約束函數可以返回的載體;該載體的每個組件必須滿足約束。)

兩種製劑似乎數學相當於,但有關您的版本的內容會打破計算。這可能是因爲SLSQP算法假定約束函數是可微分的,並且min(x)是不可微分的。

+0

非常感謝。的確解決了這個問題 –