0

我调用 cplex 来解决 Visual Studio 中的优化问题。我的问题很简单:

IloNumVarArray a(env,N,0,IloInfinity);
IloNumVarArray d(env,N,0,IloInfinity);

IloModel Model(env);    
//objective function
IloExpr obj(env);
for(IloInt n=0; n<N;n++)
  obj+=a[n]*c1[n]-d[n]*c2[n];
Model.add(IloMinimize(env,obj));
obj.end();

for(IloInt n=0;n<N;n++){
    Model.add(a[n]==0);
    Model.add(d[n]==0);
}
IloCplex cplex_p(Model);
cplex_p.setParam(IloCplex::EpGap,0.0001);
cplex_p.solve(); 
cplex_p.end();
Model.end();

但每次它给我这个错误信息:

Unhandled exception at 0x74eeb9bc in For-Calling-Cplex.exe: Microsoft C++ exception: IloWrongUsage at memory location 0x0027fbe4..

我做错了什么?

4

2 回答 2

1

根据 C++ 规则,如果程序抛出未被捕获的异常,程序会立即终止(通过std::terminate())。在这种情况下,我们可以看到运行时IloWrongUsage在终止时打印异常 ( ) 的名称。

为了获得有关问题原因的更多详细信息,您应该将代码包装在异常处理程序中并检查异常携带的信息。

例如:

int main(int, char*[])
{
    try
    {
        // your code goes here
    }
    catch ( IloException& e )
    {
        // based on the ILOG CPLEX 10.0 User’s Manual / Languages and APIs / Handling Errors
        std::cout << e << std::endl;
        e.end();
    }
    catch ( ... )
    {
        std::cout << "Unknown exception\n";
    }
}

之后,您将(可能)看到异常的详细信息。谷歌搜索表明这IloWrongUsage意味着某些参数是错误的或类似的东西(我不知道 cplex 是什么)。

UPD我在网上找到了一个 CPLEX 手册,它似乎暗示IloException不继承std::exception(这不是一个好的做法,一般来说)。所以我根据手册编辑了我的例子。

于 2012-09-06T20:44:49.210 回答
1

使用 end 函数为时尚早。

obj.end();

由于您将其作为目标函数添加到模型中。除非您正在迭代创建模型并且内存不足,否则您不应该真正调用 .end() 函数。

如果您使用的是 msvc,则应在调试模式下编译并设置断点以使调试器在实际抛出异常时停止。接下来,您应该始终在较高级别捕获 IloException。在 try/catch 块中编写函数调用

try {
   buildModel():
} catch (const IloException& e)
{
   cerr << e;
   throw; // if you like
}
于 2012-09-06T21:18:28.213 回答