2013-03-22 169 views
0

我在程序中遇到了問題。我知道在哪裏,但我不知道爲什麼。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(); 
} 

} 

當親和empl的是相同的值或empl的小於親的一切工作。但是如果empl超過pro,它就不再起作用了。

有沒有人有一個想法,爲什麼empl不能比親?

感謝

回答

0

內部循環中x的索引是相反的。你應該引用x [k] [i]而不是x [i] [k]。它不會以任何方式工作,只是因爲您正在使用pro + 1元素而不是pro元素創建陣列,所以只有在您擁有empl> 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>親,這很大程度似乎如果你正在看過去矩陣的底行。