#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(); }