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

CPLEX: freeing model (resources) takes immense time

我正在求解 MIP 并构建了相应的 CPLEX IloModel。我的实现遵循以下伪代码:

model = IloModel( env );

//Build optimization model

//Configure CPLEX Solver

//Solve model

//Do some solution-statistics

model.end();

一切正常,我得到了正确的解决方案,等等。现在,我想按顺序自动解决很多不同的实例。

然而,这里我 运行 遇到了一个问题:我的实例越大,使用 model.end() 释放资源所需的时间就越长。对于我的小型实例(使用最多 500 MB 的 RAM),它已经花费了几十分钟,对于中型实例(使用最多 2 GB 的 RAM),它需要几个小时,而且我从未测量过我的大型实例(使用最多 RAM)需要多长时间32 GB 的 RAM),因为我总是在等待一整夜没有完成后手动终止进程。因此,释放资源比构建模型或使用我指定的时间限制解决它花费的时间要长得多。 model.end() 运行时,CPU 使用率始终保持在大约 100%。

这是预期的行为吗?我在实施我的模型时是否遗漏了一些东西,或者如何释放耗费大量时间的资源?

我真的很想通过在指定的时间阈值后终止 CPLEX 求解进程来避免按顺序自动求解多个实例。

谢谢!

编辑: 我可以通过 运行 env.end()(即使对于大型模型也需要 <1s)而不是 model.end() 来绕过这个问题。因为我现在不重用环境,所以这对我来说没问题。但是,我想知道这里发生了什么,根据我从 docs 收集到的信息,释放为模型分配的资源是释放整个环境的子过程。

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

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

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