2014-05-02 69 views
0

我正在爲一個大問題編寫一個列生成算法,經過5次迭代後,算法開始違反約束,確保m(i,j) *對於所有j,x(i)= 1。我從來沒有使用Cplex java Api,所以我想知道這是否是一個常見問題,那就是約束不成立?這是約束:違反列生成算法中的約束CPLEX java api

for(j=1; j <=K; j++) { 
    IloLinearNumExpr lhs = cplex.linearNumExpr(); 
    for(i=1; i <= C; i++) { 
     lhs.addTerm(m[i][j], x[i]); 
    } 
    con[j] = cplex.addEq(lhs, 1); 
    con[j].setName("yourConstraintName(" + j + ")");  
} 

回答

0

這是更有可能是你的代碼的邏輯中的缺陷。你給我們的代碼片段對我來說看起來還不錯 - 我不知道問題出在哪裏,沒有更多的上下文,知道m矩陣中的值。

首先,在解決問題之前嘗試輸出模型它在每次迭代中使用cplex.exportModel(「name.lp」)將一個LP文件。您可能需要爲每個迭代創建一個新名稱,例如包括名稱中的迭代編號,以便每次都不會覆蓋同一個文件。然後你可以檢查你所期望的約束是否在文件中,並且有正確的術語。其次,嘗試在代碼中添加一些老派日誌記錄,以便更詳細地瞭解代碼的功能。

此外,您可能需要檢查在添加到表達式的每個術語中係數的值是否爲非零。它不會在表達式中帶有零項,但通常對於一小部分可能項只有非零值,並且所有這些項都會使表達式變得更大更難以檢查LP文件。

CPLEX在每個新版本發佈之前都進行了非常詳細的測試,並且它被數千家公司和學術界廣泛使用並依賴於這個詞,如果這是常見問題,答案是CPLEX規定不尊重約束。