Python scipy中的线性编程

时间:2017-06-29 15:15:19

标签: python scipy linear-programming

目标:

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]

我给它的alpha约束小于1,但得到的解决方案超过1。

2 个答案:

答案 0 :(得分:2)

如果您看到检查返回的对象sol,您会看到它的属性.message带有&#34;值&#34;

  

'Positive directional derivative for linesearch'

,根据this answer,意味着无法保证返回的解决方案是最优的。实际上,它违反了限制。

这种行为可能是由于问题在优化变量域的边界处有解决方案。实际上,CVXPY是线性编程比SLSQP更好的选择,它返回等于[1,1]的最优优化变量。

你可能想尝试scipy.optimize.linprog作为线性程序的更合适的scipy函数,虽然我认为它不如CVXPY(或其他免费的LP软件包)快。

答案 1 :(得分: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.])