1

我正在使用IBM CPLEX庫來解決Java中的優化問題。由於主存不足以滿足應用程序的需求,因此我找到了一個CPLEX屬性:「內存重點:讓優化器使用磁盤進行存儲」。 Memory Emphasis的默認值爲0.如何在Java中更改此屬性?使用Java中的CPLEX庫進行內存優化

for (int i = 0; i < GreenOverlayGlobals.numNodes; i++) { 

     for (int j = 0; j < GreenOverlayGlobals.numNodes; j++) { 

      IloLinearNumExpr expr2 = cplex.linearNumExpr(); 
      for (int p = 0; p < GreenOverlayGlobals.numPathPairs; p++) { 

       cplex.addLe(xPath[i][j][p], xLink[i][j]); //x[i][j][p] <= x[i][j] 
       expr2.addTerm(1, xPath[i][j][p]); 
      } 
      cplex.addLe(xLink[i][j], expr2); //x[i][j] <= sump_x[i][j][p] 
     } 
    } 
+0

您確定無法做任何事情來減少優化問題的內存要求嗎? – raoulcousins

+0

事實上,從堆中分配的內存在我的應用程序中並不多。 CPLEX使用高達12GB的內存,同時尋找最佳解決方案。我不知道CPLEX庫的內部邏輯的詳細信息。 –

回答

1

您使用IloCplex.setParameter()方法在cplex java中設置參數。要允許將mip樹存儲在磁盤上,可以使用NodeFileInd和WorkDir指定存儲目錄。可以使用另外兩個parameters來減少cplex的內存消耗。您可以將MemoryEmphasis設置爲True,這會指示cplex嘗試節省內存。您也可以通過將參數VarSel設置爲3來打開「強分支」。強分支會導致cplex在每個節點上花費更多時間來選擇更高質量的子節點,這通常會使搜索樹更小。

要使用setParameter方法,假設您有一個名爲cplex的IloCplex對象。

cplex.setParam(IloCplex.IntParam.VarSel, 4); 
cplex.setParam(IloCplex.BoolParam.MemoryEmphasis, true); 

請記住,有參數僅影響.solve期間CPLEX()。如果在.solve()之前內存不足,參數將不會執行任何操作。由於cplex模型通常非常稀疏,導致內存消耗過多的最常見原因是添加了太多含0個係數的項。

+0

解決方法()前我內存不足。我是使用CPLEX的新手。有沒有辦法擺脫這種稀缺? –

+0

我在我的問題中包含了內存不足的代碼段。內存異常在cplex.addLe()行中給出,我添加了約束。 numNodes是輸入圖中的節點數。我是否添加了過多的限制?這可能是內存異常的原因嗎? –

+0

您正在爲您的模型創建numNodes^3個非零點,並且您正在假設一個完整的圖(您可以在所有節點之間建立鏈接)。你想要計算什麼? –