具有相等约束和上界下界的二次规划

请告诉我如何解决我的问题与下面的变量。

哪个解算器更好?

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

Q是Q(ii)>=0的对角矩阵

x。shape = (n1)

相等约束:Aeq。x =说真的

Aeq。shape = (nn)和beq。shape = (n1)

下界和上界: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中,我不能得到那个结果。

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

###看起来你在用solve_qp function from qpsolvers. From th从qpsolvers函数。从包的README的常见问题:

我有一个非凸二次规划。有一个解算器我可以使用吗?

不幸的是,大多数可用的QP求解器都是为凸问题设计的。

如果你的成本矩阵P是半确定的而不是确定的,尝试OSQP。

我尝试了你的问题与OSQP和解决方案退出状态“原始不可行的”。这意味着解决程序能够解决您的问题,并发现没有解决方案的证书。(我不知道fmincon返回了什么,但你会想检查它的结果满足所有的约束Aeq * x == beq和lb <= x <= ub。)

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

最后一行Aeq and beqbeq are 是0。在这种情况下,最好不要将这些行添加到问题中。有些求解器无法处理0 * x == 0 lines well.行。

使用启用/禁用约束来了解您的问题。例如,如果我们禁用lb we see that the values in the middle of the solution vector hit 30 and that forces the other value我们看到,解向量中间的值达到30,这迫使其他值变成<= -500。要么是目标指向那里,要么是由Aeq * x == beq (most likely the latter since the problem with lb seems infeasible).(很可能是后者,因为问题lb seems infeasible).似乎不可行)的。

你可以通过将硬性等式约束转化为二次目标来放松它weight * || Aeq * x - beq ||^2 in the objective function. This way the problem will always be feasible and you can 在目标函数中。这样,问题总是可行的,您可以使用权重参数来理解这个约束的影响。

祝你学习顺利!

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码