Генерация переменных в Cplex Java API

1

Я впервые использую Java API Cplex, обычно я просто использую GAMS. Я пытаюсь создать переменную x [i] и целевую функцию, которая является умножением x [k] и параметром rl [k], который имеет тип double. Я всегда получаю ошибку, которую я не понимаю. Ниже приведен код:

public void variable() throws IloException{
    int i=0; 
    this.rl = new double [(int)Data.Count+1];  

    IloCplex cplex = new IloCplex();

    IloNumVar[] x = new IloNumVar[Data.Count+1];

        for(int Pnr = 0; Pnr <= Data.PCount; Pnr++)
        {
            if(Data.X[Pnr]==1)
            {
                i++;

              x[i] = cplex.boolVar(); 
              rl[i]=Data.RL[Pnr];

            }
        }

     // Optimization problem
        IloLinearNumExpr obj = cplex.linearNumExpr();

        for(int k=0; k<=i; k++){
            obj.addTerm(x[k], rl[k]); 
        }

        cplex.addMaximize(obj);

    }

и ошибка:

Exception in thread "main" java.lang.NullPointerException
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:115)
at ilog.cplex.CpxObjective.<init>(CpxObjective.java:369)
at ilog.cplex.IloCplexModeler.objective(IloCplexModeler.java:706)
at ilog.cplex.IloCplexModeler.addObjective(IloCplexModeler.java:768)
at ilog.cplex.IloCplexModeler.addMaximize(IloCplexModeler.java:810)
at ObjCplex.report1(ObjCplex.java:52)
at ObjCplex.<init>(ObjCplex.java:20)
at Main104.main(Main104.java:11)
Теги:
variables
nullpointerexception
mathematical-optimization
cplex

1 ответ

0
Лучший ответ

Вы оставляете x [0] неинициализированным из-за ошибки fencepost. В первом цикле for я начинаю с 0, но вы увеличиваете его до того, как используете его в качестве индекса, так что x 1 - это первый элемент x, который не является нулевым. Вам не нужен второй взгляд и он может просто построить выражение obj в первом цикле. Кроме того, он идиоматический для циклов использует строгие <(или ! =) Как критерии продолжения вместо '<='.

Вы можете просто построить выражение obj в первом цикле, избежать двух циклов и не создавать массив x

IloCplex cplex = new IloCplex();
int i = 0;
this.rl = new double [(int)Data.Count+1];  
IloLinearNumExpr obj = cplex.linearNumExpr();
for(int Pnr = 0; Pnr <= Data.PCount; Pnr++)
    {
     if(Data.X[Pnr]==1)
      {
          IloNumVar x = cplex.boolVar(); 
          obj.addTerm(Data.RL[Pnr], x);
          this.rl[i++] = Data.RL[Pnr]; 
        }
    }
cplex.addMaximize(obj);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню