【问题标题】:Quadratic programming with equal constraint and lower and upper bound具有等约束和上下界的二次规划
【发布时间】:2021-10-10 00:35:25
【问题描述】:

请告诉我如何使用以下变量解决我的问题。

哪个求解器更好?

目标函数 = x^T Q x + C^T x

  • Q 是与 Q(i,i)>=0 的对角矩阵
  • x.shape=(n,1)

等式约束:Aeq.x =beq

  • Aeq.shape=(n,n)beq.shape=(n,1)

下限和上限:lb <= x <= ub

import random
import numpy as np

lb.shape=(n,1) and ub.shape=(n,1)

I=np.eye(24)
Z=np.zeros((24,24))
a=0.012
b=1.1
gamma1=0.9/80
gamma2=1.1/80
MM=np.eye(24)

for i in range (22):
    MM[i+1,i]=-1
    MM[0,23]=-1

M=random.randint(200,300, size=(24,1))
max_pch=30.0
max_pdch=30.0
ppp=random.randint(150,200, size=(24,))
Q=np.asarray(np.bmat([[a*I,Z,Z,Z],[Z,a*I,Z,Z],[Z,Z,0.00001*I,Z],[Z,Z,Z,0.00001*I]  ]))
C=np.asarray(np.bmat([[b*np.ones(24),b*np.ones(24),0*np.ones(24),ppp]]))

Aeq=np.asarray(np.bmat([[-I,I,Z,I], [-gamma1*I, gamma2*I,MM,Z],[Z,Z,Z,Z],[Z,Z,Z,Z]]))
beq=np.asarray(np.bmat([[M],[np.zeros((72,1))]]))

lb=np.asarray(np.bmat([[0*np.ones(24),0*np.ones(24),[0.1],0.1*np.ones(22),[0.9],0.0*np.ones(24)]]))

ub=np.asarray(np.bmat([[max_pch*np.ones(24),max_pdch*np.ones(24),[0.9],0.9*np.ones(22),[0.9],500*np.ones(24)]]))

x = solve_qp(P=Q, q=C.T.reshape((96,)),
                G=None , h=None,
                A=Aeq , b=beq.reshape(96,),
                lb=lb.T.reshape((96,)) , ub=ub.T.reshape((96,)))
print("QP solution: x = {}".format(x))   

有什么问题?

  • QP解决方案:x = None

Matlab 中的相同代码(带有fmincon)给出了正确的结果。但是,在 Python 中,我无法得到该结果。

【问题讨论】:

标签: python matlab constraints cvxopt quadratic-programming


【解决方案1】:

如果您打印 Q,您将看到它的行和列全为零。这使得矩阵 Q 不再严格正定 (PD)。您可以使用允许半正定 (PSD) 矩阵的求解器(大多数 QP 求解器都允许这样做,只是不是您现在使用的那个),或者您可以添加一个小数(比如 1e-6)到所有零对角线条目。

【讨论】:

  • 感谢您的回答。我在对角线条目上使用小数字。但显示我的输出是:x=None
  • 我怀疑这可能意味着问题不可行,即约束和边界产生一个空的可行区域。
  • 我在 Matlab 中使用 fmincon 求解器解决了这个问题。但我需要所有用python编写的代码。我在 python 中找不到合适的求解器。
【解决方案2】:

您似乎正在使用来自qpsolverssolve_qp 函数。来自软件包自述文件的常见问题解答:

我有一个非凸二次规划。有没有我可以使用的求解器?

  • 不幸的是,大多数可用的 QP 求解器都是为凸问题设计的。
  • 如果您的成本矩阵 P 是半定而不是定,请尝试 OSQP。

我用 OSQP 尝试了您的问题,求解器以“原始不可行”状态退出。这意味着求解器能够解决您的问题并找到一个没有解决方案的证书。 (我不知道fmincon 返回了什么,但你会想检查它的结果是否满足Aeq * x == beqlb <= x <= ub 的所有约束。)

其他建议/您可以尝试的事情:

  • Aeqbeq 的最后几行是零。在这种情况下,最好不要将这些行添加到问题中。一些求解器不能很好地处理 0 * x == 0 行。
  • 使用启用/禁用约束来了解您的问题。例如,如果我们禁用lb,我们会看到解向量中间的值达到 30,这会强制其他值变为 Aeq * x == beq 引起的(很可能是后者,因为lb 的问题似乎不可行)。
  • 您可以通过目标函数中的converting it to a quadratic objective weight * || Aeq * x - beq ||^2 来放松硬等式约束。这样问题总是可行的,您可以使用权重参数来了解此约束的效果。

祝你学习顺利!

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多