请告诉我如何解决我的问题与下面的变量。
哪个解算器更好?
目标函数= 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 在目标函数中。这样,问题总是可行的,您可以使用权重参数来理解这个约束的影响。
祝你学习顺利!