我在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
你有什么想法吗?
提前致谢, 梅迪
答案 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论坛获取支持。