【问题标题】:inputting specific constraints into cvxopt QP将特定约束输入到 cvxopt QP
【发布时间】:2020-04-15 18:30:22
【问题描述】:

我有一个相当复杂的二次问题,我试图在 python 中解决,但是,为了这个问题 - 我正在显着简化手头的问题。

我有以下二次函数,我试图在满足以下约束的同时最小化:

minimize 0.5 * x.T * P * x + q.T * x

where: 

x >= 0
x[0] >= 1.5
x[n] >= 1.5 # n = last element

我在 scipy.optimize 中写了等价的:

def minimize_func(x,y,P):
    return 0.5*np.dot(x.T,np.dot(P,x)) + np.dot(y.T,x)

cons = ({'type':'ineq','fun': lambda x: x},
        {'type':'ineq','fun': lambda x: x[0] - 1.5},
        {'type':'ineq','fun': lambda x: x[n] - 1.5})

但是,我的问题是如何在 cvxopt 二次求解器中输入特定约束?

我查看了 cvxopt 文档页面,他们提供的示例似乎都与我的问题无关。我希望输入元素明智的约束。任何帮助是极大的赞赏。

【问题讨论】:

    标签: python cvxopt quadratic-programming


    【解决方案1】:

    cvxopt 专注于自然矩阵形式,对于没有任何内部知识的人来说,这可能看起来相当低级。

    您需要的所有内容都记录在案 in the user-manual

    cvxopt.solvers.qp(P, q[, G, h[, A, b[, solver[, initvals]]]])
    

    解决:

    假设 n=3 和您的约束(我假设 0-indexing -> n-1 是最后一个元素):

    x >= 0
    x[0] >= 1.5
    x[n-1] >= 1.5 # n-1 = last element 
    

    这看起来像:

    G = 
    -1   0   0
     0  -1   0
     0   0  -1
    
    h = -1.5
            0
        -1,5
    

    原因很简单:

         - 1 * x[0] + 0 * x[1] + 0 * x[2] <= -1.5
    <->  -     x[0]                       <= -1.5
    <->        x[0]                       >=  1.5  
    

    (我们在这里忽略了x[0]x[1] 的非负约束,因为&gt;= 1.5 更具限制性)

    numpy/scipy 和 co 中有很多辅助函数。更容易做到这一点(例如np.eye(n))。

    一般来说,我建议使用cvxpy,它是一种更高级的建模工具,也允许调用 cvxopt 的求解器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2023-04-07
      • 2019-03-11
      • 2022-01-16
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多