簡體   English   中英

具有等約束和下限和上限的二次規划

[英]Quadratic programming with equal constraint and lower and upper bound

請告訴我如何使用以下變量解決我的問題。

哪個求解器更好?

目標 function = x^TQ x + C^T x

  • QQ(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 中,我無法得到那個結果。

如果你打印 Q 你會看到它的行和列都是零。 這使得矩陣 Q 不再嚴格正定 (PD)。 您可以使用允許正半定 (PSD) 矩陣的求解器(大多數 QP 求解器都允許這樣做,只是您現在使用的不是),或者您可以將一個小數字(比如 1e-6)添加到所有零對角線條目。

看來您正在使用solve_qp的 solve_qp function 來自軟件包自述文件的常見問題解答:

我有一個非凸二次程序。 有我可以使用的解算器嗎?

  • 不幸的是,大多數可用的 QP 求解器都是為凸問題設計的。
  • 如果您的成本矩陣 P 是半定的而不是定的,請嘗試 OSQP。

我用 OSQP 試過你的問題,解算器以“原始不可行”狀態退出。 這意味着求解器能夠解決您的問題並找到一個證明它沒有解決方案的證明。 (我不知道fmincon返回了什么,但您需要檢查其結果是否滿足所有約束Aeq * x == beqlb <= x <= ub 。)

其他建議/您可以嘗試的事情:

  • Aeqbeq的最后一行是零。 在那種情況下,最好不要將這些行添加到問題中。 一些求解器不能很好地處理0 * x == 0行。
  • 嘗試啟用/禁用約束以了解您的問題。 例如,如果我們禁用lb ,我們會看到解向量中間的值達到 30,這會強制其他值變為 <= -500。 要么目標轉向那里,要么這是由Aeq * x == beq引起的(很可能是后者,因為lb的問題似乎不可行)。
  • 您可以通過將其轉換為二次目標weight * || Aeq * x - beq ||^2 weight * || Aeq * x - beq ||^2 in the objective function。這樣問題總是可行的,你可以玩弄權重參數來理解這個約束的效果。

祝你學習順利!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM