0

我的程序有问题。我知道在哪里,但我不知道为什么。

这是我的代码:

#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 不能 > pro 吗?

谢谢

4

2 回答 2

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]);
}
于 2013-03-22T05:24:41.180 回答
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,看起来就像您正在阅读矩阵的底行一样。

于 2013-03-22T04:38:15.113 回答