在Java中使用CPLEX库时的内存优化

在Java中使用CPLEX库时的内存优化,java,optimization,mathematical-optimization,linear-programming,cplex,Java,Optimization,Mathematical Optimization,Linear Programming,Cplex,我正在使用IBMCPLEX库解决Java中的一个优化问题。由于主内存不足,我找到了CPLEX的一个属性:“内存强调:让优化器使用磁盘存储”。内存强调的默认值为0。如何在Java中更改此属性 for (int i = 0; i < GreenOverlayGlobals.numNodes; i++) { for (int j = 0; j < GreenOverlayGlobals.numNodes; j++) { IloLinear

我正在使用IBMCPLEX库解决Java中的一个优化问题。由于主内存不足,我找到了CPLEX的一个属性:“内存强调:让优化器使用磁盘存储”。内存强调的默认值为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]
        }
    }
for(int i=0;iaddLe(xPath[i][j][p],xLink[i][j]);//x[i][j][p]您可以使用IloCplex.setParameter()在cplex java中设置参数方法。要允许将mip树存储在磁盘上,您可以使用、和WorkDir指定存储目录。另外两个可用于减少cplex的内存消耗。您可以将MemoryEmphasis设置为True,这将指示cplex尝试节省内存。您还可以启用“强分支”通过将参数设置为3。强分支会导致cplex在每个节点上花费更多时间选择更高质量的子节点,这通常会使搜索树更小

要使用setParameter方法,假设您有一个名为cplex的IloCplex对象

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

请记住,如果在.solve()之前内存不足,则这些参数只会在.solve()期间影响cplex,参数不会起任何作用。由于cplex模型通常非常稀疏,导致内存消耗过多的最常见原因是添加了太多系数为0的项。

您可以使用IloCplex.setParameter()在cplex java中设置参数方法。要允许将mip树存储在磁盘上,您可以使用、和WorkDir指定存储目录。另外两个可用于减少cplex的内存消耗。您可以将MemoryEmphasis设置为True,这将指示cplex尝试节省内存。您还可以启用“强分支”通过将参数设置为3。强分支会导致cplex在每个节点上花费更多时间选择更高质量的子节点,这通常会使搜索树更小

要使用setParameter方法,假设您有一个名为cplex的IloCplex对象

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

请记住,如果在.solve()之前内存不足,则这些参数只会在.solve()期间影响cplex,参数不会起任何作用。由于cplex模型通常非常稀疏,导致内存消耗过多的最常见原因是添加了太多系数为0的项。

您确定不能采取任何措施来减少优化问题的内存需求吗?事实上,在我的应用程序中,从堆分配的内存并没有那么多。CPLEX在寻找最佳解决方案时使用高达12GB的内存。我不知道CPLEX库内部逻辑的细节。你确定不能做任何事情来减少优化问题的内存需求吗?事实上,在我的应用程序中,从堆中分配的内存不多。CPLEX在寻找最佳解决方案时使用高达12GB的内存解析。我不知道CPLEX库内部逻辑的详细信息。在solve()之前,我的内存不足。我是新使用CPLEX的。有什么方法可以消除这种稀疏性吗?我在问题中包含了内存不足的代码段。CPLEX.addLe()中给出了内存异常添加约束的行。numNodes是输入图形中的节点数。我是否添加了过多的约束?这可能是内存异常的原因吗?您正在为模型创建^3个非零的numNodes,并且假设一个完整的图形(您可以在所有节点之间建立链接)。你想计算什么?我没有假设一个完整的图。有一个像“x_ijp