首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gurobi花了很长时间为LP建立模型

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

Stack Overflow用户
提问于 2013-08-19 08:56:38
回答 2查看 1.8K关注 0票数 2

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

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

代码语言:javascript
复制
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更好吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-08-19 11:52:13

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

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

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

免责声明:我目前在Gurobi Optimization工作,以前在ILOG工作,它提供了CPLEX。

票数 1
EN

Stack Overflow用户

发布于 2013-08-19 09:47:34

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18305131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档