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[i][k]ではなくx[k][i]を参照する必要があります。どちらの方法でも機能しません。要素の代わりにpro+1要素を使用して配列を作成しているため、empl>proがある場合にのみクラッシュします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 に答える