Gurobi花了很长时间为LP建立模型

时间:2013-08-19 00:56:38

标签: linear-programming gurobi

我一直在用gurobi解决一些LP,我注意到在我遇到的大多数情况下,构建模型的时间比实际解决它要长。也许这是标准的,但对我来说似乎很奇怪。

一个特定的实例花了1.75秒来解决,但是构建模型的代码的以下部分耗时13.6秒:

for (int i = 0; i < numSeq2; ++i) {
    expr = new GRBLinExpr();
    //expr.clear();
    for (int j = 0; j < numSeq1; ++j)
        expr.addTerm(-1 * A[j][i], x[j]);
    for (int j = 0; j < numIS2; ++j)
        expr.addTerm(-1 * F[j][i], q[j]);
    duals[i] = model.addConstr(expr, GRB.LESS_EQUAL, 0, "");
}

在上述示例中,numSeq1 = 7475,numSeq2 = 7475,numIS2 = 2517,最终LP具有9992行和9992列。我知道这是相当大的,但似乎很奇怪,构建模型所需的时间几乎是解决它的时间的10倍。

我尝试了expr.clear(),而不是为每个约束创建一个新的GRBLinExpr(注释掉)并且它没有帮助。

有没有办法让gurobi更快地构建模型?如果瓶颈在构建模型,那么在这方面cplex会比gurobi更好吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,您的示例代码块中存在很大的错误(现已更正)。这让我想知道你的模型是否应该有numSeq2行(7495)。

如果A和F矩阵中的每个元素都不为零,那么代码的结构就可以了。然而,这是非常罕见的;在大多数情况下,绝大多数矩阵系数为零。如果是这样,您应该仅为行中的非零元素调用GRBLinExpr.addTerm()。无论您使用的是Gurobi还是其他任何求解器,都是如此。

(请注意,您可以在Gurobi自己的论坛上更快地回复Gurobi特定的问题。)

免责声明:我目前在Gurobi Optimization工作,之前曾在提供CPLEX的ILOG工作。

答案 1 :(得分:-2)

由于您在询问替代方案,我相信您最好使用代数建模语言,如AMPL,AIMMS或开源替代方案,如GLPK和AML。这些声明性语言可以简洁而优雅地表达您的问题。这些语言生成MPS或NL,然后可以由CPLEX或其他免费解算器处理。如您所见,建模语言是一回事,求解器是另一回事。