【问题标题】:Memory optimization while using CPLEX library in Java在 Java 中使用 CPLEX 库时的内存优化
【发布时间】:2013-08-23 22:32:19
【问题描述】:

我正在使用 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]
        }
    }

【问题讨论】:

  • 你确定你不能做任何事情来减少你的优化问题的内存需求吗?
  • 事实上,从堆分配的内存在我的应用程序中并不多。 CPLEX 在寻找最佳解决方案时使用高达 12GB 的内存。我不知道CPLEX库内部逻辑的细节。

标签: java optimization mathematical-optimization linear-programming 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 的项。

【讨论】:

  • 我在solve()之前内存不足。我是使用 CPLEX 的新手。有什么方法可以摆脱这种稀疏性?
  • 我在问题中包含了内存不足的代码 sn-p。在我添加约束的 cplex.addLe() 行中给出了内存异常。 numNodes 是输入图中的节点数。我是否添加了过多的约束?会不会是内存异常的原因?
  • 您正在为您的模型创建 numNodes^3 个非零值,并且您正在假设一个完整的图形(您可以在所有节点之间建立链接)。你想计算什么?
  • 我没有假设一个完整的图表。有一个像“x_ijp
  • @fatma.ekici 外部的两个 for 循环生成图中的所有节点对。这定义了一个完整的图(加上从 i 到 i 的自循环)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多