2

我一直在用 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 更好吗?

谢谢!

4

2 回答 2

1

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

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

(请注意,您可能会在 Gurobi 自己的论坛上获得针对 Gurobi 特定问题的更快回复。)

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

于 2013-08-19T03:52:12.937 回答
-2

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

于 2013-08-19T01:47:34.473 回答