【问题标题】:CPLEX+JAVA memory issues, retain last found solutionCPLEX+JAVA 内存问题,保留最后找到的解决方案
【发布时间】:2020-05-20 09:47:15
【问题描述】:

我有以下问题:我的 CPLEX 模型遇到内存不足错误 (1001)。这是意料之中的,但我想保留最后一个解决方案(现任和差距,以及所有变量值)。

try {
    if (cplex.solve()) {
         //feasible and ran without memory issues
    } else {
         //infeasible
     }
} catch (IloException e) {
     e.printStackTrace();
     //memory issues end up in here
}​

问题是我在 catch 部分“结束”了,我不能再保留任何变量值、目标函数值等。 是否有解决方法可以帮助我获得最后找到的解决方案? 谢谢!

【问题讨论】:

    标签: java memory cplex


    【解决方案1】:

    而不是

    cplex.solve() 
    

    在尝试中你可以做一个循环

    cplex.setParam(IloCplex.Param.MIP.Limits.Solutions, 1);
    cplex.solve();
    

    然后您将一一获得解决方案。如果你在最后一个崩溃,你将能够拥有上一个。

    【讨论】:

    • 如果其他人尝试实施此解决方案:效果很好,我选择了时间限制和“如果还不是最佳”while (System.nanoTime() - starttime < 7200000000000L && !status.equals("Optimal")) { 的组合,其中状态已使用 cplex.getStatus() 设置。 toString()
    • 还有一个问题,这也可能会影响其他问题:如果起始解决方案是最佳的,那么差距非常高(99.x%)而不是 0。我发现这可以通过让一定要再迭代一次(我通过有一个变量 statusPrev 在状态后达到最佳一次迭代来做到这一点)
    • 还有其他(IMO 更好的)方法可以做到这一点:a)您可以使用 MIPInfoCallback。这经常被调用,您可以从那里捕获可行的解决方案。 b) 您可以使用通用的全局进度回调。这也允许在找到解决方案时捕获它们。 c) 您可以使用参数CPX_PARAM_INTSOLFILEPREFIX 将找到的解决方案写入磁盘。 d) 即使内存不足,即使在 catch 块中,您也几乎总是可以调用 cplex.getValues()。 e) 使用磁盘上的节点文件来完全避免内存不足。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多