java - Cplex Java API 中变量的生成

标签 java variables nullpointerexception mathematical-optimization cplex

我是第一次使用 Cplex Java API,通常我只使用 GAMS。我正在尝试生成 x[i] 变量和一个目标函数,该目标函数是 x[k] 和 double 类型参数 rl[k] 的乘积。我总是收到一个我不理解的错误。代码如下:

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)

最佳答案

由于 fencepost error,您将 x[0] 保留为未初始化状态。 。在你的第一个 for 循环中, i 开始是 0,但是你在将它用作索引之前递增它,所以 x 1是 x 的第一个不为空的元素。您不需要再看一遍,只需在第一个循环中构建 obj 表达式即可。此外,for 循环的惯用做法是使用严格的 < (或 != )作为继续条件而不是 '<='。

您可以在第一个循环中构建 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);

关于java - Cplex Java API 中变量的生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22984871/

相关文章:

java - 如何在 java 中查找 char 的 ansi 值?

java - 如何在Java中正确组织和嵌套包

python - 使用变量作为函数名和字符串

javascript - JavaScript中变量的范围是什么?

java - 在此示例中如何返回 Point

安卓 java.lang.RuntimeException : Unable to instantiate activity ComponentInfo . .. java.lang.NullPointerException

java - 我如何在ruby中调用java类

java - Java中的字 rune 字?

java - 使变量可以被所有方法访问

Java:一元 if - npe