【发布时间】:2021-01-03 10:49:24
【问题描述】:
我正在求解 MIP 并构建了相应的 CPLEX IloModel。我的实现遵循以下伪代码:
model = IloModel( env );
//Build optimization model
//Configure CPLEX Solver
//Solve model
//Do some solution-statistics
model.end();
一切正常,我得到了正确的解决方案,等等。现在,我想按顺序自动解决许多不同的实例。
但是,在这里我遇到了一个问题:我的实例越大,使用model.end() 释放资源的时间就越长。对于我的小型实例(使用最多 500mb 的 RAM)已经需要几十分钟,对于中型实例(使用最多 2 GB 的 RAM)需要几个小时,我从来没有测量过我的大型实例需要多长时间(最多使用32 GB 的 RAM),因为我总是在整个晚上的等待没有完成后手动终止该进程。因此,释放资源比构建模型或使用我指定的时间限制解决它花费的时间要长得多。在model.end() 运行时,CPU 使用率始终保持在大约 100%。
这是预期的行为吗?我在实现模型时是否遗漏了一些东西,或者如何释放需要这么多时间的资源?
我真的想避免通过在指定时间阈值后终止 CPLEX 求解过程来自动依次求解多个实例。
谢谢!
编辑:
我可以通过运行env.end()(即使对于大型模型也需要model.end() 来规避这个问题。因为我现在不重用环境,这对我来说没问题。但是,我想知道这里发生了什么,根据我从docs 收集的信息,释放分配给模型的资源是释放整个环境的子过程。
【问题讨论】:
-
仔细观察你生成了多少非零元素。在大型模型中,这是一项重要的检查措施(即使以更多变量/方程为代价)。
-
感谢您的提示!所以你说,如果大型模型有更少的非零值,即使它们可能有更多的变量/约束,通常情况下它们可能比其他模型更有性能?
-
是的。我经常看到具有大量非零元素的模型,因此需要大量内存。我总是想方设法让问题变得更简单。
标签: c++ mathematical-optimization linear-programming cplex mixed-integer-programming