首页 > 解决方案 > 一般表达式的 CpxObjective:具有求解二次模型的异常 Cplex

问题描述

我正在尝试将函数最小化为二次函数 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);
}

但我得到了这个我不明白的异常:

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)

感谢您的帮助。

标签: javacplexquadratic-programming

解决方案


据我所知,您对外部循环的第一次迭代会创建类似w[i]^2. 然后外部循环的第二次迭代采用这个表达式并将其平方。从而创建诸如w[i]^2. 这是不支持的。仅支持 1 和 2 的指数(线性和二次目标)。

从你写的,我认为你没有创造你的目标权利。它应该看起来像这样(注意value移动循环中的初始化):

  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);
  }

推荐阅读