Python scipy 中的线性规划



目标:

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

参赛者:

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。

如果你看到 检查返回的对象sol,您将看到它有一个属性.message"value">

'Positive directional derivative for linesearch'

根据此答案,这意味着无法保证返回的解决方案是最佳的。事实上,它违反了限制。

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

您可能想尝试scipy.optimize.linprog作为更适合线性程序的 scipy 函数,尽管我相信它不如 CVXPY(或其他免费的 LP 包)快。

约束可以被违反,主要用于参数之间的关系。 您正在寻找的是关键字边界。

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.])

最新更新