私はcplex Java APIを使用しています。大きな配列のCplex NullPointerException
次のコードが使用されます。
は//init cplex
IloCplex cplex = new IloCplex();
cplex.setParam(IloCplex.IntParam.Threads, 1);
//is commodity k,l routed over i and j
//x ijkl
IloIntVar[] x = cplex.boolVarArray(inst.getSize()*inst.getSize()*inst.getSize()*inst.getSize());
for (int i = 0; i < x.length; i++) {
x[i] = cplex.boolVar();
}
//is node a hub
IloIntVar[] y = cplex.boolVarArray(inst.getSize());
for (int i = 0; i < y.length; i++) {
y[i] = cplex.boolVar();
}
//=== FITTNESS FUNCTION ===
IloLinearNumExpr expr = cplex.linearNumExpr();
//first big sum
for(int k=0;k<inst.getSize();k++){
for(int i=0;i<inst.getSize();i++) {
for(int j=0;j<inst.getSize();j++) {
for(int l=0;l<inst.getSize();l++) {
expr.addTerm(c[i][j][k][l], x[Static.quadToLinear(i, j, k, l, inst.getSize())]);
}
}
}
}
//second sum
for(int i=0;i<inst.getSize();i++) {
expr.addTerm(inst.getFixed(i), y[i]);
}
//minimise it
cplex.addMinimize(expr);
だから私はちょうど2つのブールベクトルxとyを使用しています。このスニペットは、inst.getSize()が25などの小規模のインスタンスではうまく動作します。ただし、サイズが40のインスタンスの場合は、最後の行でクラッシュします。
Exception in thread "main" java.lang.NullPointerException
at ilog.cplex.CpxNumVar.unmark(CpxNumVar.java:296)
at ilog.cplex.CpxLinearExpr.unmarkVars(CpxLinearExpr.java:402)
at ilog.cplex.CpxLinearExpr.removeDuplicates(CpxLinearExpr.java:515)
at ilog.cplex.CpxLinearExpr.removeDuplicates(CpxLinearExpr.java:489)
at ilog.cplex.CpxObjective.setExpr(CpxObjective.java:108)
at ilog.cplex.CpxObjective.<init>(CpxObjective.java:362)
at ilog.cplex.IloCplexModeler.objective(IloCplexModeler.java:706)
at ilog.cplex.IloCplexModeler.addObjective(IloCplexModeler.java:768)
at ilog.cplex.IloCplexModeler.addMinimize(IloCplexModeler.java:790)
at ExactSolver.main(ExactSolver.java:69)
アイデアはありますか?私はそれはあなたが作成...
私はJava APIに精通していませんが、.net APIのcplex.BoolVarArray()はブール変数を作成してモデルに追加しています。 cplex.boolvarを呼び出すと、別のブール変数を作成できます。つまり、ループの最初の2つは必要ありません。 – willem
サイドノートでは、モデルに制約がないことを認識していますか?私はあなたが後でそれらを追加する予定だと思いますか? – willem
@willem、でも、それらは衝突しないでください。 – Stasik