линейное программирование — C ++ cplex значение переменной в цикле для

У меня проблема в моей программе. Я знаю где, но я не знаю почему.

Вот мой код:

#include <ilcplex/ilocplex.h>
ILOSTLBEGIN
using namespace std;
typedef IloArray<IloNumArray>    NumMatrix;
typedef IloArray<IloNumVarArray> NumVarMatrix;

int main() {
IloEnv env;
IloInt i, j, k;
IloModel model(env);
IloInt pro = 4;
IloInt empl = 5;

IloNumArray e(env, project, 2, 2, 2, 3);
IloNumArray pr(env, project, 1000, 2000, 500, 1500);

IloNumVarArray p(env, project, 0, 1);
NumVarMatrix x(env, project);

for(k = 0; k < pro; k++) {
x[k] = IloNumVarArray(env, empl+1, 0, 1);
}

for(k = 0; k < pro; k++) {
IloExpr sum_over_i(env);
for(i = 0; i < empl; i++)
sum_over_i += x[i][k];
model.add(sum_over_i >= e[k] * p[k]);
sum_over_i.end();
}

}

Когда pro и empl имеют одинаковое значение или empl меньше, чем pro, все работает. но если empl больше, чем pro, он больше не работает.

У кого-нибудь есть идея, почему empl не может быть> чем профессионалом?

Спасибо

0

Решение

Индексы x во внутреннем цикле поменялись местами. Вы должны ссылаться на x [k] [i], а не на x [i] [k]. В любом случае это не работает, просто происходит сбой, только если у вас есть empl> pro, потому что вы создаете массивы с элементами pro + 1 вместо pro элементы.
Вы можете полностью избежать написания внутреннего цикла, используя IloSum.

for(k = 0; k < pro; k++) {
x[k] = IloNumVarArray(env, empl, 0, 1); // don't add additional elements
}

for(k = 0; k < pro; k++) {
model.add(IloSum(x[k]) >= e[k] * p[k]);
}
0

Другие решения

Я не знаю CPLEX, но я сделаю дикое предположение:

NumVarMatrix x(env, project);

for(k = 0; k < pro; k++) {
x[k] = IloNumVarArray(env, empl+1, 0, 1);
}

...

for(i = 0; i < empl; i++)
sum_over_i += x[i][k];

Поэтому, если empl> pro, это выглядит так, как будто вы читаете за нижним рядом матрицы.

0