Ошибка необработанного исключения

Я звоню 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

Решение

Использование конечной функции преждевременно.

obj.end();

Так как вы добавили его в модель в качестве целевой функции. Вы не должны действительно вызывать функции .end (), если вы не делаете итеративно создающие модели и не хватает памяти.

Если вы используете msvc, вы должны скомпилировать в режиме отладки и установить точку останова сделать остановку отладчика, когда исключение фактически выдается.
Далее вы всегда должны ловить IloException на высоком уровне. Напишите ваш вызов функции в блоке try / catch

try {
buildModel():
} catch (const IloException& e)
{
cerr << e;
throw; // if you like
}
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";
}
}

После этого вы (вероятно) увидите подробности исключения. Google показывает, что IloWrongUsage означает, что некоторые параметры неверны или что-то в этом роде (я понятия не имею, что такое cplex).

UPD Я нашел руководство по CPLEX в Сети, и это, кажется, подразумевает, что IloException не наследует std::exception (что не очень хорошая практика, вообще говоря). Поэтому я отредактировал мой пример в соответствии с руководством.

1