CPLEX需要很长时间才能启动

时间:2015-05-28 02:07:35

标签: visual-c++ cplex

我在CPLEX中有一个巨大的线性模型,用Microsoft Visual C ++编写。 致电cplex.solve()后,很长一段时间没有进展。 5分钟内不会显示任何内容。然后,将显示线程数,预解决时间小于1秒。消除了所有的行和列,解决时间不到1秒。

我的日志文件如下:

Warning:  Output names have been modified to conform to LP format.
Parallel mode: deterministic, using up to 8 threads for concurrent optimization.
Tried aggregator 1 time.
LP Presolve eliminated 283559 rows and 283572 columns.
All rows and columns eliminated.
Presolve time = 0.48 sec. (516.10 ticks)
当我在列生成中添加另一列时,

或其他一个

Warning:  Output names have been modified to conform to LP format.
Parallel mode: deterministic, using up to 8 threads for concurrent optimization.
Iteration log . . .
Iteration:     1   Scaled dual infeas =           224.981132
Iteration:    13   Dual objective     =      25519782.182497
Iteration:  3159   Dual objective     =      30679377.244649
Barrier solved model.

为什么要花这么长时间才能开始? 什么是警告?

可以肯定的是,我导出了模型并将其导入另一个项目,解决了,整个过程不到2秒。因此,在4分钟内它不会聚合或预先解决。

此外,我用CODEXL检查了性能,我在dll中发现了两个很常用的函数,我对它们一无所知:CPXLkillpnorms,CPXEgeneric_unlock,cplex1261.dll!+ 0x2627a2

你有什么想法吗?

提前致谢, 梅迪

2 个答案:

答案 0 :(得分:1)

我对您的性能问题没有任何见解,但我可以在您的问题中提供有关警告的第二个问题的一些信息Output names have been modified to conform to LP format.此警告表示模型中的变量和约束名称已被修改为使用后缀形式"#number",如this IBM Technote中所述。

LP格式对变量和约束名称有一些令人惊讶的限制。特别是,变量和约束名称可能不包含某些字符(包括^,*,[,]或空格),并且它们可能不以字符e或E开头。如果模型包含任何此类违反LP格式的行为,相应的变量或约束名称将具有#number后缀。虽然命名要求显然与LP格式有关,但我已经看到#number名称也用于其他输出格式,例如SAV。

通过重命名模型的组件,可以摆脱此错误消息。 This post on IBM developerWorks通过将变量从excessVarForConstraint重命名为dddVarForConstraint来描述一位用户是如何做到的。

但是,我怀疑IBM提供的解释是不完整的。即使对于我已从变量和约束名称中删除所有违规字符的OPL模型(技术上,在OPL中,"约束标签"),仍会出现错误消息 和LP输出有#number后缀。

答案 1 :(得分:0)

关于性能问题,您可以尝试以下方法:

IloNum start = cplex.getCplexTime();
cplex.solve();
std::cout << "Elapsed: " << (cplex.getCplexTime() - start) << std::endl;

也就是说,确保它实际上是消耗时间的solve()函数。将打印时间与CPLEX日志中显示的时间进行比较(例如,从CPLEX交互式)。如果差异巨大,那么罪魁祸首可能会延迟model extraction

如果确实存在性能问题,最好通过官方IBM support渠道。如果您通过Academic Initiative使用CPLEX,则可以使用developerWorks论坛获取支持。