等约束上下界二次规划

2024-09-19 22:29:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

哪个解算器更好

目标函数=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中,我无法得到这个结果


Tags: importnonenponesrandommaxmmshape
2条回答

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

I have a non-convex quadratic program. Is there a solver I can use?

  • Unfortunately most available QP solvers are designed for convex problems.
  • If your cost matrix P is semi-definite rather than definite, try OSQP.

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

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

  • Aeqbeq的最后一行是零。在这种情况下,最好不要将这些行添加到问题中。有些解算器不能很好地处理0 * x == 0
  • 使用启用/禁用约束来了解您的问题。例如,如果我们禁用^ {< CD8> },我们会看到解决方案向量中间的值命中30,并迫使其他值变为lt;500要么目标在那里,要么这是由Aeq * x == beq引起的(很可能是后者,因为lb的问题似乎不可行)
  • 您可以通过目标函数中的converting it to a quadratic objectiveweight * || Aeq * x - beq ||^2来放松硬等式约束。这样,问题始终是可行的,您可以使用权重参数来理解此约束的效果

祝你学习顺利

如果您打印Q,您将看到它的行和列都是零。这使得矩阵Q不再严格正定(PD)。您可以使用允许半正定(PSD)矩阵的解算器(大多数QP解算器都允许,但不是您现在使用的解算器),也可以向所有零对角项添加一个小数字(例如1e-6)

相关问题 更多 >