我正在使用IBM CPLEX库来解决Java中的优化问题。由于主内存对于应用程序来说还不够,我发现了CPLEX的一个属性:“内存强调:让优化器使用磁盘进行存储”。 Memory Emphasis的默认值为0.如何在Java中更改此属性?
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 :(得分: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系数项。