2017-06-29 105 views
0

目的:線性規劃SciPy的

maximize :((((alpha1*5000)+(alpha2*0.49431))-5000) + (((alpha1*5000)+(alpha2*0.49431))-0.49431)) 

constarints:

mod(alpha) <= 1 

代碼:

from scipy.optimize import minimize 
alpha = [0,0];v1 = 5000 
v2 = 0.49431537320810676 

def objective(alpha,sign = -1.0): 
    alpha1 = alpha[0] 
    alpha2 = alpha[1] 
    return sign*((((alpha1*5000)+(alpha2*0.49431537320810676))-5000) + (((alpha1*5000)+(alpha2*0.49431537320810676))-0.49431537320810676)) 

def constraint1(alpha): 

    return (1- abs (alpha[0])) 

def constraint2(alpha): 

    return (1- abs (alpha[1])) 

con1 = {'type':'ineq','fun':constraint1} 
con2 = {'type':'ineq','fun':constraint2} 
cons = [con1,con2] 

sol = minimize(objective,alpha,method='SLSQP',constraints = cons) 

我已經給目標函數符號更改優化最大化。

解決方案:

(sol.x) 
>>>>[ 1.00104909 0.99560862] 

我已經給出了約束阿爾法它比1少,但得到的解決方案超過1

+2

您正在使用NLP求解器來求解LP。這幾乎總是一個壞主意。此外,您使用非微分函數abs(x),而此NLP求解器假定平滑函數。這只是解決你的問題的一個壞方法。 –

回答

2

如果你看到檢查返回的對象sol,你會看到它有一個屬性.message與「價值」

'Positive directional derivative for linesearch'

其中根據this answer,意味着無法保證返回的解決方案是最優的。確實,這違反了限制。

此行爲可能是由於問題在優化變量的域的邊界處具有解決方案。實際上,CVXPY對於線性編程比SLSQP更好,它返回的最優優化變量等於[1,1]

你可能想嘗試scipy.optimize.linprog作爲線性程序的更適合的scipy函數,雖然我相信它不如CVXPY(或其他免費LP包)快。

1

約束可能被違反,主要用於參數之間的關係。 你在找什麼是關鍵字邊界。

from scipy.optimize import minimize 
alpha = [0.,0.];v1 = 5000 
v2 = 0.49431537320810676 

def objective(alpha,sign = -1.0): 
    alpha1 = alpha[0] 
    alpha2 = alpha[1] 
    return sign*(alpha1*v1+alpha2*v2-v1 + alpha1*v1+alpha2*v2-v2) 

sol = minimize(objective,alpha,method='SLSQP', bounds = ((-1,1),(-1,1))) 
sol.x 
>> array([ 1., 1.])