2017-02-23 247 views
0

我有一個涉及連續變量和二元變量的問題。完成創建目標函數後,我添加了導致CPLEX無法找到解決方案的約束。請讓我知道我做錯了什麼。CPLEX拒絕找到給定相等約束的解決方案

IloNumExpr cbin1 = cplex.prod(EB_s[a-1],binHandelSprzedaj[a-1]); 
cplex.addEq(EB[a],cbin1); 

「binHandelSprzedaj」是二元變量數組。 「EB_s」和「EB」是連續cplex浮點變量的數組。

如果代替「cbin1」,代碼可以使用「EB_s [a-1]」或「binHandelSprzedaj [a-1]」。我認爲這是因爲我最終得到了二次約束。然而,CPLEX提供的示例之一是「QCPex1」,它提供的解決方案具有「不太平等」的二次約束,並且代碼看起來與我寫的非常相似。我不明白爲什麼我的代碼不起作用。是因爲約束是二次的,還是因爲它是二元和連續變量的混合,或者它是「相等」類型的約束。

錯誤信息接收:CPLEX錯誤5002:Q的目的不是半正定

我在優化一個大菜鳥。我該如何處理這個問題?我更喜歡CPLEX是否爲我做了儘可能多的數學運算(也許可以提供一些神奇的命令)。

約束在它的最終形式是更復雜,所以簡單的變量放寬(如在這裏呈現http://orinanobworld.blogspot.com/2010/10/binary-variables-and-quadratic-terms.html)將無法正常工作。限制在完全定義問題會看起來像這樣:

A = B + C + d +二進制* F - (1-二進制)* G

其中 - 克是連續變量。

任何幫助將深表謝意。

回答

0

Cplex可以處理凸MIQP(二次目標)和MIQCP(二次約束)問題。它也可以處理非凸MIQP(通過參數SolutionTarget)。我們剩下的是二次約束非凸問題,它無法處理。

幸運的是,我們總是可以線性化二元和連續變量的乘積。提到Paul Rubin的博客將會起作用。 (Here是另一個配方)。

對於更換您:

a = b + c + d + binary * f - (1-binary)*g 

通過

a = b + c + d + binary * f - g + z 
z = binary*g 

其中z是另一個連續變量。等式

z = binary*g 

可以直接線性化。

+0

謝謝,到目前爲止工作:) – t4u