【问题标题】:Linear programming in Python scipyPython scipy 中的线性编程
【发布时间】:2017-06-30 00:49:33
【问题描述】:

目标:

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。

【问题讨论】:

  • 您正在使用 NLP 求解器来求解 LP。这几乎总是一个坏主意。此外,您使用不可微函数 abs(x),而此 NLP 求解器假定平滑函数。这只是解决问题的一种不好的方法。

标签: python scipy linear-programming


【解决方案1】:

如果您检查返回的对象sol,您会看到它有一个属性.message 带有“值”

'Positive directional derivative for linesearch'

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-11-07
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多