【问题标题】:CPLEX: freeing model (resources) takes immense timeCPLEX:释放模型(资源)需要大量时间
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 您的假设是正确的,我没有在调用model.end() 之前结束cplex,因为我不知道这个通知过程。我没有测试过,但我觉得从这个角度来说,调用cplex.clearModel()cplex中解压模型应该也是可以的。
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多