2017-06-29 68 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.])