我打电话给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..
我做错了什么?
答案 0 :(得分: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
(一般来说,这不是一个好习惯) 。所以我根据手册编辑了我的例子。
答案 1 :(得分:1)
使用结束函数为时过早。
obj.end();
因为您将其作为目标函数添加到模型中。你不应该真正调用.end()函数,除非你正在迭代地创建模型并且内存不足。
如果您使用的是msvc,则应该在调试模式和set a breakpoint下编译,以便在实际抛出异常时停止调试器。 接下来,您应该始终在高级别捕获IloException。在try / catch块中编写函数调用
try {
buildModel():
} catch (const IloException& e)
{
cerr << e;
throw; // if you like
}
答案 2 :(得分:0)
请检查所有数组作为参数传递并且长度超过API中定义的最大容量长度的函数。