Окно отладки CPLEX зависает

#c #cplex

Вопрос:

Я пытаюсь закодировать свою математическую модель на языке CPLEX, используя C (технология Concert). когда я запускаю свой код в окне компилятора, считывайте мои входные данные и зависайте. при попытке отладки моего кода visual studio показывает следующую строку в качестве точки останова.

 //constraint 2 for (cc = 0; cc lt; NumberOfCourses; cc  ) {  IloExpr Constraint2(env);  for (rr = 0; rr lt; AvailableRooms; rr  ) {  Constraint2  = RoomCapacity[rr] * Y[cc][rr];  mod.add(Constraint2 gt;= Students[cc]); // this line  Constraint2.end();  } }  

я настроил параметры и переменные следующим образом:

 double RoomCapacity[AvailableRooms]; double Students[NumberOfCourses];  //Ycr IloBoolVarArray2 Y(env, NumberOfCourses); for (cc = 0; cc lt; NumberOfCourses; cc  )  Y[cc] = IloBoolVarArray(env, AvailableRooms);  

Я не понимаю, что не так с моим ограничением!

Комментарии:

1. Не могли бы вы печатать rr и cc значения после каждой итерации? Или это происходит во время первой итерации?

2. я думаю, что это не проходит через итерацию

3. Не могли бы вы включить трассировку стека, когда она зависает? И, кстати, у вас есть эта библиотека CPLEX в отладке?

4. Я думаю, что я не настолько профессионален в терминологии. Что вы подразумеваете под трассировкой стека? Я не понимаю вашего второго вопроса. Я создал среду cplex в начале своего кода.

Ответ №1:

Ваш код неверен: на самой первой внутренней итерации вы добавляете Constraint2 в свою модель, а затем end() эту переменную. Таким образом, во второй внутренней итерации вы выполняете Constraint2 = ... , пока Constraint2 объект уже был удален. Это приведет к неопределенному поведению (зависание, сбой, …).

Я предполагаю, что вы хотели написать вот что (вытащить add() и end() выйти из внутреннего цикла):

 for (cc = 0; cc lt; NumberOfCourses; cc  ) {  IloExpr Constraint2(env);  for (rr = 0; rr lt; AvailableRooms; rr  ) {  Constraint2  = RoomCapacity[rr] * Y[cc][rr];  }  mod.add(Constraint2 gt;= Students[cc]);  Constraint2.end();  }