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个非零点,并且您正在假设一个完整的图(您可以在所有节点之间建立链接)。你想要计算什么? –