Java 通用表达式的CpxObjective:带求解二次模型的异常Cplex

Java 通用表达式的CpxObjective:带求解二次模型的异常Cplex,java,cplex,quadratic-programming,Java,Cplex,Quadratic Programming,我试图最小化函数a二次函数sum(sum(w*a)-v)^2 是“a”方形阵列和“w”和“v”两个向量。“a”和“v”是已知的,“w”是未知的。我正在Java中使用CPLEX double [][] input = {{1,2},{3,4}}; double[] result = {3,2}; //define new model IloCplex cplex = new IloCplex(); // variables IloNumVar[] w = new IloNumVar[inpu

我试图最小化函数a二次函数sum(sum(w*a)-v)^2

是“a”方形阵列和“w”和“v”两个向量。“a”和“v”是已知的,“w”是未知的。我正在Java中使用CPLEX

double [][] input =  {{1,2},{3,4}};
double[] result = {3,2};

//define new model
IloCplex cplex = new IloCplex();

// variables
IloNumVar[] w = new IloNumVar[input[0].length];
for (int i = 0; i < w.length; i++) {
    w[i] = cplex.numVar(0.0, 1.0, IloNumVarType.Float);
}           

IloNumExpr value = cplex.numExpr();
IloNumExpr objective = cplex.numExpr();

for (int i = 0; i < result.length; i++) {

    for (int j = 0; j < result.length; j++) {
        value = cplex.sum(value, cplex.prod(input[i][j], w[i]));
    }
    value = cplex.diff(value, result[i]);
    value = cplex.square(value);

    objective = cplex.sum(objective, value);
}
double[]input={{1,2},{3,4};
double[]result={3,2};
//定义新模型
IloCplex cplex=新的IloCplex();
//变数
IloNumVar[]w=新的IloNumVar[输入[0]。长度];
对于(int i=0;i
但我有一个例外,我不明白:

Exception in thread "main" java.lang.UnsupportedOperationException: CpxObjective for general expressions
at ilog.cplex.CpxObjective.setExpr(CpxObjective.java:102)
at ilog.cplex.CpxObjective.<init>(CpxObjective.java:357)
at ilog.cplex.IloCplexModeler.objective(IloCplexModeler.java:796)
at ilog.cplex.IloCplexModeler.minimize(IloCplexModeler.java:714)
at ilog.cplex.IloCplexModeler.minimize(IloCplexModeler.java:810)
at Tont.main(Tont.java:55)
线程“main”java.lang.UnsupportedOperationException中的异常:用于常规表达式的CpxObjective 位于ilog.cplex.CpxObjective.setExpr(CpxObjective.java:102) 位于ilog.cplex.CpxObjective。(CpxObjective.java:357) 位于ilog.cplex.IloCplexModeler.objective(IloCplexModeler.java:796) 在ilog.cplex.IloCplexModeler.minimize(IloCplexModeler.java:714) 位于ilog.cplex.IloCplexModeler.minimize(IloCplexModeler.java:810) 在Tont.main(Tont.java:55)

谢谢您的帮助。

据我所知,您的第一次外循环迭代创建了类似于
w[I]^2
的术语。然后,外部循环的第二次迭代采用该表达式并将其平方。因此创建了类似于
w[i]^2
的术语。这是不受支持的。仅支持1和2的指数(线性和二次目标)

从你所写的,我认为你没有创造你的客观权利。它应该是这样的(注意
value
的初始化被移动到循环中):

for(int i=0;i
这是完整的代码,但不可行。是否因为Cplex无法解决此类问题

double [][] input =  {{1,2},{3,4}};
double[] result = {3,2};

// define new model
IloCplex cplex = new IloCplex();

//cplex.setParam(IloCplex.Param.RootAlgorithm, IloCplex.Algorithm.Auto);

// variables
IloNumVar[] w = cplex.numVarArray(input[0].length, 0, Float.MAX_VALUE);// new IloNumVar[input[0].length];
for (int i = 0; i < w.length; i++) {
    w[i] = cplex.numVar(0.0, 1.0, IloNumVarType.Float);
}           

//IloNumExpr value = cplex.numExpr();
IloNumExpr objective = cplex.numExpr();


  for (int i = 0; i < result.length; i++) {
         IloNumExpr value = cplex.numExpr();
         for (int j = 0; j < result.length; j++) {
            value = cplex.sum(value, cplex.prod(input[i][j], w[i]));
         }
         value = cplex.diff(value, result[i]);
         value = cplex.square(value);

         objective = cplex.sum(objective, value);
      }



cplex.minimize(objective);
//constraints
IloLinearNumExpr weightsAdded = cplex.linearNumExpr();
for (int j = 0; j < w.length; j++) {
    weightsAdded.addTerm(1, w[j]);
}
cplex.addEq(weightsAdded, 1);       

for (int i = 0; i < w.length; i++) {
    cplex.addGe(0, w[i]);
}

// solve model
if (cplex.solve()) {
    System.out.println("obj = "+cplex.getObjValue());
}
else {
    System.out.println("problem not solved");
double[]input={{1,2},{3,4};
double[]result={3,2};
//定义新模型
IloCplex cplex=新的IloCplex();
//setParam(IloCplex.Param.RootAlgorithm,IloCplex.Algorithm.Auto);
//变数
IloNumVar[]w=cplex.numvarray(输入[0]。长度,0,浮点。最大值);//新的IloNumVar[input[0].length];
对于(int i=0;i

谢谢

谢谢,我认为你是对的,但现在我得到了:不可行行“c1”:0=1。预解时间=0.00秒。(0.00滴答声)问题未解决。你知道这可能是什么吗?这个问题无法解决?很抱歉,我犯了一个错误,试图修改你以前的代码
double [][] input =  {{1,2},{3,4}};
double[] result = {3,2};

// define new model
IloCplex cplex = new IloCplex();

//cplex.setParam(IloCplex.Param.RootAlgorithm, IloCplex.Algorithm.Auto);

// variables
IloNumVar[] w = cplex.numVarArray(input[0].length, 0, Float.MAX_VALUE);// new IloNumVar[input[0].length];
for (int i = 0; i < w.length; i++) {
    w[i] = cplex.numVar(0.0, 1.0, IloNumVarType.Float);
}           

//IloNumExpr value = cplex.numExpr();
IloNumExpr objective = cplex.numExpr();


  for (int i = 0; i < result.length; i++) {
         IloNumExpr value = cplex.numExpr();
         for (int j = 0; j < result.length; j++) {
            value = cplex.sum(value, cplex.prod(input[i][j], w[i]));
         }
         value = cplex.diff(value, result[i]);
         value = cplex.square(value);

         objective = cplex.sum(objective, value);
      }



cplex.minimize(objective);
//constraints
IloLinearNumExpr weightsAdded = cplex.linearNumExpr();
for (int j = 0; j < w.length; j++) {
    weightsAdded.addTerm(1, w[j]);
}
cplex.addEq(weightsAdded, 1);       

for (int i = 0; i < w.length; i++) {
    cplex.addGe(0, w[i]);
}

// solve model
if (cplex.solve()) {
    System.out.println("obj = "+cplex.getObjValue());
}
else {
    System.out.println("problem not solved");