CPLEX:释放模型资源需要大量时间

问题描述

我正在求解 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 收集的信息,释放为模型分配的资源是释放整个环境的子过程。

解决方法

我在猜测,但您是否在终止模型之前终止了求解器?求解器正在使用模型,因此它会收到有关其更改的通知。可能是 model.end() 没有优化,因为它正在一个一个地释放约束,求解器会收到有关每个特定更改的通知,它会更新自己的数据结构等。

换句话说,我认为在 cplex.end() 之前调用 model.end() 可以解决问题。

如果可以,最好在每次求解后调用 env.end()。正如您所注意到的,它更快:一次释放所有资源更容易,因为无需检查是否仍然需要特定资源(例如,多个模型可以使用一个变量)。由于新模型从头开始,并且内存泄漏的风险最小化,因此也更安全。