如何在C++上添加SOCP约束而不漏内存?

问题描述 投票:0回答:1

我以前在这里以 "增加循环中的求解时间 "的方式问过这个问题。https:/www.ibm.comdeveloperworkscommunityforumshtmltopic?id=0ef4c99b-3bcc-4105-ac98-57867d5427da 但目前论坛无法使用。

后来,我意识到二次元、二阶锥体编程约束会产生内存泄漏。下面是代码的总结版本(源码和头绪可以在上面的论坛链接中找到)。

#include <header.h>
int main() {
 const int n = 10;
 const int ins = 30;
 // Parameters are read

 for (int i = 0; i < ins; i++) {
   IloEnv env;
   IloModel model(env);
   IloNumVarArray d(env, n + 1, 0, IloInfinity, ILOFLOAT);
   IloNumVarArray A(env, n + 1, -IloInfinity, IloInfinity, ILOFLOAT);
   IloNumVarArray C(env, n + 1, -IloInfinity, IloInfinity, ILOFLOAT);
   // Other variables are defined
   model.add((d[1] * d[1]) >= (A[1] * A[1]) + (C[1] * C[1])); // SOCP constraint 1
   model.add((d[2] * d[2]) >= (A[2] * A[2]) + (C[2] * C[2])); // SOCP constraint 2
   // Linear constraints are added according to the parameters of the instance
   // Solve method of IloCplex is called and outputs are collected
   env.end();
 }
}

当这段代码被执行时,解算时间随着下列因素的增加而增加 i 和Visual Studio的内存使用工具显示,每个循环都有内存泄漏。如果将SOCP约束条件注释掉,内存泄漏就会消失。奇怪的是,如果只添加了其中的一个SOCP约束,无论是1还是2,内存都不会泄漏。只有在同时添加两个(或更多其他SOCP约束)时才会泄漏。

请问我的方法是否有问题,如何添加这些二次约束?

谢谢你。

编辑:要重现文件,你可以使用以下链接。https:/drive.google.comopen?id=1AAPaSUhGwdGZ15c3MEb0atRQsrAel-mJ。. 它包括头,源和输入。

c++ memory-leaks cplex
1个回答
0
投票

这个问题是 部分 通过将CPLEX转换为GUROBI解决了这一问题。显然,输入的数值有一些问题,GUROBI将其报告为警告,这可能是CPLEX中类似实例时间增加的原因。经过几次优化参数的修改,在GUROBI中连续实例的时间没有增加,模型就成功求解了。但我想说的是,即使在数值问题上,GUROBI仍然能够提供次优结果,即使在这些问题上,也没有增加连续实例的时间。

此外,我想补充的是,有人建议我修改MKL_DISABLE_FAST_MM = 0,这是我在CPLEX中提到的一些类似问题的解决方案。然而,这并没有解决我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.