CPLEX调试窗口冻结

问题描述

我正在尝试使用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();
   }