问题描述
我正在尝试使用C ++(Concert Technology)以CPLEX语言编写我的数学模型。当我在编译器窗口中运行代码时,请读取输入并冻结。尝试调试代码时,Visual Studio将以下行显示为断点。
//constraint 2
for (cc = 0; cc < NumberOfCourses; cc++) {
IloExpr Constraint2(env);
for (rr = 0; rr < AvailableRooms; rr++) {
Constraint2 += RoomCapacity[rr] * Y[cc][rr];
mod.add(Constraint2 >= Students[cc]); // this line
Constraint2.end();
}
}
我已经按照以下步骤设置了参数和变量:
double RoomCapacity[AvailableRooms];
double Students[NumberOfCourses];
//Ycr
IloBoolVararray2 Y(env,NumberOfCourses);
for (cc = 0; cc < NumberOfCourses; cc++)
Y[cc] = IloBoolVararray(env,AvailableRooms);
我不明白我的约束出了什么问题!
解决方法
您的代码是错误的:在第一个内部迭代中,将Constraint2
添加到模型中,然后end()
将该变量添加到模型中。因此,在第二次内部迭代中,您正在执行Constraint2 += ...
对象,而Constraint2
对象已被删除。这将导致不确定的行为(挂起,崩溃等)。
我想您想写的是这个(将add()
和end()
拉出内部循环):
for (cc = 0; cc < NumberOfCourses; cc++) {
IloExpr Constraint2(env);
for (rr = 0; rr < AvailableRooms; rr++) {
Constraint2 += RoomCapacity[rr] * Y[cc][rr];
}
mod.add(Constraint2 >= Students[cc]);
Constraint2.end();
}