我是使用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]));