我是使用cplex的新手,我尝试在Internet上找到一些信息,但是找不到明确的内容来帮助我解决问题。

我有P [k] k等于1到4

并且我有一个决策变量x [i] [k]必须等于0或1(也p [k])

我在1到5之间

现在我确实喜欢这样

  IloEnv env;
  IloModel model(env);
  IloNumVarArray p(env);
  p.add(IloNumVar(env, 0, 1));
  p.add(IloNumVar(env, 0, 1));
  p.add(IloNumVar(env, 0, 1));
  IloIntVar x(env, 0, 1);

  model.add(IloMaximize(env, 1000 * p[1] + 2000 * p[2] + 500 * p[3] + 1500 * p[4]));

   for(int k = 1; k <= 4; k++){
    for(int i = 1; i <= 5; i++){
      model.add(x[i][k] + x[i][k] + x[i][k] + x[i][k] + x[i][k] => 2 * p[k]; );
    }}

该循环应执行以下操作:

x [1] [1] + x [2] [1] + x [3] [1] + x [4] [1] + x [5] [1] => 2 * p [1];

x [1] [2] + x [2] [2] + x [3] [2] + x [4] [2] + x [5] [2] => 2 * p [2];

x [1] [3] + x [2] [3] + x [3] [3] + x [4] [3] + x [5] [3] => 2 * p [3];

x [1] [4] + x [2] [4] + x [3] [4] + x [4] [4] + x [5] [4] => 3 * p [4];

但是我离这个结果还很遥远。

有人有主意吗?

谢谢

最佳答案

您可能要使用IloNumExpr

for(int k = 0; k < 4; k++){
   IloNumExpr sum_over_i(env);
   for(int i = 0; i < 5; i++){
        sum_over_i += x[i][k];
   }
   model.add(sum_over_i >= 2 * p[k]; );
}

您还需要将x声明为二维数组。
IloArray x(env, 4);
for (int k = 0; k < 4; ++k)
      x[k] = IloIntVarArray(env, 5, 0, 1);

同样,在c++中,数组索引从0到size-1,而不是1到size。你的目标应该写
model.add(IloMaximize(env, 1000 * p[0] + 2000 * p[1] + 500 * p[2] + 1500 * p[3]));

10-06 02:00