我一直在用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更好吗?
谢谢!
发布于 2013-08-19 11:52:13
首先,您的示例代码块中有一个很大的拼写错误(现在已更正)。这让我想知道你的模型是否应该有numSeq2行(7495)。
如果你的A和F矩阵中的每个元素都是非零的,那么你的代码结构就没问题。然而,这是非常罕见的;在大多数情况下,绝大多数矩阵系数为零。如果是这样的话,应该只对行中的非零元素调用GRBLinExpr.addTerm()。无论您使用的是Gurobi还是任何其他求解器,这都是正确的。
(请注意,在Gurobi自己的论坛上,对于Gurobi特定的问题,您可能会得到更快的回复。)
免责声明:我目前在Gurobi Optimization工作,以前在ILOG工作,它提供了CPLEX。
发布于 2013-08-19 09:47:34
既然您正在询问替代方案,我相信您最好使用代数建模语言,如AMPL、AIMMS或开源替代方案,如GLPK和AML。这些声明性语言可以简洁而优雅地表达你的问题。这些语言生成MPS或NL,然后可以由CPLEX或其他自由求解器处理。正如您所看到的,建模语言是一回事,求解器是另一回事。
https://stackoverflow.com/questions/18305131
复制相似问题