我通過C#API使用CPLEX 12.5.0.0。使用CPLEX進行二次規劃的目標常數?
到現在爲止,我從來沒有過一個具有常數項的目標 - 只有約束條件。有了約束,我總能重新排列方程,所以常數總是在一邊,這意味着每個ILinearNumExpr
本身沒有常數項。
現在我有一個二次規劃問題,具有以下類型的一個目的:
MAX Z =
c[1,2] * a[1] * a[2] - c[1,2] * (1 - a[1] * a[2]) +
c[1,3] * a[1] * a[3] - c[1,2] * (1 - a[1] * a[3]) +
c[2,3] * a[2] * a[3] - c[2,2] * (1 - a[2] * a[3])
C [,]是一個常數,對稱成本矩陣。 a [i]是二元變量。
因此,看着上面三行的左半部分,將[i]和a [j]放在一起會使客觀價值成爲c [i,j]。這是目前實施,測試和工作的內容。
我想修改目標,以便如果[i]和a [j]不都等於1,而不是不向目標值貢獻c [i,j],則會將其減去。
現在,我查閱了CPLEX文檔(作者顯然對提供清晰的解釋或示例過敏),並且似乎有一個ILinearNumExpr.Constant
屬性,它允許我爲給定表達式設置常量。
當我試圖修改我的代碼IQuadNumExpr
,我注意到它沒有那.Constant
屬性。
有什麼方法可以將常數項添加到二次客觀函數函數在CPLEX中嗎?
c [1,2] a [1] a [2] -C [1,2](1-a [1] a [2]) == 2c [1,2] x [1] x [2] - c [1,2]。那真的是你想要做的嗎? –
@DavidNehme是的,你可以重新安排這樣的表達。我以這種形式離開,因爲它更容易理解和解釋。然而,重新安排並沒有改變我的問題,因爲在目標函數中仍然存在一個-c [1,2]常數項。 – Ozzah
您可以忽略目標函數中的常數項。常數項不會改變最佳解決方案。另外,由於[i]是二進制的,所以最好將它建模爲線性MIP。 –