循环中变量的复数值

C++ cplex value of variable in loop for

本文关键字:变量 循环      更新时间:2023-10-16

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

下面是我的代码:
#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?

谢谢

内循环中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]);
}

我不知道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,它看起来就像是你在阅读矩阵的最后一行