【问题标题】:CpxObjective for general expressions: Exception Cplex with solve quadratic model一般表达式的 CpxObjective:具有求解二次模型的异常 Cplex
【发布时间】:2020-04-26 21:10:52
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

    标签: java cplex quadratic-programming


    【解决方案1】:

    据我所知,您对外部循环的第一次迭代会创建像 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);
      }
    

    【讨论】:

    • 谢谢,我认为你是对的,但现在我得到了:不可行行 'c1':0 = 1。预求解时间 = 0.00 秒。 (0.00 滴答声)问题未解决 你知道这可能是什么吗?这个问题解决不了?
    • 对不起,我弄错了,试图修改你之前的代码
    【解决方案2】:

    这是完整的代码,但它是不可行的。是因为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");
    

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      相关资源
      最近更新 更多