我的程序出了问题。我知道在哪里,但我不知道为什么。
这是我的代码:
#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不能&gt;比亲?
由于
答案 0 :(得分: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&gt;亲,它看起来非常像是在阅读矩阵的底行。
答案 1 :(得分:0)
内循环中x的索引是相反的。你应该引用x [k] [i]而不是x [i] [k]。它无论如何都不起作用,只是当你有empl&gt;它才会崩溃。亲,因为您正在使用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]);
}