0

私はcplex Java APIを使用しています。

次のコードが使用されます。

//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)

何かアイデアはありますか?私はそれを働かせる必要があります...

4

2 に答える 2

1

Well after some trial and errors i found out that this is a kind of a memory issue.

Adding sufficient heapspace to JVM e.g. -Xms512M -Xmx750M solves the problem and lets the program to run as expected.

于 2012-05-14T19:23:35.083 に答える
0

を呼び出して、ブール変数を作成してモデルに追加します。

IloIntVar[] x = cplex.boolVarArray
    (inst.getSize()*inst.getSize()*inst.getSize()*inst.getSize());

次に、次を呼び出して新しい変数を定式化に追加します

x[i] = cplex.boolVar();

しかし、それらへの参照はもうありませんが、古い変数はまだ定式化されています。これは問題を引き起こす可能性があり、間違いなくあなたが望むものではありません. Javaでこれを適切に行う方法はわかりませんが、.netではどちらかを行います

IIntvar[] x = new IIntvar[size];
for (int i = 0; i < x.length; i++) {
    x[i] = cplex.boolVar();
}

また

IIntVar[] x=  cplex.BoolVarArray(size);
//No for loop!

(IIntVar は Java IloIntVar の .net バリアントです)。y についても同じです。最初の 2 つの for ループをコメントアウトしてみて、エラーがどうなるかを確認してください。

于 2012-05-14T16:36:23.910 に答える